|
平台基于 STM32F405、FreeRTOS。目前正在调研多种 OTA 空中升级方案。我评估了几条路线,认为最简单可靠的架构设计如下: 开发一个 Bootloader,可以在两份应用固件镜像App A、App B之间选择启动,两份镜像都存放在 1MB 片内 Flash。Bootloader + AppA + AppB 总大小不能超过 1MB Flash 空间。App B 本质是 App A 的升级版本。 设备出厂预装 Bootloader 与 App A,Flash 预留足够区域存放后续升级包;一旦 OTA 升级到 App B 失败、App B 镜像损坏,设备可以回滚启动 App A。 后续发布新版本固件 App B;应用程序A 和 B都具备 Flash 烧写能力:App A 通过空中链路接收 App B 固件,并写入 Flash 对应的分区。 Bootloader 依据 Flash 内标记校验值,决定启动 App B 而非 App A;App A 仍然保留在 Flash 中,当 App B 运行异常时 Bootloader 能够切回 App A。 后续持续发布新版本 C、D 等,流程循环执行。标准升级路径 A→B→C→D……;但也存在特殊场景:A 升级 B 失败,或者用户还没收到 B 就直接获取 C,出现 A→C 跨版本升级。因此不能假定新版本固件固定写入某一个绝对地址。 查阅资料后我认为这套方案可行,相当于用软件模拟其他 STM32 芯片自带的双 Bank 硬件特性,由应用层实现 Flash 升级逻辑。Bootloader 负责选择启动镜像;每一份应用固件只能擦写、烧写自身不占用的 Flash 扇区。请问从整体架构角度,这套思路是否合理? |
微信公众号
手机版