mcpField
B
bootloaders-embedded

bootloaders-embedded

github.com/mohitmishra786开发269312 次安装18 周前更新
代码仓库

关于 bootloaders-embedded

bootloaders-embedded 是一项面向 Cortex-M 等 MCU 引导程序开发的 Agent 技能,重点介绍应用跳转、Flash 布局、镜像校验和固件更新安全。

主要功能

  1. 01Flash 分区与应用布局
  2. 02校验应用向量表
  3. 03Cortex-M 引导程序交接
  4. 04UART、USB DFU 和自定义更新方案
  5. 05安全固件更新与回滚

适用场景

  1. 01从非零 Flash 偏移启动应用
  2. 02实现 OTA 或 USB DFU 更新
  3. 03排查经引导程序启动失败的应用
  4. 04降低固件更新时的变砖风险

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/mohitmishra786/low-level-dev-skills --skill bootloaders-embedded

安装后在 Claude Code 中输入/bootloaders-embedded确认已加载。

详细介绍

嵌入式引导加载程序

目的

指导 Agent 掌握嵌入式引导加载程序基础知识:向量表重定位、从引导加载程序安全跳转到应用程序、Flash 分区,以及 Cortex-M 和类似 MCU 上的基本固件更新模式(UART、USB DFU 或自定义协议)。

适用场景

  • 应用程序必须从非零 Flash 偏移地址运行(例如 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 与用户 Flash 中的 BL 混淆。

6. 更新安全性
  • 写入暂存扇区,验证 CRC,然后交换元数据指针(A/B)
  • 绝不要在没有恢复路径的情况下擦除唯一有效映像
  • 仅在验证提交后复位看门狗
7. Agent 用法
/bootloaders-embedded Write STM32F4 jump-to-app at 0x08010000 with VTOR setup

常见问题

症状原因修复方法
跳转后出现 HardFaultSP 无效或缺少 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 — Flash 映射和 CMSIS
  • skills/baremetal/interrupts-and-exceptions-baremetal — NVIC 禁用模式
  • skills/embedded/linker-scripts — 分离映像的 VMA/LMA
  • skills/embedded/openocd-jtag — 恢复变砖的 Flash

评论

支持 Markdown