关于windows上使用qemu分别仿真stm32和a9以及串口输出
现在开始进入主题~(这里我都是在windows系统上进行的)qemu是github开源的,因此有兴趣的可以自己去改造它增加新的仿真功能,比如支持更多的处理器,更多的外设等。由于windows上自己编译源码,好像有点麻烦,这里就直接找现成的exe。主要3个地方有这样的exe。......................................................
看本博客之前,请先看我这个qemu入门博客:
qemu的详细资料大全(入门必看!!!)_标biao的博客-CSDN博客
再看我这个初步实践博客(没有用到串口输出):
windows上运行qemu仿真stm32板子a9板子实例_标biao的博客-CSDN博客
再看我这个arm处理器裸机进阶博客:
arm cortex-a9的qemu仿真与启动文件解释_标biao的博客-CSDN博客
现在开始进入主题~(这里我都是在windows系统上进行的)
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(不对,这里要用bin文件,看我这篇博客gdb连接qemu调试stm32程序_标biao的博客-CSDN博客)
-S:代表不自动运行模拟(需要gdb连接之后进行操作)
-s:代表开放tcp1234作为远程调试端口
这些选项的解释,我们可以输入qemu-system-arm.exe -help进行查看,如下(全部选项都有解释,如果没有,说明该选项不存在,使用了就会报错的):
此外,其实我们不用IDE,自己通过命令行窗口,其实也可以实现这样下载运行,如下(按crtl+c可以结束qemu仿真):

这里我把整个工程包含qemu-system-arm.exe这个打成一个压缩包上传了(因为里面有makefile的,所以不需要IDE,也能自己编译和运行了),大家可以去这里下载 stm32f407裸机程序在windows的qemu上跑-OS文档类资源-CSDN下载
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,也能自己编译和运行了),大家可以去这里下载 armcortex-a9程序在windows的qemu上跑-OS文档类资源-CSDN下载
总结:
自己想玩qemu,我们就选择RT-Thread的生态里qemu吧(而且rtthread的IDE也很好用,方便的生成各种处理器的模板工程),不仅支持官方qemu的所有板子,还能支持芯片级stm32f4,比较好。或者自己花时间去改一下官方qemu的源码,支持想要的stm32芯片也行。
注:官方qume,虽然也支持几款stm32的板子,比如 netduinoplus2(stm32f405RG),stm32vldiscovery(STM32F100RBTx),我用了STM32CubeMX这个IDE生成的串口例程,可是用官方的qume,就是串口输出不了。可是这个博客 qemu上跑stm32 模拟stm32开发板 - 连任 - 博客园 说是可以的,而且还按照他这个博客同样搞了无数遍,串口还是输出不了。我感觉官方qemu对stm32这儿的模拟就是不太行,如果有知道的小伙伴,可以在评论区告诉我一下喔。
这里有个小伙伴,告诉我了,把工程里面的system config注释掉应该netduinoplus2就可以跑了,我还没试,大家可以试一下,感谢这位网友。(那这就说明,qemu始终只是仿真,一点儿的初始化没做到,可能就运行不起来了,但是实际板子不一样,有些地方不初始化,照样能成功跑的,因为有一些随机的初值啥的)
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐

所有评论(0)