基于 QEMU 使用 Embassy
Embassy 是一个基于 Rust 语言,为嵌入式系统开发设计的异步运行时库,其官方文档《Embassy Book》中给出的所有示例都是基于真实的物理环境,没有任何基于模拟器的内容。
事实上,也很少有相关的工作基于 QEMU 使用 Embassy。确实,几十或者一百多块钱就能买到很好的开发板,而且商家还提供了很好的售后服务和工具链支持,这可比自己折腾模拟器要舒适多了。
话虽如此,但还是有一些理由让我们选择使用模拟器来做嵌入式的开发。这篇文章的主要目的就是整理和总结一些基于 QEMU 使用 Embassy 的过程中可能用到的资料和工具链。
Rust 嵌入式开发的入门资料:《The Embedded Rust Book》,以及它的中文版本:《嵌入式 Rust 之书》
QEMU 官方支持模拟部分的开发板:QEMU System Emulator Targets
官方 QEMU 的优点是最稳定,各种体系的处理器的仿真都支持。但 QEMU 的主要目标是支持高性能处理器的模拟仿真,单片机支持型号较少,而且最主要的问题是缺少了很多外围设备,而这些外围设备在 Embassy 的使用过程中可能是必须的,可以参考《使用 QEMU 运行 Embassy 示例》。总结起来,Embassy 程序会有一个 boot 过程检查并初始化目标开发板中的一些外围设备,如果缺失这些外围设备的话,程序就会陷入一个无止尽的循环中。以 embassy 中 examples/stm32f1
项目下的 blinky.rs
为例,第 12 行代码:
1 | let p = embassy_stm32::init(Default::default()); |
即进行了芯片和外围设备的初始化工作。
因为 QEMU 本身是开源的,所以除 QEMU 官方外,很多第三方扩展支持了更多的开发板,有的支持了更多的外围设备仿真:
xPack QEMU Arm,缺点是只支持 stm32,且在 2022 年宣布可能后续被移除,不再被推荐使用,而且有些选项是独有的,和官方不兼容;
qemu_stm32,暂时没有更多的尝试,可能是一个比较好的选择;
sdk-debugger-qemu,这是一个国产开源嵌入式系统 RT-Thread 生态里的一个 QEMU 版本,它只是增加了几个芯片的支持,看起来不是一个很好的选择。