关注+星标公众号,不错过精彩内容
来源 | 亚细亚的老鱼
OTA:Over-the-Air ,空中下载,也就是远程升级的意思。
现在OTA升级已经成了很多汽车电子、IoT 等嵌入式设备的必要功能,就连很多几块钱的电子产品,都具备了这个功能。
为了避免升级过程中断电、传输错误导致设备“变砖”,业内普遍采用 A/B 双分区机制。本文总结几种经典方案,并结合实际 MCU的特性,给出实现思路。
一、A/B 双分区的经典方案
静态 A/B(切换入口)
内部 Flash 分两个完整应用区:A 和 B。
升级时,把新固件写到非活动区,重启后 Bootloader 根据控制标志选择启动 A 或 B。
优点:切换快、升级稳定。
缺点:需要两倍程序空间。
下载区 + 拷贝区
当前运行 A,新固件先写入 B,重启时 Bootloader 把 B 拷贝覆盖 A,再启动。
优点:兼容只需一个活动分区的旧系统。
缺点:拷贝耗时,掉电恢复逻辑复杂。
外部 Flash A/B
固件存放在外部 QSPI/OSPI Flash,Bootloader 校验后可直接 XIP 启动,或拷贝到内部。
优点:突破 MCU 内部 Flash 限制。
缺点:需要额外硬件。
差分升级(Delta Patch)
只传输差分数据,在目标分区合成新固件。
优点:数据量小。
缺点:实现复杂,可靠性要求高。
二、典型内存布局
| Boot Control Block (BCB) | 状态标志区
|--------------------------|
| Bootloader (保护段) | 固定不被擦写
|--------------------------|
| 应用分区 A | App + 校验信息
|--------------------------|
| 应用分区 B | App + 校验信息
Bootloader:放在 MCU Boot Segment,用硬件保护。
BCB:存储当前激活分区、待验证分区、版本号、CRC、签名等。建议双份保存,带自校验。
分区 A/B:完整固件镜像,包含入口向量表、代码、CRC/签名。
三、升级完整逻辑
1. 下载阶段
应用程序选择非活动区(比如当前跑 A,则写 B)。
擦除目标分区 → 分块写入(对齐到 MCU 写入粒度)。
写入完成后,计算 CRC/校验签名。
校验通过 → 更新 BCB:标记 pending_slot = B,允许试运行。
2. 启动阶段(Bootloader)
检查 BCB,若有待验证分区 → 优先启动它。
校验 Header、CRC、签名。
如果失败 → 回滚到旧分区。
如果通过 → 进入试运行模式。
3. 试运行与确认
新固件启动后,应用需在规定时间内完成自检(通讯、功能检查)。
确认无误 → 写入健康标志,Bootloader 更新 BCB,正式切换 active_slot = B。
若未确认、频繁看门狗复位 → Bootloader 自动回退 A。
四、关键点与注意事项
原子性:BCB 更新必须双份,掉电也能恢复。
写入顺序:先写数据,最后写头信息,避免“半成品”被误启动。
安全性:推荐固件签名校验(如 ECDSA),公钥固化在 Bootloader 段。
可靠性:升级过程必须能应对掉电、通信中断。
试运行保护:通过看门狗 + 健康标志,确保只有稳定固件才能“转正”。
五、应用场景
汽车 ECU:动力、空调压缩机等对可靠性极高的场景。
IoT 网关:要求远程批量更新,但不能因单台设备失败而中断服务。
工业控制:现场无法人工介入时,A/B 机制能避免停机风险。
六、总结
A/B 双分区 OTA 升级的核心是:
双镜像存储 → 确保一份固件始终可用;
Bootloader 决策 → 负责校验、选择、回退;
应用自确认 → 确保新固件可稳定运行。
这套机制被广泛应用于汽车电子和物联网设备,是目前最可靠的 OTA 设计之一。
