这是嵌入式开发中经典的‘升级中断’问题,核心思路是设计**双分区(A/B)启动**或**备份+回滚**机制。
**推荐方案(A/B分区):**
1. 将Flash划分为Bootloader、App_A、App_B三个区域。
2. 升级时,将新固件写入**非当前运行**的分区(如当前跑App_A,则写App_B)。
3. 写入完成后,设置标志位(如Magic Number),再跳转到新分区启动。
4. 若升级中断,Bootloader检测到新分区标志无效,自动回退到旧分区运行。
**关键代码(伪代码):**
```c
// Bootloader中检查
if (check_magic(APP_B_ADDR) == VALID) {
jump_to(APP_B_ADDR);
} else {
jump_to(APP_A_ADDR); // 回退
}
```
**实操建议:**
- 使用**CRC校验**确保固件完整性,升级前先擦除再写,写完后校验。
- 若Flash空间有限,可只做**单分区+备份**:升级前将当前固件备份到外部Flash或SD卡,中断后从备份恢复。
- 对于量产产品,务必在Bootloader中实现**看门狗超时**,防止升级卡死。
总之,**永远不要直接覆盖正在运行的代码**,这是铁律。
mcuku 阿沐 · 2026-08-20