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

摘要

提出一种改进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. 接着单击"打开文件"按钮选择所需要传输的差分包。
相关推荐
李小星同志1 小时前
高级算法设计与分析 学习笔记6 B树
笔记·学习
霜晨月c1 小时前
MFC 使用细节
笔记·学习·mfc
小江湖19941 小时前
元数据保护者,Caesium压缩不丢重要信息
运维·学习·软件需求·改行学it
dot.Net安全矩阵2 小时前
.NET内网实战:通过命令行解密Web.config
前端·学习·安全·web安全·矩阵·.net
微刻时光2 小时前
Redis集群知识及实战
数据库·redis·笔记·学习·程序人生·缓存
潮汐退涨月冷风霜4 小时前
机器学习之非监督学习(四)K-means 聚类算法
学习·算法·机器学习
GoppViper4 小时前
golang学习笔记29——golang 中如何将 GitHub 最新提交的版本设置为 v1.0.0
笔记·git·后端·学习·golang·github·源代码管理
羊小猪~~5 小时前
深度学习基础案例5--VGG16人脸识别(体验学习的痛苦与乐趣)
人工智能·python·深度学习·学习·算法·机器学习·cnn
Charles Ray5 小时前
C++学习笔记 —— 内存分配 new
c++·笔记·学习
我要吐泡泡了哦6 小时前
GAMES104:15 游戏引擎的玩法系统基础-学习笔记
笔记·学习·游戏引擎