关于 bootloaders-embedded
bootloaders-embedded 是一项面向 Cortex-M 等 MCU 引导程序开发的 Agent 技能,重点介绍应用跳转、Flash 布局、镜像校验和固件更新安全。
主要功能
- 01Flash 分区与应用布局
- 02校验应用向量表
- 03Cortex-M 引导程序交接
- 04UART、USB DFU 和自定义更新方案
- 05安全固件更新与回滚
适用场景
- 01从非零 Flash 偏移启动应用
- 02实现 OTA 或 USB DFU 更新
- 03排查经引导程序启动失败的应用
- 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)
| 区域 | 地址 | 大小 | 内容 |
|---|---|---|---|
| 引导加载程序 | 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 与用户 Flash 中的 BL 混淆。
6. 更新安全性
- 写入暂存扇区,验证 CRC,然后交换元数据指针(A/B)
- 绝不要在没有恢复路径的情况下擦除唯一有效映像
- 仅在验证提交后复位看门狗
7. Agent 用法
/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— Flash 映射和 CMSISskills/baremetal/interrupts-and-exceptions-baremetal— NVIC 禁用模式skills/embedded/linker-scripts— 分离映像的 VMA/LMAskills/embedded/openocd-jtag— 恢复变砖的 Flash
评论
支持 Markdown