mcpField
B
bootloaders-embedded

bootloaders-embedded

github.com/mohitmishra786開発269312 回インストール18 週間前に更新
リポジトリ

bootloaders-embedded について

bootloaders-embedded は、Cortex-M などの MCU 向けブートローダーを実装するエージェント向けのスキルです。アプリへの制御移行、Flash レイアウト、イメージ検証、ファームウェア更新の安全性を扱います。

主な機能

  1. 01Flash の分割とアプリ配置
  2. 02アプリのベクターテーブル検証
  3. 03Cortex-M のブートローダー引き継ぎ
  4. 04UART、USB DFU、独自更新方式
  5. 05安全なファームウェア更新とロールバック

活用シーン

  1. 01Flash の非ゼロ位置からアプリを起動
  2. 02OTA または USB DFU 更新の実装
  3. 03ブートローダー経由で起動しないアプリの調査
  4. 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)
領域アドレスサイズ内容
ブートローダー0x0800000016–64 KBBLコード、更新ロジック
アプリケーション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_Handler
  • skills/baremetal/stm32-baremetal — フラッシュマップとCMSIS
  • skills/baremetal/interrupts-and-exceptions-baremetal — NVICの無効化パターン
  • skills/embedded/linker-scripts — 分割イメージ向けのVMA/LMA
  • skills/embedded/openocd-jtag — 起動不能になったフラッシュの復旧

コメント