当前位置: 首页 > news >正文

多种适用于 MCU 固件的 OTA 升级方案

大家就当看个乐。

Bootloader + A区方案

设计说明

● 存储分区:
○ Bootloader区:存储引导加载程序,负责启动流程、固件验证和升级逻辑。
○ A区:存储应用程序固件,运行时由Bootloader跳转到A区执行。
● 升级流程:
a. Bootloader接收新固件(通过串口、CAN、OTA等方式)。
b. 新固件直接写入A区,覆盖原有固件。
c. Bootloader验证新固件(例如通过CRC或哈希校验)。
d. 验证通过后,重启并跳转到A区运行新固件。
优势
● 简单性:设计简单,存储分区少,Bootloader逻辑清晰,易于实现。
● 存储效率高:只需要Bootloader和A区,适合Flash空间有限的MCU。
劣势
● 无回滚机制:升级失败(如新固件损坏或不完整)会导致系统不可用,需通过外部工具恢复。
● 升级风险高:直接覆盖A区,若升级中断(掉电等),可能导致设备变砖。

Bootloader + A区 + 缓存区

设计说明

存储分区
○ Bootloader区:负责启动、固件验证和升级管理。
○ A区:存储当前运行的应用程序固件。
○ 缓存区:临时存储新固件,升级前进行完整性验证。
● 升级流程:
a. Bootloader接收新固件并存储到缓存区。
b. 在缓存区完成新固件的完整性验证(CRC、MD5等)。
c. 验证通过后,将缓存区内容复制到A区。
d. 重启并跳转到A区运行新固件。
优势
● 升级安全性提升:新固件先存储到缓存区,验证后再覆盖A区,降低升级失败风险。
● 支持完整性检查:缓存区允许在写入A区前进行完整性验证,减少无效固件覆盖风险。
劣势
● 存储开销大:需要额外的缓存区,占用Flash空间,通常需要Flash容量是固件大小的2倍以上。
● 无回滚机制:升级失败后仍无法回滚到旧固件,需外部恢复。
● 升级时间较长:需要先写入缓存区再复制到A区,增加了升级耗时。

Bootloader + A区 + B区

设计说明

● 存储分区:
○ Bootloader区:负责启动、固件验证、升级管理和分区切换逻辑。
○ A区:存储当前运行的应用程序固件。
○ B区:存储备用固件(新固件或旧固件),用于升级或回滚。
● 升级流程:
a. Bootloader接收新固件并写入B区(假设A区为当前运行固件)。
b. 在B区完成新固件的完整性验证。
c. 验证通过后,Bootloader更新启动标志,标记B区为活动分区。
d. 重启并跳转到B区运行新固件。
e. 若新固件运行失败,Bootloader可切换回A区(回滚)。
优势
● 支持回滚:A区和B区可互为备份,升级失败可回滚到旧固件,大幅提升可靠性。
● 高可靠性:新固件在B区验证通过后再切换,降低变砖风险。
● 支持无缝升级:升级过程不影响当前运行(A区),适合高可用性场景。
劣势
● 存储开销大:需要两倍应用程序大小的Flash空间,适合Flash容量较大的MCU。
● 开发复杂性高:Bootloader需实现分区切换、状态管理和回滚逻辑,开发和测试成本较高。
● 升级时间较长:需要完整写入B区并验证,耗时较多。

目前项目中使用的是第三种方式,已经实现,分区如下:
区域 起始地址 结束地址 大小 用途
Bootloader 0x08000000 0x08007FFF 32KB 引导程序
回退标志存储区 0x08008000 0x080087FF 2KB 集中回退标志
选择标志存储区 0x08008800 0x08008FFF 2KB 选择运行区域
A 区程序 0x08009000 0x08026FFF 120KB 应用程序 A(主版本)
B 区程序 0x08027000 0x08044FFF 120KB 应用程序 B(备份版本)

升级协议及代码后续慢慢更新,等我。

http://www.xdnf.cn/news/1299097.html

相关文章:

  • PHP现代化全栈开发:实时应用与WebSockets实践
  • 智能门锁:安全与便捷的现代家居入口
  • CMake笔记:Alias Target在哪些地方可以使用
  • python的艺术品收藏管理系统
  • [激光原理与应用-267]:理论 - 几何光学 - 胶卷相机的组成和工作原理
  • pytorch学习笔记-Loss的使用、在神经网络中加入Loss、优化器(optimizer)的使用
  • Video-R1论文解读
  • 前端框架选择之争:jQuery与Vue在现代Web开发中的真实地位-优雅草卓伊凡
  • 哈希表特性与unordered_map/unordered_set实现分析
  • 【Linux学习|黑马笔记|Day4】IP地址、主机名、网络请求、下载、端口、进程管理、主机状态监控、环境变量、文件的上传和下载、压缩和解压
  • 将 pdf 转为高清 jpg
  • OpenBMC中C++策略模式架构、原理与应用
  • 设计模式基础概念(行为模式):策略模式
  • c/c++实现 TCP Socket网络通信
  • ASCII与Unicode:编码世界的奥秘
  • 阿里云TranslateGeneral - 机器翻译SDK-自己封账单文件版本—仙盟创梦IDE
  • 机器学习实战篇--TF-IDF实战--名著红楼梦的文本数据处理
  • 亚马逊品牌权力重构:第三方卖家崛起下的竞争生态与系统性应对框架
  • 微信公众号推送文字消息与模板消息
  • 加密货币交易所开发:如何打造安全、高并发的数字资产交易平台?
  • 开源安全云盘存储:Hoodik 实现端到端数据加密,Docker快速搭建
  • 深度学习-卷积神经网络CNN-膨胀卷积、可分离卷积(空间可分离、深度可分离)、分组卷积
  • 【保姆级教程】CentOS 7 部署 FastDFS 全流程(避坑指南)
  • 具身智能Scaling Law缺失:机器人界的“摩尔定律“何时诞生?
  • CVPR 2025 | 机器人操控 | RoboGround:用“掩码”中介表示,让机器人跨场景泛化更聪明
  • 3D商品展示:技术狂欢下的普及困局
  • DataHub OPC Gateway:实现OPC UA与OPC DA无缝集成的高性能网关
  • 【代码随想录day 20】 力扣 108.将有序数组转换为二叉搜索树
  • 京东【自主售后】物流信息获取_影刀RPA源码解读
  • Docker部署美化SunPanel导航页