qemu-embedded-simulation について
ベアメタルや RTOS のファームウェア開発者向けの QEMU ガイドです。マシン選択、ファームウェアの読み込み、GDB デバッグ、セミホスティングに加え、STM32 周辺機器モデルの制限も説明します。
主な機能
- 01QEMU マシンモデルの選択
- 02ベアメタル ELF イメージの読み込み
- 03GDB スタブによるデバッグ
- 04セミホスティングの設定
- 05STM32 モデルの制限の把握
活用シーン
- 01ボードなしでの Cortex-M ファームウェアテスト
- 02CI でのリンクと起動のスモークテスト
- 03ハードウェアデバッグ前のステップ実行
- 04virt 上でのベアメタル RISC-V の立ち上げ
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ mohitmishra786/ low-level-dev-skills --skill qemu-embedded-simulationインストール後、Claude Code で/qemu-embedded-simulationを入力して読み込まれたか確認します。
詳細
QEMU 組み込みシミュレーション
目的
ベアメタルおよびRTOSファームウェア向けに、QEMUの使い方をエージェントに案内します。マシンの選択、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スタブ
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 はF407ではなくF100 M3です。CPUフラグとリンカーメモリーを一致させてください |
| タイミング | 実際のシリコンに対するサイクル精度はありません |
本番リリースの承認前に、ハードウェアで検証してください。
7. エージェントの使用方法
/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