看本博客之前,请先看我这个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始终只是仿真,一点儿的初始化没做到,可能就运行不起来了,但是实际板子不一样,有些地方不初始化,照样能成功跑的,因为有一些随机的初值啥的)

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐