小内存嵌入式设备软件的差分升级设计(学习)

摘要

提出一种改进HDiffPatch算法并在复旦微单片机上实现小内存差分升级的方案,即使用单片机内的Flash空间替代算法占用的RAM空间,从而减少算法对单片机RAM空间的需求,以满足小内存微处理器的差分升级,同时对算法内存分配释放函数进行优化,以最大限度地利用RAM空间。

引言

差分升级也称增量升级或补丁升级,其升级的原理很简单:首先通过某种算法找出新软件版本和旧软件版本不同的地方(这个过程称为差分);然后把不同地方抽取出来构成所谓的更新补丁(patch),也称差分包(difference package);之后在旧软件版本的基础上通过还原算法将差异部分还原出来,从而升级为新版本程序。

与整包升级最大的区别在于,差分升级是通过一个差分文件对系统进行升级,其差分文件比新版程序文件更小,所以差分升级带来了许多方便:

  1. 大大缩减了传输数据的大小,提高了软件升级的成功率。
  2. 对于窄带物联网、4G网络等设备远程升级,还可以节省下载流程。
  3. 对于电池供电设备远程升级,缩短了升级时间,降低了升级过程中的功耗。
  4. 软件升级的数据通过传输新旧程序差异数据而非完整程序数据,增强了软件升级的安全性。

当前应用到的差分升级方法只适用于大内存微处理器,对于小内存微处理器无法实现差分升级,因为还原算法需要较大的内存。

系统差分升级算法方案概述

差分升级方案的核心就是使用差异文件(diff)和补丁文件(patch)算法来对新旧程序文件进行diff/patch操作。BsDiff/BsPatch与xdelta是当前使用较多的两种算法,但有一种比前两者更加高效的开源算法应用得越来越多,即HDiffPatch算法。

同等条件下,对比测试HDiffPatch与BsDiff4.3、xdelta3.1两种算法生成的diff数据文件大小、运行时间、占用内存。

HDiffPatch开源算法GitHub提供的测试对比结果表明:HDiff比BsDiff生成的diff数据文件小15%以上,运行时间更短(约其1/4),占用内存更小(约其2/3);在资源紧张且受限的设备中进行patch时,HPatch比BsPatch运行得更快(在整个patch阶段,HPatch最慢时比BsPatch快约1倍,运行最快时约5倍),内存占用更小,约为BsPatch的1/2。

HDiff比xdelta生成的diff数据文件小25%以上,运行时间几乎相同,内存占用小于其1/5;进行patch时,HPatch运行时间比xdelta大约慢50%,内存占用小于其1/5。

对于嵌入式设备,内存资源有限,在不影响性能的情况下降低内存消耗比速度更加重要,因此本系统采用开源HDiffPatch算法实现程序的差分升级。

系统总体设计框图

在这里插入图片描述
系统差分升级流程主要有3步:首先是差分包的产生;其次是差分包的传输;最后是新程序的还原。

本系统差分包通过具有HDiffPatch算法的上位机生成。当系统需要进行差分升级时,将差分包通过红外、窄带物联网、有线网口、4G网络、有线串口或其它无线通信方式传输至嵌入式设备。

对于非有线方式的远程升级,在应用层完成差分包数据的接收,接收数据校验无误后产生复位,单片机复位后进入BootLoader,通过差分算法在BootLoader中还原新的应用程序。

差分升级可实现多台设备同时升级,但需要再传输差分包的上位机上实现多个线程,以确保每个任务之间都相互独立,数据收发不产生干扰。

系统硬件设计

在这里插入图片描述
本系统嵌入式平台采用的是复旦微单片机 FM33L026,该芯片CPU内核为 ARMCortex M0架构,CPU 最高主频为48 MHz,RAM 总 容 量 为16KB,程 序 Flash总 容 量 为128KB,6路串口。系统硬件外围电路主要有时钟电路、复位电路、电源电路、串口电路和红外电路等。

系统软件设计

软件需要实现差分包升级,首先通过上位机制作出新旧软件版本的差分包文件,然后通过数据通信链路将差分包文件传输至嵌入式设备,嵌入式设备接收到数据后再BootLoader启动程序中利用HDiffPatch算法中的patch将新程序还原出来,还原成功后执行新应用程序。

将嵌入式设备程序运行过程划分为两个阶段:第一阶段为BootLoader程序启动阶段,第二阶段为Application应用程序运行阶段。

为了节约资源,本系统无线方式的差分包数据接收在应用程序中完成(应用程序本身具有无线功能,借助无线功能同时完成差分数据包的接收,节约空间资源)。

差分升级流程

在这里插入图片描述

单片机Flash划分空间

在这里插入图片描述

HDiffPatch简介

HDiffPatch差分算法由HDiff和HPatch两种算法组成,两种算法的时间复杂度计算方法相同,为O(newSize+oldSize);内存使用情况分别为newSize+oldSize*5+O(1)字节(当oldSize不小于2G时,oldSize系数由5改为9)和newSize+oldSize+O(1)字节。

HDiffPatch差分算法早期是用于安卓手机客户端的开源算法,它可以跨平台使用。
在开源算法代码中,通过调用create_diff(newData 字节数组,oldData字节数组,out diffData)函数生成了oldData到newData的差异数据diffData;再调用patch(out newData,oldData,diffData)函数将设备中的oldData和接收到的diffData合成newData(在Diff时,可以将补丁包直接压缩,在patch时,无需提前解压)。

系统测试

差分包的生成
本系统通过DiffPatch上位机直接生成差分包。
在这里插入图片描述

  1. 升级前文件路径为选取当前需要升级设备中的旧程序可执行文件。
  2. 升级后文件路径为选取已经更新后的新程序可执行文件。
  3. 单击生成,即可在当前文件夹下生成旧程序的补丁文件。

差分包传输
在这里插入图片描述
差分包下传至设备有多种方式,如有线串口、窄带物联网、红外、4G网络等。
本系统采用有线串口方式通过差分升级上位机将差分包数据传输至设备。

  1. 单击“读取版本”按钮即可确定版本号。
  2. 接着单击“打开文件”按钮选择所需要传输的差分包。
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

饼干饼干圆又圆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值