1. 引言
在嵌入式产品开发中,OTA(Over-The-Air)升级已成为一项关键能力。对于基于 STM32F4 系列 MCU 的产品,OTA 升级方案的设计直接关系到系统的稳定性、可靠性和用户体验。目前主流的方案分为单 App 升级和双 App 升级(A/B 分区)两种,本文将从原理、优缺点和适用场景三个维度进行对比分析。
2. 单App升级方案
2.1 方案原理
单 App 方案在 Flash 中只划分一个 App 分区,Bootloader 负责引导运行 App,并在收到升级包后,将新固件直接写入当前 App 分区。升级过程中,旧固件会被逐步覆盖。
c
// Flash 分区示意(单App)
// 0x08000000 - 0x0800FFFF : Bootloader (64KB)
// 0x08010000 - 0x0807FFFF : App 分区 (448KB)
2.2 优点
- Flash 占用小:只需一个 App 分区,Flash 利用率高,适合 Flash 容量受限的产品。
- 实现简单:Bootloader 逻辑简单,升级流程清晰,开发和调试成本低。
- 内存开销低:无需维护双分区状态,RAM 占用更少。
2.3 缺点
- 升级失败风险高:写入过程中断电或校验失败,可能导致设备变砖,无法正常启动。
- 无回滚能力:新固件覆盖旧固件后,无法回退到上一个可用版本。
- 升级中断恢复复杂:需要额外的恢复机制(如强制进入 Bootloader 等待重新升级),用户体验较差。
3. 双App升级方案(A/B分区)
3.1 方案原理
双 App 方案将 Flash 划分为两个独立的 App 分区(A 区和 B 区),Bootloader 根据标志位选择从 A 区或 B 区启动。升级时,新固件写入非活动分区,写入完成后切换启动标志,下次启动从新分区引导。
c
// Flash 分区示意(双App)
// 0x08000000 - 0x0800FFFF : Bootloader (64KB)
// 0x08010000 - 0x0803FFFF : App A 分区 (192KB)
// 0x08040000 - 0x0807FFFF : App B 分区 (192KB)
3.2 优点
- 升级安全性高:新固件写入非活动分区,不影响当前运行版本,写入失败不会导致设备变砖。
- 支持回滚:新版本启动失败时,Bootloader 可自动回退到旧版本分区,系统可靠性大幅提升。
- 升级体验好:升级过程中设备可继续运行旧版本,写入完成后才切换,用户几乎无感知。
3.3 缺点
- Flash 占用翻倍:需要两个 App 分区,Flash 利用率低,对 Flash 容量要求高。
- 实现复杂度高:Bootloader 需要管理分区状态、启动标志、回滚逻辑,开发和维护成本增加。
- 升级包需分段处理:由于 Flash 空间受限,大固件可能需要分块下载和写入,协议设计更复杂。
4. 核心对比总结
| 对比维度 | 单App方案 | 双App方案(A/B) |
|---|---|---|
| Flash 占用 | 低(1个分区) | 高(2个分区) |
| 升级失败风险 | 高,可能变砖 | 低,可回滚 |
| 回滚能力 | 不支持 | 支持 |
| 实现复杂度 | 简单 | 复杂 |
| 升级中断恢复 | 困难 | 容易 |
| 适用场景 | Flash 小、成本敏感 | 可靠性要求高、Flash 充足 |
5. 选型建议
对于 STM32F4 系列,具体选型需结合产品定位:
- 若产品 Flash 容量紧张(如 STM32F401 的 256KB 版本),且对升级失败容忍度较高,可优先考虑单 App 方案,配合 Bootloader 强制升级模式降低变砖风险。
- 若产品对可靠性要求高(如工业控制、医疗设备、车联网终端),且 Flash 容量充足(如 STM32F407 的 1MB 版本),建议采用双 App 方案,以获得回滚能力和更高的升级安全性。
- 若产品处于开发验证阶段,可先用单 App 方案快速验证 OTA 流程,后续再迁移到双 App 方案。
6. 总结
单 App 与双 App 方案各有优劣,核心权衡点在于 Flash 资源与系统可靠性之间的取舍。单 App 方案以更低的资源成本换取更简单的实现,但牺牲了升级安全性;双 App 方案则以翻倍的 Flash 占用换取更高的可靠性和更好的用户体验。开发者应根据产品实际需求、Flash 容量和可靠性目标做出合理选择。