1、需求源起
MCU固件升级可以通过编程器、调试器或其他设备辅助进行操作,但这种升级方式主要应用于产品研发评估及量产应用阶段。产品量产或设备部署后,若面对大规模设备升级,把产品返厂做升级将面临拆机、人工烧录等繁琐流程,费时费力。随着物联网的发展,越来越多的产品具备无线远程通信能力,产生了更多通过远程通讯接口进行固件升级的需求。
2、升级步骤
固件升级,就是当前设备运行的旧固件有系统漏洞或者要在现有设备添加新功能时,将设备中的旧固件更新为新的固件,使设备运行的程序满足新的功能需求,从MCU内部层面来看就是新固件覆盖旧固件,如图1所示。
图1 固件升级示意图
获取新固件:通过NBIoT、WIFI、Bluetooth、LoRa、ZigBee等通信协议定期查询新版本或者接收升级请求。
覆盖旧固件:将新固件数据分块写入旧固件所在Flash覆盖旧固件。
3、全量升级
通常情况下,在MCU中运行的具有升级功能的程序需要具备两个可独立运行的程序,分别为BootLoader引导程序和实现产品功能的App应用程序。一般情况下BootLoader程序烧录后不会再更新,修复漏洞或者添加功能时升级的均为App应用程序。Flash全量升级分区示意图如图2所示。固件可以通过App或者BootLoader进行接收,如图3所示。
图2 Flash分区示意图
图3 固件接收方式分类
3.1 App接收固件
设备在运行时App查询到有新版本固件或者收到升级请求时,先通过无线通信接口下载新的固件。一般有两种方式更新固件:一种运行App1时,将新的固件分包接收并下载存至App2 Flash分区,下载完成后跳转至App2 分区运行新的固件(MCU需要支持双BANK运行),升级示意图如图4所示 ;第二种跳转Bootloader程序执行固件迁移,将App2固件按块写入App1 Flash分区,待固件迁移无误后再跳转至App1 Flash分区运行。
图4 具有备份区的固件升级示意图
3.2 BootLoader接收固件
设备在运行App时查询到有新版本固件或者收到升级请求时,跳转Bootloader程序将新的固件分包接收并下载至App Flash分区。下载完成时,旧固件被新固件覆盖,然后再跳转App Flash分区运行,示意图如图5所示。
图5 单区固件升级示意图
App与BootLoader接收固件都需要完整的下载新的固件包,即便新的固件相较于旧固件改动量很小,往往MCU RAM资源有限,需要分包下载,每包数据必须正确无误,如果有错误或者遗漏则需要重新下载。升级过程中如果断电,需要再次请求网络重新下载新的固件包,所以整包升级下载时间较长,升级失败风险较高。对一些电池供电的设备,下载时间越长系统功耗越高。
4、差分升级
在服务器端基于差分算法将旧固件V1和新固件V2的差异进行提取并应用压缩算法计算出差分包,将差分包由服务器端传输给MCU客户端,再由差分解压缩算法还原出新的固件V2,这样的升级方式称为差分升级,差分升级的示意图如图6所示。
图6 差分升级示意图
一般差分算法核心思想为:对旧固件新固件文件做子字符串匹配或使用Hash技术, 提取公共部分, 再将新固件文件中剩余的部分打包成差分包;在差分还原时, 用复制和插入两个基本操作将旧固件和差分包合成新固件。对于固件代码较大而修改量较小的新固件,使用差分升级算法,差分包大小相较于新固件会明显变小,无线升级时下载流量也会相应大幅度降低。
6、差分升级vs全量升级
差分升级和全量升级各有各的优点和适合应用的领域,设计者在实际产品开发中可根据不同应用选择不同的升级方式。例如,产品是电池供电,并且数据传输速率比较低,则要求产品升级时能够尽可能减少数据量的传输,节约功耗,此时可优先采用差分升级的方式。差分升级与全量升级的主要特点比较如图7所示。
图7 差分升级与全量升级的主要特点比较
审核编辑:刘清
全部0条评论
快来发表一下你的评论吧 !