关于 qemu-embedded-simulation
面向裸机和 RTOS 固件开发者的 QEMU 指南,介绍机器选择、固件加载、GDB 调试与半主机,并说明 STM32 外设模型的限制。
主要功能
- 01选择 QEMU 机器模型
- 02加载裸机 ELF 镜像
- 03通过 GDB stub 调试
- 04配置半主机
- 05了解 STM32 模型限制
适用场景
- 01无开发板时测试 Cortex-M 固件
- 02在 CI 中进行链接与启动冒烟测试
- 03连接硬件前单步调试
- 04在 virt 上启动裸机 RISC-V
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ mohitmishra786/ low-level-dev-skills --skill qemu-embedded-simulation安装后在 Claude Code 中输入/qemu-embedded-simulation确认已加载。
详细介绍
QEMU 嵌入式仿真
用途
指导 Agent 使用 QEMU 进行裸机和 RTOS 固件开发:选择机器、加载 ELF 映像、使用半主机、外围设备模型和 GDB 调试;与面向 Linux 的 skills/virtualization/qemu-kvm 及 skills/kernel-dev/qemu-for-kernel-development 不同。
适用场景
- 无需开发板即可测试 Cortex-M 固件
- 对链接脚本和启动代码进行 CI 冒烟测试
- 在硬件上使用 OpenOCD 前,通过 GDB 单步调试
- 在
virt机器上启动 RISC-V
工作流
1. ARM Cortex-M(QEMU STM32 开发板)
QEMU 对部分 STM32 开发板进行了建模(参见 qemu.org STM32 文档):
| 机器 | MCU | 核心 |
|---|---|---|
stm32vldiscovery | STM32F100RBT6 | Cortex-M3 |
netduino2 | STM32F205RFT6 | Cortex-M3 |
netduinoplus2 | STM32F405RGT6 | Cortex-M4F |
olimex-stm32-h405 | STM32F405RGT6 | Cortex-M4F |
# stm32vldiscovery — Cortex-M3 (not F4); match -mcpu to the board
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/定时器仅部分支持。
2. 通用 ARM virt(Cortex-A 测试)
qemu-system-aarch64 -machine virt -cpu cortex-a53 -m 128M \
-kernel firmware.elf -nographic
3. RISC-V 裸机
qemu-system-riscv32 -machine virt -nographic \
-bios none \
-kernel firmware.elf
-bios none 会在没有 OpenSBI 的情况下从复位向量启动。
4. 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 用于目标硬件上的工作流。
5. 半主机(若支持)
qemu-system-arm ... -semihosting-config enable=on,target=native
可通过半主机系统调用使用 printf;工具链必须在构建时启用半主机支持。
6. 限制(根据上游文档,针对 QEMU STM32)
| 注意事项 | 实际情况 |
|---|---|
| QEMU STM32 中没有 GPIO | 未实现 GPIO 控制器;LED 闪烁测试需要硬件或其他机器 |
| 没有 DMA / I2C | STM32 QEMU 模型缺少 DMA 和 I2C |
| RCC 支持不完整 | 仅 F4 支持 RCC 复位/使能;不支持完整时钟树 |
| MCU 型号假设错误 | stm32vldiscovery 对应 F100 M3,而非 F407;CPU 标志和链接器内存配置要匹配 |
| 时序 | 与芯片实际运行相比并非周期精确 |
在生产验收前,请在硬件上进行验证。
7. Agent 使用方式
/qemu-embedded-simulation Run STM32VL discovery firmware in QEMU with GDB on port 3333
常见问题
| 现象 | 原因 | 修复方法 |
|---|---|---|
| QEMU 立即退出 | main 已返回 | 在末尾循环或执行 WFI |
| 入口地址错误 | ELF 未针对该模型进行链接 | 检查 readelf -h 中的入口地址 |
| 没有串口输出 | 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
评论
支持 Markdown