SuperAPI AI 工具集

qemu-embedded-simulation

测试与质量

查看项目

更新于 10-15 15:12

技能介绍

QEMU Embedded Simulation

用途

该技能引导智能体使用 QEMU 处理裸机与 RTOS 固件,涵盖机器型号选择、加载 ELF 镜像、半主机(semihosting)、外设模型以及 GDB 调试。它区别于面向 Linux 的技能 skills/virtualization/qemu-kvm 和 skills/kernel-dev/qemu-for-kernel-development。

适用时机

在无开发板的情况下测试 Cortex-M 固件;对链接脚本与启动代码做 CI 冒烟测试;在真实硬件上使用 OpenOCD 之前先用 GDB 单步调试;在 virt 机器上进行 RISC-V bring-up。

工作流程

  1. ARM Cortex-M(QEMU STM32 开发板)

QEMU 模拟了 STM32 开发板的一个子集(参见 qemu.org STM32 文档):

Machine MCU Core
stm32vldiscovery STM32F100RBT6 Cortex-M3
netduino2 STM32F205RFT6 Cortex-M3
netduinoplus2 STM32F405RGT6 Cortex-M4F
olimex-stm32-h405 STM32F405RGT6 Cortex-M4F

示例命令:

stm32vldiscovery — Cortex-M3(不是 F4);使 -mcpu 与开发板匹配

arm-none-eabi-gcc -mcpu=cortex-m3 -T linker.ld -o firmware.elf main.c startup.s qemu-system-arm
-machine stm32vldiscovery
-kernel firmware.elf
-nographic
-serial mon:stdio

可按 QEMU STM32 启动选项使用 -kernel firmware.bin 或 .elf 引导。机器列表可运行 qemu-system-arm -machine help 查看。当前 QEMU 的 STM32 机器未建模 GPIO、DMA 和 I2C;USART/SPI/ADC/定时器为部分支持。

  1. 通用 ARM virt(Cortex-A 测试)

qemu-system-aarch64 -machine virt -cpu cortex-a53 -m 128M
-kernel firmware.elf -nographic

  1. RISC-V 裸机

qemu-system-riscv32 -machine virt -nographic
-bios none
-kernel firmware.elf

-bios none 表示从复位向量启动,不加载 OpenSBI。

  1. GDB stub

qemu-system-arm -machine stm32vldiscovery -kernel firmware.elf
-S -gdb tcp::3333 -nographic

arm-none-eabi-gdb firmware.elf (gdb) target remote :3333 (gdb) monitor reset halt (gdb) load

可与 skills/embedded/openocd-jtag 配合,用于面向真实硬件的流程。

  1. 半主机(在支持的情况下)

qemu-system-arm ... -semihosting-config enable=on,target=native

可通过半主机系统调用实现 printf——工具链必须构建时启用半主机支持。

  1. 限制(依据上游文档的 QEMU STM32)
注意点 实际情况
QEMU STM32 无 GPIO GPIO 控制器未实现——LED 闪烁测试需使用硬件或其他机器
无 DMA / I2C STM32 的 QEMU 模型缺少 DMA 与 I2C
部分 RCC RCC 复位/使能仅在 F4 上存在;不是完整时钟树
可能误认 MCU stm32vldiscovery 是 F100 M3,不是 F407——需匹配 CPU 标志与链接内存
时序 与真实芯片相比不是周期精确的

生产签核前需在硬件上验证。

  1. 智能体用法

/qemu-embedded-simulation Run STM32VL discovery firmware in QEMU with GDB on port 3333

常见问题

现象 原因 修复
QEMU 立即退出 main 返回 结尾加入循环或 WFI
入口地址错误 ELF 未按模型链接 用 readelf -h 检查 entry
无串口输出 UART 模型地址错误 使用机器专属映射或半主机
GDB 无法连接 忘记加 -S 添加 -S -gdb tcp::3333
QEMU 中 HardFault 栈/向量无效 修复启动代码——参见 baremetal-startup

相关技能

skills/baremetal/baremetal-startup — 向量与链接脚本 skills/baremetal/stm32-baremetal — STM32 布局 skills/embedded/openocd-jtag — 硬件调试 skills/kernel-dev/qemu-for-kernel-development — QEMU 中的 Linux 内核 skills/platform/riscv-privileged — RISC-V 复位与 virt