qemu是github开源的,因此有兴趣的可以自己去改造它增加新的仿真功能,比如支持更多的处理器,更多的外设等。由于windows上自己编译源码,好像有点麻烦,这里就直接找现成的exe。主要3个地方有这样的exe。它们都是修改了官方qemu的源码编译而来。
官方提供了qemu的exe安装包
直接去官网下载即可。Download QEMU - QEMU
优点:最稳定,各种体系的处理器的仿真都支持,但是主要为了支持能跑Linux这样的高性能处理器的模拟仿真
缺点:对于单片机这样的低性能处理器支持得不好,型号支持较少
为eclipse做插件的qemu的exe文件
去这儿下载 https://github.com/xpack-dev-tools/qemu-arm-xpack/releases/
优点:由于官方qemu对stm32这些单片机型号支持太少了,这个就是特地对stm32等单片机大量支持了
缺点:把官方qemu阉割得只支持stm32了,而且有些命令是独有的,和官方qemu不兼容了,比如--board
国产开源嵌入式系统RT-Thread的生态里的exe文件
官网 RT-Thread, RTOS, 物联网操作系统 - RT-Thread物联网操作系统
下载它们的集成开发环境 RT-Thread Studio(这个IDE做得真不错),该IDE会以sdk形式包含qemu.exe。支持arm a9板子的qemu仿真,和stm32f4芯片的qemu仿真。而这个qemu.exe就是它们修改了官方qemu的源码,支持了几款stm32f4芯片后编译得到的exe。不通过IDE,那么这个exe单独下载地址在这儿 RT-Thread-Studio-Mirror/sdk-debugger-qemu
优点:由于官方qemu对stm32这些单片机型号支持太少了,这个就是增加了对stm32f4几款单片机(不是板级,而是芯片级,创建工程时候千万注意别搞错了)的支持
缺点:只增加支持了stm32f4几款板子,希望以后进一步增加对stm32f1等的支持
如下图,确实增加了这几款常用的stm32:

总结:
由于官方提供的qemu对stm32支持不好,而eclipse插件版的qemu只支持stm32,都不是很好的选择,所以我们这里选择RT-Thread的生态里qemu。
创建a9或者stm32f4的一个程序,且控制台输出程序中的打印字符串的方法如下:
1. 打开RT-Thread Studio,看看SDK管理器,安装如下几个:
- 安装QEMU-VEXPRESS-A9(其实就是下载一个模板例程)
- 安装芯片支持包STM32F4(这里不用安装针对板级的stm32f4,因为这里的qemu对stm32f4只实现了芯片级仿真)
- 安装仿真支持包QEMU(也就是说QEMU和J-Link硬件调试器同等地位,也就是cpu的仿真,不能对板子仿真)
1. stm32f4程序仿真
创建一个通用项目(这个就是裸机工程),一定要选择基于芯片(否则仿真时候控制台输出不了程序中的打印信息,而且时不时启动失败(f407能qemu成功调试,但是输出不了信息,f407根本就不能qemu成功启动和调试))(虽然基于开发板也能选择f401板子对应的qemu仿真,但是这个确实仿真不了,别被误导了,能板级仿真的只有a9),下面的调试器选择QEMU,模拟器会自动选择正点原子的stm32f407-atk-explore板子(这里模拟器为什么能自动选择这个呢,因为我们刚刚下载的RT-Thread的生态里qemu就是支持了这几款板子,所以IDE会找最匹配的直接给填上了)。我直接把这个工程编译出来的elf文件通过stlink下载到我实际板子上,串口完全正常的输出的,这也说明这个qemu把stm32f407芯片内核模拟跟真实芯片一致的了,和真实芯片的底层代码完全相通的。
创建完工程后,就得到了stm32f407ZG这个单片机的最简单的裸机程序(main函数仅仅包含了打印)(因此,以此类推,我们想要获得其它单片机的裸机程序,也是通过RT-Thread Studio这样即可,所以这个IDE做得还真不错,省得自己到处去找这些裸机程序了),直接点击构建,默认项目配置如下,不用任何修改
然后点击下载,即可看到qemu中运行的这个程序,控制台输出了程序中的打印信息。
其实认真看,我们会发现IDE其实就是给qemu发送了命令,实现的运行仿真:
C:/RT-ThreadStudio//repo/Extract/Debugger_Support_Packages/RealThread/QEMU/4.2.0.4/qemu-system-arm.exe -M stm32f407-atk-explorer -nographic -kernel Debug/rtthread.bin
-M:指定模拟哪个目标板,这个一定得是qemu支持的,否则会提示错误。从上面我们可以知道,RT-Thread的生态里qemu是支持了这个stm32f407-atk-explorer板子的了
-nographic:告诉qemu无界面启动(因为默认有一个类似VMware那样的界面),这个非常重要,这样程序中串口打印信息(printf)才能输出到控制台来,否则不会有任何输出。(qemu help的解释:-nographic disable graphical output and redirect serial I/Os to console),所以我们别去调用什么-serial stdio啥的命令,否则也不会输出。
-kernel:指定程序镜像文件,这个可以是bin文件,elf文件(含有调试信息)都可以
如果是调试仿真,则命令如下:
C:/RT-ThreadStudio//repo/Extract/Debugger_Support_Packages/RealThread/QEMU/4.2.0.4/qemu-system-arm.exe -M stm32
f407-atk-explorer -nographic -S -s -kernel Debug/rtthread.elf
-S:代表不自动运行模拟(需要gdb连接之后进行操作)
-s:代表开放tcp1234作为远程调试端口
这些选项的解释,我们可以输入qemu-system-arm.exe -help进行查看,如下(全部选项都有解释,如果没有,说明该选项不存在,使用了就会报错的):
此外,其实我们不用IDE,自己通过命令行窗口,其实也可以实现这样下载运行,如下(按crtl+c可以结束qemu仿真):
这里我把整个工程包含qemu-system-arm.exe这个打成一个压缩包上传了(因为里面有makefile的,所以不需要IDE,也能自己编译和运行了)
2. arm cortex-a9程序仿真
我们发现这个IDE里不能创建a9的裸机工程,只有带了rtthread这个OS的工程,这也没关系,因为OS的代码不多,简单易懂,自己认真看一下就能知道启动过程,所以跟裸机工程也差不多。
这里我们创建RT-Thread项目,这里要选择基于开发板,因为rtthread的qemu支持这块a9板子的板级仿真(官方qemu本身就支持这个的),而前面的stm32都是不能板级仿真的(只能基于芯片)。
然后,与上面步骤一样,配置工程保持默认,构建,下载即可运行
其实,通过命令的话,下载运行命令如下:
C:/RT-ThreadStudio/repo/Extract/Debugger_Support_Packages/RealThread/QEMU/4.2.0.4/qemu-system-arm.exe -M vexpresress-a9 --kernel Debug/rtthread.bin -nographic -show-cursor
-show-cursor:显示光标
调试运行命令如下:
C:/RT-ThreadStudio/repo/Extract/Debugger_Support_Packages/RealThread/QEMU/4.2.0.4/qemu-system-arm.exe -M vexp
ress-a9 --kernel Debug/rtthread.elf -nographic -show-cursor -S -s
这里我把整个工程包含qemu-system-arm.exe(这个exe换成qemu官方的也是ok的,因为官方qemu原本就支持这个板子了)这个打成一个压缩包上传了(因为里面有makefile的,所以不需要IDE,也能自己编译和运行了),大家可以去这里下载