bootloaders-embedded について
bootloaders-embedded は、Cortex-M などの MCU 向けブートローダーを実装するエージェント向けのスキルです。アプリへの制御移行、Flash レイアウト、イメージ検証、ファームウェア更新の安全性を扱います。
主な機能
- 01Flash の分割とアプリ配置
- 02アプリのベクターテーブル検証
- 03Cortex-M のブートローダー引き継ぎ
- 04UART、USB DFU、独自更新方式
- 05安全なファームウェア更新とロールバック
活用シーン
- 01Flash の非ゼロ位置からアプリを起動
- 02OTA または USB DFU 更新の実装
- 03ブートローダー経由で起動しないアプリの調査
- 04ファームウェア更新時の文鎮化リスク低減
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ mohitmishra786/ low-level-dev-skills --skill bootloaders-embeddedインストール後、Claude Code で/bootloaders-embeddedを入力して読み込まれたか確認します。
詳細
組み込みブートローダー
目的
エージェント向けに、組み込みブートローダーの基礎を解説します。ベクターテーブルの再配置、ブートローダーからアプリケーションへの安全な引き継ぎ、フラッシュのパーティション分割、Cortex-Mや類似のMCUでの基本的なファームウェア更新パターン(UART、USB DFU、カスタムプロトコル)を扱います。
使用する場面
- アプリケーションをゼロ以外のフラッシュオフセット(例:
0x08010000)で実行する必要がある場合 - ベンダーのHALを使わずにOTAまたはUSB DFUを実装する場合
- 「単体で書き込めば動作するが、ブートローダー経由では動作しない」という問題をデバッグする場合
skills/baremetal/baremetal-startupやskills/baremetal/stm32-baremetalと統合する場合
ワークフロー
1. メモリレイアウト(一般的なSTM32)
| 領域 | アドレス | サイズ | 内容 |
|---|---|---|---|
| ブートローダー | 0x08000000 | 16–64 KB | BLコード、更新ロジック |
| アプリケーション | 0x08010000 | 残り | アプリのベクターとコード |
アプリのリンカースクリプトではFLASH ORIGINをアプリのベースアドレスに設定し、ベクターテーブルをアプリのベースアドレスに配置する必要があります。
2. 有効なアプリケーションイメージの確認
App vector[0] (initial SP) points into RAM region
App vector[1] (Reset) points into flash region and has Thumb bit set (LSB=1)
Optional: CRC or magic word in app metadata section
#define APP_BASE 0x08010000U
static int app_valid(uint32_t base)
{
uint32_t sp = *(uint32_t *)base;
uint32_t reset = *(uint32_t *)(base + 4);
if (sp < SRAM_BASE || sp > SRAM_END)
return 0;
if ((reset & 1U) == 0U)
return 0;
if (reset < base || reset > FLASH_END)
return 0;
return 1;
}
3. Cortex-Mの引き継ぎ手順
typedef void (*app_entry_t)(void);
void jump_to_app(uint32_t app_base)
{
uint32_t sp = *(uint32_t *)app_base;
uint32_t reset = *(uint32_t *)(app_base + 4);
/* Disable interrupts and de-init peripherals/boot-owned hardware */
__disable_irq();
SysTick->CTRL = 0;
for (int i = 0; i < 8; i++) {
NVIC->ICER[i] = 0xFFFFFFFFU;
NVIC->ICPR[i] = 0xFFFFFFFFU;
}
SCB->VTOR = app_base;
__set_MSP(sp);
__DSB();
__ISB();
app_entry_t entry = (app_entry_t)reset;
entry(); /* does not return */
}
スタートアップ処理で再配置可能なベクターテーブルを想定している場合、アプリケーションはReset_Handlerの早い段階でSCB->VTOR = APP_BASEを設定する必要があります。
4. ブートローダーの責務
Power-on
├── Init minimal clock + UART/USB for update
├── Check update flag in RTC backup / GPIO strap
├── If update requested → receive image, verify, program flash
└── Else if valid app → jump_to_app()
└── Else stay in bootloader shell
5. STM32のシステムメモリDFU(工場出荷時ROM)
STM32チップは、BOOT0=1のときにシステムメモリでUSB DFUを提供します。カスタムブートローダーは別物です。ROM DFUとユーザーフラッシュのBLを混同しないでください。
6. 更新の安全性
- スクラッチセクターに書き込み、CRCを検証してからメタデータポインターを切り替えます(A/B)
- 復旧手段がない状態で、有効なイメージを唯一残ったものまで消去しないでください
- 検証済みのコミット後にのみウォッチドッグをリセットします
7. エージェントの使用方法
/bootloaders-embedded Write STM32F4 jump-to-app at 0x08010000 with VTOR setup
よくある問題
| 症状 | 原因 | 対処方法 |
|---|---|---|
| ジャンプ後にHardFaultが発生する | SPが無効、またはThumbビットが欠落している | ベクターを検証し、reset | 1を確認します |
| IRQがブートローダーのハンドラーに入る | VTORが再配置されていない | IRQを有効にする前にSCB->VTORを設定します |
| アプリ単体では動作するが、BL経由では失敗する | リンカーが0x08000000のままになっている | 正しいORIGINを指定してアプリを再リンクします |
| ジャンプ後にUARTの出力が文字化けする | BLがUARTを動作させたままにしている | 周辺機器を初期化解除するか、リセットします |
| OTA後にデバイスが起動不能になる | 消去中の電源断 | デュアルバンクまたはメタデータのロールバックを使用します |
関連スキル
skills/baremetal/baremetal-startup— ベクターテーブルとReset_Handlerskills/baremetal/stm32-baremetal— フラッシュマップとCMSISskills/baremetal/interrupts-and-exceptions-baremetal— NVICの無効化パターンskills/embedded/linker-scripts— 分割イメージ向けのVMA/LMAskills/embedded/openocd-jtag— 起動不能になったフラッシュの復旧
コメント
Markdown 対応