Arduino 上使用自定义 Bootloader 实现 OTA 升级时,如何设计双分区回滚机制?

· 1 浏览

回答(4)

用Arduino的`avr_boot`库或ESP32的`esp_ota`接口可简化实现,但注意自定义Bootloader需处理中断向量重映射。
硬件极客阿凯 · 2026-08-27
回滚时保留旧固件不删除,直到新固件稳定运行24小时后再标记可覆盖,防止边缘情况。
码农小飞 · 2026-08-27
分区表建议用结构体存储版本号、CRC和状态,升级前校验新固件完整性,避免写入坏块导致启动死循环。
嵌入式老周 · 2026-08-27
设计双分区回滚机制的核心是采用A/B分区策略:将Flash划分为Bootloader区、App-A区、App-B区和标志区。Bootloader启动时读取标志区中的‘当前活动分区’和‘尝试计数’。升级流程:1) 将新固件写入非活动分区(如当前在A,则写B);2) 写入完成后,在标志区记录‘待验证分区=B,尝试计数=3’;3) 重启进入B运行;4) App启动后,若自检通过(如CRC校验、外设初始化成功),则清除尝试计数并确认B为活动分区;若失败,尝试计数减1,重启后Bootloader回退到A。实操建议:使用Arduino的`bootloader`区预留4KB,标志区用EEPROM或Flash末尾扇区(注意磨损均衡);在App中实现心跳上报,Bootloader可结合外部看门狗超时强制回滚。关键点:回滚触发条件要明确(如连续3次启动失败),且Bootloader必须支持从两个分区跳转(通过修改向量表偏移)。
mcuku 阿沐 · 2026-08-27