使用 QEMU 仿真 STM32 CubeMX 生成的Makefile项目

[复制链接]
6962|5
手机看帖
扫描二维码
随时随地手机跟帖
keer_zu|  楼主 | 2021-6-23 12:59 | 显示全部楼层 |阅读模式
本帖最后由 keer_zu 于 2021-6-23 13:03 编辑

原文:https://www.cnblogs.com/schips/p/12400576.html

背景
虽然qemu的仿真功能很强大,但是原始的 qemu 并没有仿真板子的功能。而为了仿真裸板,可以使用它的分支 [color=var(--color-primary)]GNU MCU Eclipse QEMU (包含了这个工具qemu-system-gnuarmeclipse)来做这个事情。
[color=var(--color-primary)]xPack QEMU Arm 有关文档
CubeMX 可以生成 Makefile 项目,我们可以基于这样的结果来进行QMEU仿真。我们以 STM32F429I-DISC1 为例,刚好在 2边的工具都有这个板子的型号。
STM32 Cube :v5.6
MCU : STM32F429I-DISC1
LIB : stm32cube_fw_f4_v1250
QEMU: [color=var(--color-primary)]qemu-system-gnuarmeclipse_v2.8.0 [color=var(--color-primary)]win_x64版本工具下载 、[color=var(--color-primary)]linux_x64版本工具下载
Ubuntu:
gcc : arm-none-eabi-gcc_v4.9.3 20150529
Windows:
MDK : Keil 5

使用特权

评论回复

相关帖子

keer_zu|  楼主 | 2021-6-23 13:00 | 显示全部楼层
准备
下面以 Ubuntu 为例。
工具的下载以及配置
下载工具:[color=var(--color-primary)]下载地址
wget https://github.com/xpack-dev-too ... 8.0-8-linux-x64.tgz


配置工具到$PATH中:export PATH=$PATH:实际路径
测试:qemu-system-gnuarmeclipse --version
安装工具链
这一步不是必须的,如果机器中有 arm-none-gcc 可以跳过此步骤。
sudo apt-get install gcc-arm-none-eabi -y


准备工程
1)STM32 CubeMX 选择 以 F429-DISC1 作为项目模板。
2)在"Project Manager"中,"Project" - "Toolchain/IDE" 选择 Makefile。
3)根据自己的需求改改其他的东西(建议禁用FreeRTOS),"GENERATE CODE"。

使用特权

评论回复
keer_zu|  楼主 | 2021-6-23 13:01 | 显示全部楼层
编译项目
由于是CubeMx生成的,一般除了gcc如果不是arm-node-eabi-gcc之外,不需要其他的改动了。
进入项目以后,直接输入:

makearm-none-eabi-gcc -c -mcpu=cortex-m4 -mthumb -mfpu=fpv4-sp-d16 -mfloat-abi=hard -DUSE_HAL_DRIVER -DSTM32F429xx -IInc -IDrivers/STM32F4xx_HAL_Driver/Inc -IDrivers/STM32F4xx_HAL_Driver/Inc/Legacy -IMiddlewares/Third_Party/FreeRTOS/Source/include -IMiddlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS -IMiddlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F -IMiddlewares/ST/STM32_USB_Host_Library/Core/Inc -IMiddlewares/ST/STM32_USB_Host_Library/Class/CDC/Inc -IDrivers/CMSIS/Device/ST/STM32F4xx/Include -IDrivers/CMSIS/Include -IDrivers/CMSIS/Include -Og -Wall -fdata-sections -ffunction-sections -g -gdwarf-2 -MMD -MP -MF"build/main.d" -Wa,-a,-ad,-alms=build/main.lst Src/main.c -o build/main.o  .../usr/lib/gcc/arm-none-eabi/4.9.3/../../../arm-none-eabi/bin/ld: warning: /usr/lib/gcc/arm-none-eabi/4.9.3/../../../arm-none-eabi/lib/armv7e-m/fpu/libc_nano.a(lib_a-reent.o) uses 2-byte wchar_t yet the output is to use 4-byte wchar_t; use of wchar_t values across objects may failarm-none-eabi-size build/for_stm32f429.elf   text           data            bss            dec            hex        filename  30548            156          37660          68364          10b0c        build/for_stm32f429.elfarm-none-eabi-objcopy -O ihex build/for_stm32f429.elf build/for_stm32f429.hexarm-none-eabi-objcopy -O binary -S build/for_stm32f429.elf build/for_stm32f429.bin       


使用特权

评论回复
keer_zu|  楼主 | 2021-6-23 13:02 | 显示全部楼层
仿真
使用以下命令进行仿真:

注意,仿真需要 elf 文件( 由 arm-none-eabi-gcc 编译出来的) 或者 axf 文件( 由 keil 编译出来的 )

qemu-system-gnuarmeclipse --board STM32F429I-Discovery -d unimp,guest_errors --image build/for_stm32f429.elf
可以看到 界面出现了开发板的样子。但由于 QEMU 不支持硬浮点,导致打印以下的报告:

$ qemu-system-gnuarmeclipse --board STM32F429I-Discovery -d unimp,guest_errors --image build/for_stm32f429.elf
NVIC: Bad read offset 0xd88
qemu-system-gnuarmeclipse: Attempt to set CP10/11 in SCB->CPACR, but FP is not supported yet.

[2]    4796 killed     qemu-system-gnuarmeclipse --board STM32F429I-Discovery -d unimp,guest_errors
修改
由于仿真不顺利,我们需要进行修改。

修改Makefile,将 FLOAT-ABI = -mfloat-abi=hard 改为 FLOAT-ABI = -mfloat-abi=soft

sed -r -i "/FLOAT-ABI = -mfloat-abi=hard/ s/.*/FLOAT-ABI = -mfloat-abi=soft/"       Makefile
之后,重新make。如果没有在CubeMX中选择FreeRTOS,那么重新仿真是可以通过的。

qemu-system-gnuarmeclipse --board STM32F429I-Discovery -d unimp,guest_errors --image build/*.elf
修改 FreeRtos port.c 使其支持 仿真(如果已经配置)
此节参考:解决在QEMU上仿真STM32F429时出现的若干问题

如果CubeMX中选择了FreeRTos,但由于 FreeRTos中的底层不支持软浮点(具体是在文件Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.c中),所以出现下面的问题:

make

...

/tmp/cc5R608O.s: Assembler messages:
/tmp/cc5R608O.s:426: Error: selected processor does not support 'vstmdbeq r0!,{s16-s31}' in Thumb mode
/tmp/cc5R608O.s:428: Error: instruction not allowed in IT block -- 'stmdb r0!,{r4-r11,r14}'
/tmp/cc5R608O.s:448: Error: selected processor does not support 'vldmiaeq r0!,{s16-s31}' in Thumb mode
/tmp/cc5R608O.s:450: Error: instruction not allowed in IT block -- 'msr psp, r0'
Makefile:201: recipe for target 'build/port.o' failed
make: *** [build/port.o] Error 1

打开Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.c文件,

xPortStartScheduler 函数中 注释掉 以下2行代码:
373 //  vPortEnableVFP();                                                                                                  
  1   
  2     /* Lazy save always. */
  3 //  *( portFPCCR ) |= portASPEN_AND_LSPEN_BITS;
xPortPendSVHandler 函数 中 注释掉 以下2处地方的3行:

443 //  "   tst r14, #0x10                      \n" /* Is the task using the FPU context?  If so, push high vfp registers. */        
  1 //  "   it eq                               \n"
  2 //  "   vstmdbeq r0!, {s16-s31}             \n"

...

465 //  "   tst r14, #0x10                      \n" /* Is the task using the FPU context?  If so, pop the high vfp registers too. */
  1 //  "   it eq                               \n"
  2 //  "   vldmiaeq r0!, {s16-s31}             \n"
再次仿真,顺利通过。

使用特权

评论回复
keer_zu|  楼主 | 2021-6-23 13:03 | 显示全部楼层
GDB调试
添加使用--gdb tcp::1234 -S 参数 来进行仿真,例如
qemu-system-gnuarmeclipse --board STM32F429I-Discovery -d unimp,guest_errors --mcu STM32F429ZI --gdb tcp::1234 -S -d --image build/*.elf


qemu启动后等待来自gdb的调试指令,打开另外一个终端窗口,运行
arm-none-eabi-gdb# 在gdb界面内运行:(gdb)target remote localhost:1234(gdb)continue


可以看到qemu开始执行程序,GUI界面上可以看到程序执行效果。
附录:xPack QEMU Arm 所支持的芯片以及开发板
已经支持的板子:
  • Maple – LeafLab Arduino-style STM32 microcontroller board
  • NUCLEO-F103RB – ST Nucleo Development Board for STM32 F1 series
  • NetduinoGo – Netduino GoBus Development Board with STM32F4
  • NetduinoPlus2 – Netduino Development Board with STM32F4
  • STM32-E407 – Olimex Development Board for STM32F407ZGT6
  • STM32-H103 – Olimex Header Board for STM32F103RBT6
  • STM32-P103 – Olimex Prototype Board for STM32F103RBT6
  • STM32-P107 – Olimex Prototype Board for STM32F107VCT6
  • STM32F4-Discovery – ST Discovery kit for STM32F407/417 lines
  • STM32F429I-Discovery – ST Discovery kit for STM32F429/439 lines
已经支持的芯片:
  • STM32F103RB、STM32F107VC
  • STM32F405RG、STM32F407VG、STM32F407ZG
  • STM32F429ZI
  • STM32L152RE
计划支持但还没支持的开发板:
  • EK-TM4C123GXL – TI Tiva C Series TM4C123GXL LaunchPad Evaluation Kit
  • FRDM-K20D50M – Freescale Freedom Development Platform for Kinetis K20 USB MCUs
  • FRDM-K22F – Freescale Freedom Development Platform for Kinetis K22 MCUs
  • FRDM-K64F – Freescale Freedom Development Platform for Kinetis K6[34] and K24 MCUs
  • FRDM-KL25Z – Freescale Freedom Development Platform for Kinetis KL[12][45] MCUs
  • FRDM-KL26Z – Freescale Freedom Development Platform for Kinetis KL[12]6 MCUs
  • FRDM-KL43Z – Freescale Freedom Development Platform for Kinetis KL[34]3, KL[12]7 MCUs
  • FRDM-KL46Z – Freescale Freedom Development Platform for Kinetis KL[34]x MCUs
  • LPCXpresso-LPC1769 – Embedded Artists LPCXpresso LPC1769 Development Board
  • NUCLEO-F334R8 – ST Nucleo Development Board for STM32 F3 series
  • NUCLEO-F411RE – ST Nucleo Development Board for STM32 F4 series
  • NUCLEO-L152RE – ST Nucleo Development Board with STM32L152RET6
  • Netduino2 – Netduino Development Board with STM32F2
  • OLIMEXINO-STM32 – Olimex Maple (Arduino-like) Development Board
  • SAM3-H256 – Olimex Header Board for ATSAM3S4BA
  • STM32F0-Discovery – ST Discovery kit for STM32F051 line
  • STM32F3-Discovery – ST Discovery kit for STM32F303 line
  • STM32VL-Discovery – ST Discovery kit for STM32F100 Value Line
  • TWR-K60F120M – Freescale Kinetis K60 120 MHz Tower System Module
  • XMC 2Go – Infineon XMC 2Go Kit with XMC1100
  • XMC1100 Boot Kit – Infineon CPU Card XMC1100 Boot Kit Entry Series
  • XMC1200 Boot Kit – Infineon CPU Card XMC1200 Boot Kit Feature Series
  • XMC1300 Boot Kit – Infineon CPU Card XMC1300 Boot Kit Control Series
  • XMC4200 Enterprise Kit – Infineon CPU Board XMC4200 Actuator
  • XMC4400 Enterprise Kit – Infineon CPU Board XMC4400 General Purpose
  • XMC4500 Enterprise Kit – Infineon CPU Board XMC4500 General Purpose
  • XMC4500 Relax Kit – Infineon CPU Board XMC4500 Relax Kit
  • XMC4500 Relax Lite Kit – Infineon CPU Board XMC4500 Relax Lite Kit
附录:安装 GNU MCU Eclipse QEMU 完整 IDE(可选项)
qemu-system-gnuarmeclipse已经足够我们的使用,但如果需要图形界面式的开发,请参考以下的文档。
参考文档:[color=var(--color-primary)]How to download the GNU MCU Eclipse QEMU?
安装 Node.js 与 npm
参考:[color=var(--color-primary)]Ubuntu中安装最新 Node.js 和 npm
安装 xmp
npm install --global xpm@latest


安装 QEMU-arm
xpm install --global @xpack-dev-tools/qemu-arm@latest


安装 OPENOCD(Open On-Chip Debugger)
xpm install --global @xpack-dev-tools/openocd@latest



[color=var(--color-text-secondary)]如果说我的**对你有用,只不过是我站在巨人的肩膀上再继续努力罢了。
若在页首无特别声明,本篇**由 [color=var(--link-color)]Schips
经过整理后发布。
博客地址:https://www.cnblogs.com/schips/

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:qq群:49734243 Email:zukeqiang@gmail.com

1288

主题

12164

帖子

53

粉丝