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。
工作流程
- 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/定时器为部分支持。
- 通用 ARM virt(Cortex-A 测试)
qemu-system-aarch64 -machine virt -cpu cortex-a53 -m 128M
-kernel firmware.elf -nographic
- RISC-V 裸机
qemu-system-riscv32 -machine virt -nographic
-bios none
-kernel firmware.elf
-bios none 表示从复位向量启动,不加载 OpenSBI。
- 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 配合,用于面向真实硬件的流程。
- 半主机(在支持的情况下)
qemu-system-arm ... -semihosting-config enable=on,target=native
可通过半主机系统调用实现 printf——工具链必须构建时启用半主机支持。
- 限制(依据上游文档的 QEMU STM32)
| 注意点 | 实际情况 |
|---|---|
| QEMU STM32 无 GPIO | GPIO 控制器未实现——LED 闪烁测试需使用硬件或其他机器 |
| 无 DMA / I2C | STM32 的 QEMU 模型缺少 DMA 与 I2C |
| 部分 RCC | RCC 复位/使能仅在 F4 上存在;不是完整时钟树 |
| 可能误认 MCU | stm32vldiscovery 是 F100 M3,不是 F407——需匹配 CPU 标志与链接内存 |
| 时序 | 与真实芯片相比不是周期精确的 |
生产签核前需在硬件上验证。
- 智能体用法
/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