异步 Rust 与实时操作系统的对决! - 博客 - 第二轮

这是一篇关于嵌入式异步 Rust 与 FreeRTOS/C 在 STM32F446 微控制器上对比的技术博客文章。

  • Async Rust:Rust 中的异步函数是返回一个未来的函数的语法糖。未来是懒的,只有在被轮询时才运行。Rust 有Wakers来通知执行器一个未来应该再次被轮询。在Embassy中,任务必须静态分配,需要 nightly 编译器,且不能使用装箱的 trait 对象。Embassy为许多外设提供了异步接口,其使用的机制是创建新的未来并在中断时唤醒相应的任务,实现协作式多任务。
  • RTOS:实时操作系统将所有任务分成独立的线程,线程运行普通代码,需要保存和恢复处理器上下文,适合抢占式线程,能保证公平执行时间和可预测的事件响应时间。
  • 对比测试:测试了相同程序在异步 Rust 和 RTOS 下的性能、中断处理延迟、程序大小、静态内存使用和编程难易度。预期 RTOS 在性能和中断处理延迟上更优,Rust 在程序大小和静态内存使用上更优,编程难易度上异步模型更好。
  • 测试结果:在所有测试项中,Embassy/Rust 都表现更好,包括中断时间、线程时间、中断延迟、程序大小和静态内存大小。但在中断结束到线程唤醒的时间上,FreeRTOS/C 稍快。在 RTIC 实现的测试中,RTIC 在中断时间和中断延迟上表现出色,程序大小和静态内存大小也有优势。
  • 结论:Embassy/Rust 在编程体验和性能上都更优,虽然异步任务不能被抢占,但Embassy允许使用额外的中断上下文执行器来解决这个问题。同时感谢了Embassy的创建者和相关人员的反馈。

编辑部分指出之前 C 项目中开启了堆导致静态内存大小计算有误,但结论不变。RTIC 是一个完全中断驱动的运行时,在一些方面表现优秀,是手动实现中断的改进。最后提到了 Rust Embedded Working Group Logo 的设计者。

阅读 25
0 条评论