掌桥专利:专业的专利平台
掌桥专利
首页

一种低资源的差分升级方法及嵌入式设备

文献发布时间:2024-04-18 19:58:26


一种低资源的差分升级方法及嵌入式设备

技术领域

本发明属于嵌入式系统技术领域,尤其涉及一种低资源的差分升级方法及嵌入式设备。

背景技术

嵌入式设备在现场运行时,如果出现了应用上的问题或者是功能上的变更,就需要对设备的程序进行升级处理。升级的概念就是在原有的程序上做一些逻辑添加、删减或者更改。升级后的程序与原来的程序必然是不完全一样的。所以如果出现了需要对设备进行升级的情况,就需要将新的程序替换老的程序。

目前行业内有两种升级方式,一种是直接将新程序通过一些方式,例如有线通讯和无线通讯,全部传输到嵌入式设备中。设备可以直接将接收到完整的新程序替换老程序;另一种是比对新程序和老程序,生成一个差分文件,也有称为增量文件。再通过通讯等方式传输到嵌入式设备中。设备通过差分文件和老程序还原出新程序。

目前嵌入式行业传统的差分升级算法在资源的大小上没有做特别的控制,原因是bootloader一般可以拥有比较丰富的资源。这样的算法一般会有几千字节的内存作为算法缓存空间。这样就导致算法会比较依赖单片机的资源上,使得一些资源有限的单片机无法使用差分升级。

发明内容

发明目的:本发明所要解决的技术问题是针对现有技术的不足,提供一种低资源的差分升级方法及嵌入式设备。

为了解决上述技术问题,第一实施例公开了一种低资源的差分升级方法,应用于嵌入式设备,所述嵌入式设备包括解压缓存区和差分升级缓存区,所述方法包括:

步骤1,获取第二patch文件和old文件,所述第二patch文件包括多个压缩包;

步骤2,解压一个压缩包,将解压后的数据存放于所述解压缓存区;

步骤3,根据所述差分升级缓存区空间大小,对解压后的数据和old文件进行还原处理,获得还原数据;当差分升级缓存区空间满时,将所述还原数据转存至所述嵌入式设备的存储器;

步骤4,重复执行步骤2至3,直至所述第二patch文件中的多个压缩包均处理完成,获得new文件,完成差分升级。

进一步地,步骤1中所述第二patch文件由服务端发送至所述嵌入式设备,服务端基于bsdiff算法获得第一patch文件,所述第一patch文件包括多个文件单元,每个文件单元包括文件信息和对应的数据信息,所述文件信息包括相似字符串长度、额外字符串长度和地址偏移,所述数据信息包括相似字符串和额外字符串;将所述第一patch文件按压缩等级进行压缩,获得多个压缩包;将所述多个压缩包按照压缩先后顺序组合成第二patch文件,将第二patch文件发送至嵌入式设备。

进一步地,所述压缩等级以字节长度为单位,最小为256字节;步骤2中解压一个压缩包时按所述压缩等级进行解压,所述解压缓存区空间大小与解压等级相同。

进一步地,步骤3包括:

步骤3.1,从解压缓存区获取本次文件单元的文件信息;

步骤3.2,根据所述差分升级缓存区空间大小和文件信息中的相似字符串长度,还原数据;

步骤3.3,根据所述差分升级缓存区空间大小和文件信息中的额外字符串长度,还原数据;

步骤3.4,若解压缓存区还存在其他文件单元,重复执行步骤3.1至3.3直至解压缓存区的所有数据处理完成。

进一步地,步骤3.1中文件信息包括24字节,以8字节长度分成三段,并解析出相似字符串长度,记为diff_len、额外字符串长度,记为extra_len,和地址偏移offset。

进一步地,步骤3.2包括:计算差分升级缓存区剩余空间大小,记为buff_free_len,与相似字符串长度diff_len作比较,得到一个最小值,记为write_len,从解压缓存区读出write_len长度的相似字符串到差分升级缓存区中;

从当前old文件地址读出write_len长度的数据,并按字节累加到差分升级缓存区中的相似字符串上;此时如果write_len与diff_len相等,即diff_len小于等于还原之前的buff_free_len,那么结束本次diff string的操作,执行步骤3.3开始额外字符串操作;否则,diff_len比buff_free_len大,代表此时差分升级缓存区已满,需要将差分升级缓存区中的数据转存至存储器中;

将差分升级缓存区数据转存到存储器后,清空差分升级缓存区,继续上面相似字符串的操作,直到本次单元文件的所有相似字符串都恢复完为止。

进一步地,步骤3.3包括:先比较额外字符串长度extra_len和差分升级缓存区剩余空间大小buff_free_len,取最小值记为write_len,从解压缓存区地址读取write_len长度的额外字符串到差分升级缓存区;

此时如果write_len与extra_len相等,即extra_len小于等于还原之前的buff_free_len,那么结束本次额外字符串的操作;否则,extra_len比buff_free_len大,代表此时差分升级缓存区已满,需要将差分升级缓存区中的数据转存至存储器中;将差分升级缓存区中的数据转存至存储器后,清空差分升级缓存区,继续上面额外字符串的操作,直到本次单元文件的所有额外字符串都恢复完为止。

进一步地,步骤4中获得new文件后,对new文件进行CRC校验,如果校验通过,则完成差分升级。

第二方面,公开了一种嵌入式设备,包括内存配置模块、文件获取模块、解压模块、差分升级模块和存储器,所述内存配置模块,用于配置解压缓存区和差分升级缓存区;

所述文件获取模块,用于获取第二patch文件和old文件,所述第二patch文件包括多个压缩包;

所述解压模块,用于解压一个压缩包,将解压后的数据存放于所述解压缓存区;

所述差分升级模块,用于根据所述差分升级缓存区空间大小,对解压后的数据和old文件进行还原处理,获得还原数据;当差分升级缓存区空间满时,将所述还原数据转存至所述存储器;

所述存储器,用于存储获得的还原数据,最终获得new文件,完成差分升级。

第三方面,公开了一种电子设备,包括:

一个或多个处理器;

存储器,用于存储一个或多个程序,

当所述一个或多个程序被所述一个或多个处理器执行时,使得所述一个或多个处理器执行所述的方法。

有益效果:

本申请实施例提出的一种低资源的差分升级方法,整体消耗的内存包括了解压缓存区、差分升级缓存区,两个缓存区均可配置,使用者可根据实际使用的嵌入式平台任意配置内存。差分升级缓存区最低消耗1字节,最高无限制。相比较其他现有技术需要几千字节内存的资源,本申请对内存资源的要求很低,可以适配任何有升级需求的嵌入式平台,极大地减少了内存的消耗,使差分升级适配更多的嵌入式平台,帮助降低嵌入式产品在升级过程中的时间和流量成本。同时,考虑到了升级过程中对flash擦写次数的控制,大大延长了flash的使用时间。

附图说明

下面结合附图和具体实施方式对本发明做更进一步的具体说明,本发明的上述和/或其他方面的优点将会变得更加清楚。

图1为本申请实施例提供的一种低资源的差分升级方法的流程示意图。

图2为本申请实施例提供的一种嵌入式设备的结构示意图。

具体实施方式

下面将结合附图,对本发明的实施例进行描述。

不同的嵌入式行业的应用各不相同,有的应用比较简单,对应的程序规模就比较小;有的应用很复杂,对应的程序规模就很大。显然,传输整个新程序到设备的方式只适合一些应用简单的场景,如果程序规模很大,无论是时间还是流量,亦或者是设备为接收新程序准备的空间资源,这种方式都不可取。所以差分升级就显得尤为重要。由于在升级前,应用程序会进入bootloader,此时的资源相对来说比较丰富,所以不会对内存方面做太多的限制。一般都会开辟几千字节的内存作为算法的缓存(差分和解压的算法需要的内存都比较大,只是解压算法就要上千字节的内存)。但这样的算法对本身资源就有限的单片机或者是应用上有限制,从而导致内存资源不多的平台不适配,例如STM8L052R8T6

针对这一点,本申请实施例提供了一种低资源的差分升级方法及嵌入式设备,使用者可以根据实际情况任意定义内存缓存的大小,使得差分升级可以适配更多嵌入式平台。

另外,目前现有差分升级技术为了解决嵌入式设备内存不足的问题,会将差分文件内的差分包做分段处理,比如一个差分包有1000个字节,把1000个字节分成10段,然后每段附加分段信息。嵌入式设备接收到这样的差分文件后,就能利用比较少的内存进行差分升级。但这样的做法有明显的缺陷,因为额外的分段信息加入到差分文件中,会导致差分文件被扩大。在无线设备中,例如LoRa,在信号比较弱的时候,每一包数据荷载的信息会变得很少,如果差分文件变大,即使流量变大的问题不考虑,那么传输时间也会被大大拉长,这不仅会对文件传输的可靠性带来风险,也会增加升级的时间。

在电表行业,升级速度是要重点考虑的一个参数,而在行业中,LoRa技术也同样会应用到,那么现有的技术显然就不合适了。

并且,本申请在考虑内存优化的同时,也考虑到了升级过程中对flash擦写次数的控制。bsdiff算法会对old文件和patch文件做加法运算,由于该算法设计的时候是在PC上实现的,所以都是在内存中操作。如果flash也按照这样设计,每次读取一个差分包就写入flash,然后在进行加法运算的时候读出来,再加完又重新写入flash,就会导致flash的擦写次数增多。flash的擦除操作是有寿命限制的,通常是10万次。如果在升级过程中出现了问题,导致flash反复被擦写,就会有flash寿命被过早耗尽的风险。一旦flash的寿命耗尽,嵌入式设备也就报废了。本申请的所有操作都在内存中,只有处理完后才会写入flash,因此flash的擦写次数缩短了50%,大大延长了flash的使用时间。

术语解释:

bootloader:引导程序,运行在整个应用程序之前,做一些初步的硬件和软件处理。

old文件:可以是升级前一版本的程序,也可以是更新前一个版本的其他文件。

new文件:可以是最新版本的程序,也可以是最新版本的其他文件。

patch文件:补丁文件,通过bsdiff算法得到old文件与new文件之间差异的文件。

diff string:相似字符串,通过bsdiff算法得到,new文件和old文件比对后,差异较小的部分。

extra string:额外字符串,通过bsdiff算法得到,new文件和old文件比对后差异较大的部分。

bsdiff算法:一种开源的比对文件算法,比对完后会生成一个patch文件。

patch文件指针:代表当前patch文件的位置。例如0代表patch文件的第1个字节,5代表patch文件第6个字节。

CRC校验:循环冗余校验码。

Flash:一种存储单元,可以存储代码等数据。

PC:个人计算机。

服务端通过bsdiff算法,得到第一patch文件。第一patch文件经过minilzo压缩算法压缩获得第二patch文件,将第二patch文件通过某种方式(例如:蓝牙、LoRa和RS485等)传输给嵌入式设备,嵌入式设备再通过本实施例利用第二patch文件和old文件还原出new文件。

本申请第一实施例公开一种低资源的差分升级方法,应用于嵌入式设备,所述嵌入式设备包括解压缓存区和差分升级缓存区,所述方法包括:

步骤1,获取第二patch文件和old文件,所述第二patch文件包括多个压缩包;

所述第二patch文件由服务端发送至所述嵌入式设备,服务端基于bsdiff算法获得第一patch文件,第一patch文件包含了一定数量的差异包,差异包是通过bsdiff算法生成的一个文件单元。当比对完new文件和old文件后,会有很多这样的文件单元。每个文件单元包括文件信息和对应的数据信息,所述文件信息包括24个字节的信息段,所述数据信息包括相似字符串(diff string)和额外字符串(extra string)。24字节的信息段包含了三部分,每部分8字节。第一部分为diff string长度,第二部分为extra string长度,第三部分为一个地址偏移,记为offset。因为bsdiff算法是通过比对new文件和old文件生成差异包,所以如果要通过差异包恢复到new文件,就必须要知道对应的old文件位置,这个地址偏移offset就是用来计算old文件地址的。每次恢复完一次差异包后,都要对当前old文件地址做diff string长度加上offset长度的偏移,即old地址(old文件指针)+diff string长度+offset。将这些文件单元按先后顺序组合成一个文件,记为第一patch文件。由于第一patch文件会比较大,而经过bsdiff算法后的第一patch文件包含了很多0,所以可以对第一patch文件做压缩处理。

压缩处理中有个参数叫压缩等级,以字节长度为单位,压缩等级可配置,最小256字节,最大没有限制。例如压缩等级为256字节,它的含义是每次从需要被压缩的文件中按顺序取出256个字节进行压缩。压缩后会生成一个压缩包。压缩包包含了被压缩后的数据。通常,被压缩后的数据长度会小于压缩等级。比如上面256字节的压缩等级生成的压缩包可能只有20个字节。对整个文件按照压缩等级压缩后,会产生很多个压缩包。把这些压缩包按照压缩先后顺序组合成一个文件,就是第二patch文件。

由一系列差异包组成的patch文件通过压缩后,生成的压缩文件第二patch文件就是最终传入嵌入式设备的文件。

在具体实现的过程中,嵌入式设备获得第二patch文件后,如图1所示,可以先对第二patch文件进行文件信息校验,校验正确后,可以对解压缓存区和差分升级缓存区进行初始化,如根据压缩等级配置解压缓存区空间大小,根据嵌入式设备的内存大小配置差分升级缓存区等。

步骤2,解压一个压缩包,将解压后的数据存放于所述解压缓存区;

嵌入式设备在使用第二patch文件时,要按协议的压缩等级对第二patch文件做解压处理。

因为解压后的数据需要存放,所以嵌入式设备就需要准备与压缩等级相当的解压缓存区。比如压缩等级是256字节,那么嵌入式设备就需要固定准备256字节大小的解压缓存区用来存放解压后的数据。每次处理完一个压缩包,就可以把处理完的数据丢弃。实际处理时,只需要把下一个压缩包解压后的数据直接覆盖到解压缓存区即可。

由于diff string和extra string的长度都是不确定的,diff string最长可以和整个old文件一样,而资源有限的嵌入式设备不可能提供无限大的存储空间来适配大小不确定的各种情况。所以需要设计一个差分升级缓存空间来临时存放还原的数据,再转存到存储器中。

下面阐述利用old文件和第二patch文件还原出new文件的过程。

根据压缩等级对第二patch文件进行解压,每次只解压一个压缩包,将解压后的数据存放于解压缓存区。

步骤3,根据所述差分升级缓存区空间大小,对解压后的数据和old文件进行还原处理,获得还原数据;当差分升级缓存区空间满时,将所述还原数据转存至所述嵌入式设备的存储器,如图1所示,包括:

步骤3.1,从解压缓存区获取本次文件单元的文件信息;

从解压缓存区读出本次差异包的24字节信息段,以8字节长度分成三段,并解析出diff string长度,记为diff_len、extra string长度,记为extra_len,和地址偏移offset。

步骤3.2,根据所述差分升级缓存区空间大小和文件信息中的相似字符串长度,还原数据,包括:

计算差分升级缓存区剩余空间大小,记为buff_free_len,与相似字符串长度diff_len作比较,得到一个最小值,记为write_len,从解压缓存区读出write_len长度的相似字符串到差分升级缓存区中;

从当前old文件地址读出write_len长度的数据,并按字节累加到差分升级缓存区中的相似字符串上;此时如果write_len与diff_len相等,即diff_len小于等于还原之前的buff_free_len,那么结束本次diff string的操作,执行步骤3.3开始额外字符串操作;否则,diff_len比buff_free_len大,代表此时差分升级缓存区已满,需要将差分升级缓存区中的数据转存至存储器中;

将差分升级缓存区数据转存到存储器后,清空差分升级缓存区,继续上面相似字符串的操作,直到本次单元文件的所有相似字符串都恢复完为止。

每次处理完一个单元文件后,对所述的当前old文件地址(old文件指针)做diffstring长度和offset长度的偏移,即old文件指针+diff string长度+offset长度。所以如果当前正在处理diff string的话,因为差分升级缓存区剩余空间大小buff_free_len不足,导致diff string只处理一部分的情况下(write_len),old文件指针也只移动write_len长度。extra string因为和old文件无关,所以offset只需要在处理完extra string后再对old文件指针做偏移即可。

步骤3.3,根据所述差分升级缓存区空间大小和文件信息中的额外字符串长度,还原数据,包括:

先比较额外字符串长度extra_len和差分升级缓存区剩余空间大小buff_free_len,取最小值记为write_len,从解压缓存区地址读取write_len长度的额外字符串到差分升级缓存区;

此时如果write_len与extra_len相等,即extra_len小于等于还原之前的buff_free_len,那么结束本次额外字符串的操作;否则,extra_len比buff_free_len大,代表此时差分升级缓存区已满,需要将差分升级缓存区中的数据转存至存储器中;将差分升级缓存区中的数据转存至存储器后,清空差分升级缓存区,继续上面额外字符串的操作,直到本次单元文件的所有额外字符串都恢复完为止。

步骤3.4,若解压缓存区还存在其他文件单元,重复执行步骤3.1至3.3直至解压缓存区的所有数据处理完成。

步骤4,重复执行步骤2至3,直至所述第二patch文件中的多个压缩包均处理完成,获得new文件,完成差分升级。

进一步地,完成后,对new文件进行CRC校验,如果校验通过,则代表此次恢复成功,则完成差分升级。

本申请第二实施例公开一种嵌入式设备,如图2所示,包括内存配置模块、文件获取模块、解压模块、差分升级模块和存储器,所述内存配置模块,用于配置解压缓存区和差分升级缓存区;

所述文件获取模块,用于获取第二patch文件和old文件,所述第二patch文件包括多个压缩包;

所述解压模块,用于解压一个压缩包,将解压后的数据存放于所述解压缓存区;

所述差分升级模块,用于根据所述差分升级缓存区空间大小,对解压后的数据和old文件进行还原处理,获得还原数据;当差分升级缓存区空间满时,将所述还原数据转存至所述存储器;

所述存储器,用于存储获得的还原数据,最终获得new文件,完成差分升级。

本申请第三实施例公开一种电子设备,包括:

一个或多个处理器;

存储器,用于存储一个或多个程序,

当所述一个或多个程序被所述一个或多个处理器执行时,使得所述一个或多个处理器执行所述的方法。

具体实现中,本申请提供计算机存储介质以及对应的数据处理单元,其中,该计算机存储介质能够存储计算机程序,所述计算机程序通过数据处理单元执行时可运行本发明提供的一种低资源的差分升级方法的发明内容以及各实施例中的部分或全部步骤。所述的存储介质可为磁碟、光盘、只读存储记忆体(read-only memory,ROM)或随机存储记忆体(random access memory,RAM)等。

本领域的技术人员可以清楚地了解到本发明实施例中的技术方案可借助计算机程序以及其对应的通用硬件平台的方式来实现。基于这样的理解,本发明实施例中的技术方案本质上或者说对现有技术做出贡献的部分可以以计算机程序即软件产品的形式体现出来,该计算机程序软件产品可以存储在存储介质中,包括若干指令用以使得一台包含数据处理单元的设备(可以是个人计算机,服务器,单片机,MUU或者网络设备等)执行本发明各个实施例或者实施例的某些部分所述的方法。

本发明提供了一种低资源的差分升级方法及嵌入式设备,具体实现该技术方案的方法和途径很多,以上所述仅是本发明的具体实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。本实施例中未明确的各组成部分均可用现有技术加以实现。

相关技术
  • 一种设备升级方法及嵌入式设备
  • 一种用于嵌入式设备的应用程序升级方法及存储介质
  • 一种差分升级方法、嵌入式设备和可读存储介质
  • 一种嵌入式设备的差分升级方法及相关组件
技术分类

06120116492590