基于 QEMU 使用 Embassy

Embassy 是一个基于 Rust 语言,为嵌入式系统开发设计的异步运行时库,其官方文档《Embassy Book》中给出的所有示例都是基于真实的物理环境,没有任何基于模拟器的内容。

事实上,也很少有相关的工作基于 QEMU 使用 Embassy。确实,几十或者一百多块钱就能买到很好的开发板,而且商家还提供了很好的售后服务和工具链支持,这可比自己折腾模拟器要舒适多了。

话虽如此,但还是有一些理由让我们选择使用模拟器来做嵌入式的开发。这篇文章的主要目的就是整理和总结一些基于 QEMU 使用 Embassy 的过程中可能用到的资料和工具链。

官方 QEMU 的优点是最稳定,各种体系的处理器的仿真都支持。但 QEMU 的主要目标是支持高性能处理器的模拟仿真,单片机支持型号较少,而且最主要的问题是缺少了很多外围设备,而这些外围设备在 Embassy 的使用过程中可能是必须的,可以参考《使用 QEMU 运行 Embassy 示例》。总结起来,Embassy 程序会有一个 boot 过程检查并初始化目标开发板中的一些外围设备,如果缺失这些外围设备的话,程序就会陷入一个无止尽的循环中。以 embassyexamples/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 版本,它只是增加了几个芯片的支持,看起来不是一个很好的选择。