CN103677869B - 无线传感器网络节点远程代码更新系统及方法 - Google Patents
无线传感器网络节点远程代码更新系统及方法 Download PDFInfo
- Publication number
- CN103677869B CN103677869B CN201210327764.2A CN201210327764A CN103677869B CN 103677869 B CN103677869 B CN 103677869B CN 201210327764 A CN201210327764 A CN 201210327764A CN 103677869 B CN103677869 B CN 103677869B
- Authority
- CN
- China
- Prior art keywords
- function
- code
- new
- old
- variance codes
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Landscapes
- Stored Programmes (AREA)
- Mobile Radio Communication Systems (AREA)
Abstract
本发明提供一种无线传感器网络节点远程代码更新系统,包括:更新脚本生成节点用于生成更新脚本,所述更新脚本包括新旧程序函数中的差异代码及其位置和需要执行的更新操作;以及待更新节点用于基于所接收的更新脚本,对本节点上的程序代码执行相应的更新操作。在该系统中,通过仅仅传输更新脚本,避免传输整个更新程序,降低了代码更新所需的通信开销;在待更新节点上使用变量存储单元保存频繁更新的代码,通过使用将差异代码进行函数化的技术,减少程序代码重建的次数,降低了代码更新的重组开销,并使用扩展存储单元备份整个程序,提高了代码更新的可靠性。
Description
技术领域
本发明属于无线传感器网络领域,尤其涉及无线传感器网络节点远程代码更新。
背景技术
目前,随着微电子技术、计算技术、传感技术和无线通信技术的快速发展,无线传感器网络(wireless sensor network,WSN)受到越来越广泛的关注,并在民用和军事领域都体现出重大的应用价值。与传统网络相比,无线传感器网络具有如下特点:网络本身由许多具有感知及通信能力的节点构成;节点由电池供电,计算能力,通信能力和存储资源受限。传感器节点对资源严格要求导致了开发者不可能在编程阶段就考虑到节点在部署以后可能遇到的所有情况,当外界环境的变化引起了节点无法正常工作时,需要能够对节点做出动态的调整。同时,传感器节点对能耗的严格控制要求对节点进行的任何操作,都必须以节省能量为前提,否则,会导致整个网络的能量迅速被耗尽。
以一个被部署到无人值守的区域中的大规模传感器网络为例。由于节点的数量较大,并且被监测区域可能并不适宜人类进入(如原始森林、火山口等),如果节点受到环境突发因素的影响而无法正常工作时,需要及时调整节点的状态。但是节点受到存储资源的限制,通常不会将多个程序放置在节点上进行切换,而且具有偶然性的突发因素也可能使节点上的备用程序变的毫无意义。唯一有效的方法是根据具体的情况直接对节点上的程序进行升级。然而通过一般的在线(in-system)方式对传感器节点进行代码更新受到节点规模和部署环境的制约,通常是不可行的。只能通过无线方式远程地对传感器节点进行升级(即无线重编程,over-air reprogramming)。进而随着物联网(Internet of Things,IOT)的发展,传感器节点作为感知前端,将不仅仅局限于对环境进行监测,势必在更大程度上承担起对数据协同处理以及智能决策的任务。因此,远程代码更新技术也是物联网中必不可或缺的技术手段。
由于传输更新代码不同于传输普通的传感数据,其具有高突发性和数据量庞大的特点。一般情况下,传输这些代码需要大量的能量开销。并且,当待更新节点收到更新代码后,需要在本地重组并保存这部分代码,这些操作也需要一定的能量开销。上述两部分的能量开销可统称为代码更新开销。当前的技术通常关注传输代码引起的通信开销,例如通过传输新旧程序间的差异代码来降低通信开销,而没有关注代码到达节点后重组过程中产生的开销。而这部分由代码重组和存储引起的重组开销,往往会造成节点的能量随着频繁的更新而迅速被耗尽,从而降低整个传感器网络的生命周期。另外,一些传感器节点采用的嵌入式芯片,由于电池电压的降低可能导致保存代码时发生意想不到的错误,严重时会导致节点上程序的崩溃。
发明内容
因此,本发明的目的在于克服上述现有技术的缺陷,提供一种无线传感器网络节点远程代码更新系统,它对硬件资源要求低、能量开销低,高可靠性,且易于实现。
本发明的目的是通过以下技术方案实现的:
一方面,本发明提供了一种无线传感器网络节点远程代码更新系统,包括:
更新脚本生成节点,其用于生成更新脚本,所述更新脚本包括新旧程序函数中的差异代码及其位置和需要执行的更新操作,所述更新操作为替换操作、删除操作或插入操作;
待更新节点,其用于根据所接收的更新脚本,对本节点上的程序代码执行相应的更新操作。
上述系统中,所述更新脚本生成节点可以包括:
搜索函数模块,用于对新旧程序中各个函数代码段进行定位以确定每个函数所包含的代码,以及起始/结束的位置;
函数比较模块,用于确定需要更新的函数;
差异代码定位模块,用于确定所述需要更新的函数中差异代码及其位置;
确定更新操作模块,用于确定需要对所述差异代码执行的更新操作。
上述系统中,所述函数比较模块可以对新旧程序的代码进行整体编码和比较;如果新旧程序的代码不同,则对新旧程序中的每个函数进行编码和比较,以确定需要更新的函数。
上述系统中,所述确定更新操作模块可以在当新旧函数中两个相同的代码段之间存在一个长度相等的差异代码段时,确定要执行的更新操作为替换操作,以指示用新函数中的差异代码段将旧函数中的差异代码段替换掉;当新函数中的差异代码段小于旧函数中的差异代码段时,确定要执行的更新操作为删除操作,以指示将旧函数中多余的代码进行删除;当新函数中的差异代码段大于旧函数中的差异代码段时,确定要执行的更新操作为插入操作,以指示将新函数中增加的代码放入旧函数中。
上述系统中,所述待更新节点可以包括差异代码函数化模块,用于将需要插入的差异代码封装为一个差异代码函数,并以函数调用的方式执行这部分差异代码。
上述系统中,所述差异代码函数化模块可以在需要插入代码的位置上使用一条对所述差异代码函数的进行函数调用的调用指令,而该位置上的原始数据被包含在差异代码函数中且位于所述差异代码之前。
上述系统中,待更新节点还可以包括:
变量存储单元,用于保存部分需要频繁更新的程序代码;
代码存储单元,用于保存当前运行的程序代码;和
扩展存储单元,用于保存备份的程序代码。
上述系统中,还可以包括路由节点,用于传输和转发更新脚本,以及缓存部分更新脚本,当需要的更新脚本已经存储在路由节点上时,直接由该路由节点发往待更新节点。
又一方面,本发明提供了一种无线传感器网络节点远程代码更新方法,包括:
步骤1)生成更新脚本并将更新脚本发送到待更新节点,所述更新脚本包括新旧程序函数中的差异代码及其位置和需要执行的更新操作,所述更新操作包含替换操作、删除操作或插入操作;
步骤2)待更新节点接收更新脚本,根据所述更新脚本对本节点上的程序代码执行相应的更新操作。
上述方法中,所述步骤1)可以包括:
步骤11)对新旧程序中各个函数代码段进行定位以确定每个函数所包含的代码,以及起始/结束的位置;
步骤12)确定需要更新的函数;
步骤13)确定所述需要更新的函数中差异代码及其位置;
步骤14)确定需要对所述差异代码执行的更新操作
步骤15)生成更新脚本并将其发送到待更新节点。
上述方法中,步骤12)可以包括:
步骤121)对新旧程序的代码进行编码和比较;
步骤122)如果新旧程序的代码不同,则对新旧程序中的每个函数进行编码和比较,以确定需要更新的函数。
上述方法中,步骤121)可以包括:
对整个旧程序的代码生成奇偶校验码;
对整个新程序的代码生成奇偶校验码,与旧程序的奇偶校验码进行对比,如果相同,则生成旧程序代码的Hash码和新程序代码的Hash码,如果这两个Hash码相同,则指示不需要进行程序升级。
上述方法中,步骤122)可以包括:如果新旧程序的代码不同,则对旧程序中每个函数i的代码生成奇偶校验码;
对新程序中每个函数i的代码生成奇偶校验码,与旧函数i的奇偶校验码进行对比;如果不同,则确定该函数i需要更新;否则生成旧函数的Hash码和新函数的Hash码,如果这两个Hash码相同,则指示该函数不需要更新,否则确定该函数i需要更新。
上述方法中,步骤13)可以包括:
对新旧代码进行差异对比,使用如下公式计算最大相同代码段:
x和y分别表示新旧函数中每个字节的代码,矩阵c是中记录了函数中的相同字节,当矩阵c生成之后,通过查找矩阵c中最长的相同字节,可以得到最大匹配字节,从而得到新旧函数中最大相同代码段;
在程序中最大相同代码段之间的代码段就是新旧函数间的最小差异代码段,最小差异代码段的位置由最大相同代码段的位置确定。
上述方法中,步骤14)可以包括:
当新旧函数中两个相同的代码段之间存在一个长度相等的差异代码段时,确定要执行的更新操作为替换操作,以指示用新函数中的差异代码段将旧函数中的差异代码段替换掉;
当新函数中的差异代码小于旧函数中的差异代码段时,确定要执行的更新操作为删除操作,以指示将旧函数中多余的代码进行删除;
当新函数中的差异代码段大于旧函数中的差异代码段时,确定要执行的更新操作为插入操作,以指示将新函数中增加的代码放入旧函数中。
上述方法中,所述步骤2)可以包括:
步骤21)当收到更新脚本时,根据所述更新脚本中所包含的差异代码及其位置和要执行的更新操作来对本节点的程序代码进行如下操作:
步骤22)如果要执行的更新操作为替换操作,则用更新脚本中包含的新函数的差异代码段将旧函数中的差异代码段替换掉;
步骤23)如果要执行的更新操作为删除操作,则将旧函数中多余的代码进行删除;
步骤24)如果要执行的更新操作为插入操作,则将需要插入的差异代码封装为一个差异代码函数,并在原函数中以函数调用的方式执行这部分差异代码。
上述方法中,所述步骤24)可以包括在需要插入代码的位置上使用一条对所述差异代码函数的调用指令,而该位置上的原始数据被包含在差异代码函数中且位于所述差异代码之前。
上述方法中,所述步骤24)还可以包括当包含在差异代码函数中的相对跳转的指令的跳转范围超过了差异代码函数的范围时,对这条相对跳转指令进行修改,使它跳转到差异代码函数尾部,再由差异代码函数尾部的一条指令跳转到正确的地址。
上述方法中,所述步骤24)还可以包括当原函数的某条指令被替换成相对跳转指令后,需要跳转到的指令位于所述差异代码函数内时,将该相对跳转指令位置上使用对一个函数的调用指令,而该位置上的相对跳转指令以及该相对跳转指令的下一条指令被包含在该函数中,并且在该函数中使用分支指令代替该相对跳转指令。
与现有技术相比,本发明的优点在于:
通过仅仅传输更新脚本,避免传输整个更新程序,降低了代码更新所需的通信开销;在待更新节点上使用变量存储单元保存频繁更新的代码,通过使用差异代码函数化技术,减少程序代码重建的次数,降低了代码更新的重组开销,并使用扩展存储单元备份整个程序,提高了代码更新的可靠性。另外,通过仅仅对比函数间的差异,较少的存储空间,降低了在更新脚本生成节点上消耗的计算开销。
附图说明
以下参照附图对本发明实施例作进一步说明,其中:
图1为根据本发明实施例的无线传感器网络节点远程代码更新系统的组成示意图;
图2为根据本发明实施例的待更新节点的存储单元示意图;
图3为根据本发明实施例的远程代码更新系统的功能模块示意图;
图4为给出了以奇偶校验码和Hash码为例进行代码的二级比较的步骤示意图;
图5为根据本发明实施例的将差异代码函数化的一个示例的示意图;
图6为根据本发明实施例的更新后三种存储单元保存数据示意图;
图7为根据本发明实施例的更新脚本生成节点执行步骤示意图;
图8为根据本发明实施例的路由节点执行步骤示意图;
图9为根据本发明实施例的待更新节点执行步骤示意图。
具体实施方式
为了使本发明的目的,技术方案及优点更加清楚明白,以下结合附图通过具体实施例对本发明进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
图1是根据本发明实施例的用于无线传感器网络进行远程代码更新的系统的结构示意图。该系统主要包括更新脚本生成节点101,路由节点102,待更新节点103。图1中,闪电符号表示更新脚本生成节点101、路由节点102以及待更新节点103是通过无线方式连接起来。
其中,更新脚本生成节点101主要用于生成代码(在下文中也可称为程序代码或程序的代码)更新所需的更新脚本(delta script)。更新脚本包括了需要更新的代码及其位置和需要执行的更新操作(参见下文的描述)。由于生成更新脚本需要节点具有较强的计算能力和存储能力,更新脚本生成节点101通常可以由使用电源供电的、计算能力和存储能力较强的网关节点(或簇头节点)充当。根据传感器网络分簇的情况,可以允许多个更新脚本生成节点101存在。
路由节点102通常用于传输或转发数据,例如,将目的地为待更新节点103的数据转发到待更新节点103。路由节点102的数目通常由传感器网络的规模决定。在一个实施例中,由于代码数据的传输量较大,路由节点102还可以用于缓存部分更新脚本,以降低重复传输更新代码引起的通信开销。例如,路由节点102可以将一些代码进行缓存,当需要的更新脚本已经存储在路由节点102上,可以直接由该节点发往待更新节点103,而无需由更新脚本产生节点101生成,从而避免了更新脚本的重复传输,有效降低了通信开销。
待更新节点103是代码更新的目标节点。在多个簇组成的传感器网络中可以允许存在多个待更新节点103,其数目通常小于等于更新脚本生成节点101的数目。更新脚本生成节点通常是簇头节点。在一个簇内有许多节点,但在一段时间内通常最好有一个节点被更新,如果有超过1个待更新节点会增加网络的重编程的复杂度。也就是说通常在一定段时间内,簇内至多只有1个待更新节点。因此待更新节点数目通常不会超过簇头节点的数目。
图2给出了待更新节点的存储单元示意图。如图2所示,存储单元主要包括变量存储单元1031、代码存储单元1032和扩展存储单元1033。其中,变量存储单元1031和代码存储单元1032存在于嵌入式芯片内部,使用内部总线进行通信,通常采用统一编址的模式,可以互相直接访问。变量存储单元1031的容量较小,只有代码存储单元1032容量的10%-25%。扩展存储单元1033存在于嵌入式芯片外部,与前两个单元需要通过外部总线相连。扩展存储单元1033的容量通常较大,适合保存程序备份。
继续参考图2,变量存储单元1031是待更新节点上用于存储全局变量(包括初始化全局变量、未初始化全局变量)和局部变量的存储器,通常由易失性存储器组成,其读写开销较低。在一个实施例中,变量存储单元1031可用于保存部分需要频繁更新的程序代码(简称为代码)。代码存储单元1032是待更新节点上用于存储程序代码的存储器,通常由E2PROM等非易失性存储单元组成,主要用于存储程序代码。但代码存储单元1032主要存储当前运行的程序代码,通常容量较小,无法满足备份的需求。扩展存储单元1033是待更新节点上用于保存程序备份的存储单元,通常由扩展非易失性存储单元组成,存储容量较大。由于使用易失性的变量存储单元1031存储部分代码,当待更新节点断电重启时,可能导致部分代码丢失。因此需要使用大容量的扩展存储单元1033对程序代码进行备份。以备在程序崩溃时,可以对节点程序进行恢复。
现有的传感器节点的更新方法也需要用到上述存储单元。但这些方法在进行更新时,通常将差异代码放入扩展存储单元1033中与旧程序组合后,生成新程序。新程序需要回写到程序存储单元1032中,这一系列读写操作将大大地增加重组开销。在本发明的实施例中使用了低功耗的变量存储单元1031存储差异代码,从而有效减少了对高功耗的扩展存储单元1033和程序存储单元1032的读写操作次数,因此降低了存储开销。另一方面,使用扩展存储单元1033进行程序备份,提高了更新的可靠性。
在现有技术中,通常是以整个程序作为更新的基本单位,这会增加计算差异代码的时空复杂度(详见下文分析)。而在本发明的一个实施例中,代码更新是以函数作为更新的基本单位。当需要更新代码时,更新脚本生成节点101首先通过对比新旧程序中的各个函数来确定发生改变的函数(即需要更新的函数),然后确定需要更新的函数中差异代码(即需要更新的代码)的位置,并确定对所述差异代码进行更新的操作,最终生成更新脚本。更新脚本生成节点101将所生成的更新脚本(而不是整个新程序)传输到待更新节点103。待更新节点103根据更新脚本来进行代码更新。
图3给出了根据本发明实施例的远程代码更新系统的功能模块示意图。如图3所示在更新脚本生成节点101上包括搜索函数模块301、函数比较模块302、差异代码定位模块303、确定更新操作模块304;在待更新目标节点103上包括差异代码函数化模块305。其中功能较强的更新脚本节点101承担起了主要的代码更新工作。现将各个模块的功能及实现方法分别说明如下。
搜索函数模块301,用于对程序中各个函数代码段进行定位,确定每个函数所包含的代码,以及起始/结束的位置,从而建立函数的索引目录。在本发明的实施例中,目标节点的代码更新过程是以函数为单位进行的,因此需要确定每个函数所包含的代码,以及起始/结束的位置。搜索函数模块301主要是通过对汇编文件(.s文件)中的函数匹配进行特征匹配,确定各个函数包含的代码,并且记录函数的起始/结束地址。
函数比较模块302,用于确定发生变化的函数(也就是需要更新的函数),以避免对未发生变化的函数进行更新。通常可以以字节为单位对新旧程序的各个函数进行比较以找到差异并且确定发生变化的函数,但这样会浪费大量的计算时间,在一个实施例中,函数比较模块302可以通过代码的二级比较机制实现。代码的二级比较机制首先使用简单编码方法(如奇偶校验码)对新旧程序代码进行整体上的编码和比较,如果相同,则再使用复杂编码方式(如MD4码、Hash码)对新旧程序代码进行进一步的比较以确定是否需要进行程序升级。而如果比较之后,发现新旧程序代码不相同,则首先使用简单编码方法(如奇偶校验码)对新旧程序中每个函数的代码进行编码和比较,如果不同,则将该函数确定为需要进行更新的函数;如果相同,则再使用复杂编码方式(如MD4码、Hash码)对新旧函数的代码进行进一步的比较以确定该函数是否需要进行更新。这是由于对代码生成复杂编码的开销较大,因此首先使用简单编码方式对代码进行编码,然后再使用复杂编码方式进行进一步的比较。图4给出了以奇偶校验码和Hash码为例进行代码的二级比较的步骤示意图。如图4所示,主要包括以下步骤:
步骤401:对整个旧程序的代码生成奇偶校验码。
步骤402:对整个新程序的代码生成奇偶校验码,与旧程序的奇偶校验码进行对比,如果相同,则执行步骤403;否则,跳转到步骤405。
步骤403:生成旧程序代码的Hash码。
步骤404:生成新程序代码的Hash码,与旧程序的Hash码进行对比。如果相同,说明不需要进行程序升级。
步骤405:对旧程序中每个函数i的代码生成奇偶校验码。
步骤406:对新程序中每个函数i的代码生成奇偶校验码,与旧函数i的奇偶校验码进行对比。如果相同,跳转到步骤408;否则执行下一步。
步骤407:确定函数i需要更新。
步骤408:生成旧函数的Hash码。
步骤409:生成新函数的Hash码,与旧函数的Hash码进行对比。如果相同,则说明函数不需要更新;否则,跳转到步骤407。
当上述步骤全部执行完毕,所有需要更新的函数被确定。可以只对这些需要更新的函数进行差异代码比较。
差异代码定位模块303,用于确定需要更新函数中差异代码及其位置。如图3所示,在确定所有需要更新的函数之后,进入差异代码定位模块303,通过对这些函数进行字节级的对比,定位发生变化的代码。差异代码定位模块303可以采用多种方法实现对这些需要更新的函数的代码进行字节级的比较。例如,可以采用下述的动态规划的方法,对新旧代码进行差异对比,寻找最小差异代码段。需要使用如下公式计算最大相同代码段:
x和y分别表示新旧函数中每个字节的代码。矩阵c是中记录了函数中的相同字节。当矩阵c生成之后,通过查找矩阵c中最长的相同字节,可以得到最大匹配字节,从而得到新旧函数中最大相同代码段。在程序中最大相同代码段之间的代码段就是新旧函数间的最小差异代码段,最小差异代码段的位置由最大相同代码段的位置确定。这种动态规划方法的时间和空间复杂度为O(n2),对整个程序的代码进行差异定位,则需要大量的开销。如果一个节点程序代码量在3KB左右,则需要9MB左右的存储空间开销,这对于普通个人计算机可能微不足道,但是对于采用ARM或DSP等作为控制芯片的网关节点仍是一项不菲的存储空间开销。
然而,在本发明的实施例中,由于仅对需要进行更新的函数进行上述比较,n变成了程序中各个函数的代码量nf,有效降低了需要比较的代码量,其时间复杂度和空间复杂度至少下降了四个数量级,有效节约了计算时间和存储空间。应指出,动态规划的方法是一种常规的比较方法,也可以采用别的方法对代码进行字节级的对比。由于在进行差异代码定位之前,将整个程序的代码以函数为单位进行了分割,因此同样会降低这些方法的计算复杂度。
继续参考图3,确定更新操作模块304用于确定需要对差异代码执行更新操作,以便在保证程序安全的前提下,降低重组开销。在本发明的实施例中,对差异代码进行更新的操作(也可以称为对函数的更新操作)可以包括三种更新操作,分别为:(1)替换操作3041;(2)删除操作3042;(3)插入操作3043。在本实施例中,这三种更新操作指示对旧程序的原始代码在原地直接进行哪些修改。三种更新操作的使用场合说明如下:
替换操作3041:当通过差异代码定位模块302找到函数的差异代码之后,如果新旧函数(也就是新旧程序中存在差异代码的两个相对应的函数)中两个相同的代码段之间存在一个长度相等的差异代码段,则直接使用替换操作3041,将这个差异代码段替换掉。
删除操作3042:当新函数中的差异代码小于旧函数中的差异代码段时,使用删除操作3042将旧函数中多余的代码进行删除。
插入操作3043:当新函数中的差异代码段大于旧函数中的差异代码段时,使用插入操作3043将新函数中增加的代码放入旧函数中。
在确定更新操作模块304确定了对所述差异代码要执行的更新操作之后,更新脚本生成节点就可以形成代码更新所需的更新脚本。通过网络将更新脚本从更新脚本生成节点传输到待更新节点。
当待更新节点收到包含差异代码及其位置和要执行的更新操作的更新脚本时,该待更新节点基于所收到的更新脚本,对本节点上的程序执行相应的更新操作。如果更新脚本中包含的更新操作中不存在插入操作3043时,待更新节点可以直接使用空指令(NOP)和相对跳转指令(JMP)实现删除操作3042,和可以直接在旧函数的原始地址上直接写入新代码来实现替换操作3041,从而避免了函数的重建,有效降低了重组开销。然而如果需要进行插入操作3043,则说明旧函数对应的保存差异代码段的空间已经不够存储新函数的差异代码段,如果强行写入,势必会覆盖其他相同代码段的内容,对程序本身是一种破坏,严重时可能导致程序的崩溃,因此在传统方法中普遍采用代码重建的方式解决。为了避免插入操作引起的频繁代码重建,在本发明的实施例中采用了差异代码函数化模块305,以下面描述的函数调用的形式有效地解决了这个问题,使得可以直接对旧程序的原始代码进行插入、替换、删除操作,不再需要扩展存储单元的参与,从而降低了重建开销。
当待更新节点需要执行插入操作时,通过差异代码函数化模块305将需要插入的差异代码封装为一个函数,并以函数调用的方式执行这部分差异代码,以便避免由于频繁使用插入操作3043引起的代码重建,进而降低了重组开销。图5是根据本发明实施例的将差异代码函数化的一个示例的示意图。如图5所示,差异代码501(地址:0x1aac-0x1ab0)需要被放入原始函数502的地址0x1aaa上。如果直接放入,会破坏原始函数502中地址为0x1aaa和0x1aac中的数据。在传统的重编程方法中,只能选择其他的存储空间,将这整个旧函数进行重建,这个代码搬移的过程需要大量的重组开销。而使用差异代码函数化之后,实际上旧程序并不需要进行搬移。
而在本发明的实施例中,如图5所示,修改后的函数503,只需要在需要插入代码的位置上(0x1aaa)使用一条调用指令(CALL)进行绝对跳转即可。由于在0x1aaa上的原始数据被覆盖,因此需要在插入的差异代码函数504中进行恢复,在差异代码函数504中,指令“movr1,r9”被恢复到了地址0x1600上。插入的差异代码被保存在地址0x1602-0x1606上。最后使用返回指令(RET)继续执行旧函数中的其他指令。当执行差异代码时,相当于进行了一次函数调用,在函数中完成对差异代码的执行。差异代码函数504可以被保存在远离主程序的位置上,为了降低重组开销,在本发明的实施例中采用变量存储单元1031保存差异代码函数504。通过使用低功耗的变量存储单元1031保存频繁更新的代码,可以降低代码更新所需的重组开销,同时也可以避免由于电压过低导致的更新失败。另外,还可以使用扩展存储单元1032备份整个程序,以提高代码更新的可靠性。
差异代码函数化模块305可以将插入的代码在不进行代码重建的情况下,以函数调用的方式进行执行。但是,以函数的形式封装需要插入的差异代码存在以下两个问题:一是如果插入的代码中包含了相对跳转指令(如:JMP,JZ,JNZ等),且相对跳转的范围超出了差异代码函数504的范围;二是通过修改操作将某条指令替换为相对跳转之后,如果跳转的目标地址是差异代码段。由于差异代码段已经被转存到了另外的地址上,会导致相对跳转指令不会跳转到正确的指令上。在本实施例中,通过尾部跳转3051和相对跳转的处理3052解决上述问题。
尾部跳转3051主要解决以函数形式插入程序的差异代码中包含相对跳转的问题。当包含在差异代码函数504中的相对跳转的指令的跳转范围超过了差异代码函数504的范围时,需要对这条相对跳转指令进行修改,使它跳转到差异代码函数504尾部,再由差异代码函数504尾部的一条指令跳转到正确的地址。
相对跳转的处理3052主要解决原函数的某条指令被替换成相对跳转指令后,需要跳转到的指令位于差异代码函数504的问题。这个问题的难点在于原程序中的函数是连续存储的,不能使用尾部跳转3051在函数的最后面加入绝对跳转指令,而且通常相对条状指令的长度要小于绝对跳转指令,只能通过对这条相对跳转指令进行特殊处理。对相对跳转指令进行特殊处理的方法是:使用绝对跳转指令替换原程序中的相对跳转指令,并且以差异代码函数化的方法恢复受到这种替换影响的其他指令。在本实施例中使用了分支指令(branch)对相对跳转指令进行替换。分支指令(branch)使用绝对地址进行跳转,并且不会对寄存器产出影响。具体的实施方案为:将相对跳转指令作为插入代码进行差异代码函数化,在差异函数中使用分支指令代替相对跳转指令,并且恢复由于写入函数调用指令而被破坏的相对跳转指令的下一条指令。
图6是根据本发明实施例的待更新节点更新后各个存储单元保存内容的示意图。在变量存储单元中保存了全局初始化变量段(.bss)601,全局未初始化变量段(.data)602,函数化差异代码段(.DiffCode)603以及系统堆栈(stack)604。在代码存储单元中保存了代码段(.text)605以及对函数化差异代码段的备份(.DiffCodeBackup)606。在扩展存储单元中保存了代码段的备份(.textbackup)607。
图7、图8、图9分别显示了在根据本发明实施例的远程代码更新系统中在更新脚本生成节点101,路由节点102以及待更新节点103上所执行具体步骤示例。
如图7所示,在进行代码更新时,更新脚本生成节点101上执行的步骤主要包括:
步骤701:通过搜索新旧程序中的函数,获得新旧程序中函数的起始和结束地址,并记录函数的代码。
步骤702:通过对新旧程序中的函数进行比较,确定哪些函数发生了变化,并记录发生变化的函数作为需要更新的函数。
步骤703:采用动态规划的方法寻找最大的相同代码段,并将相同代码段之间的代码作为差异代码段,定位差异代码。
步骤704:在得到差异代码以及其位置之后,为差异代码确定三种基本更新操作。
步骤705:组合差异代码、差异代码位置以及所需进行的更新操作,生成更新脚本。
步骤706:通过路由节点传输更新脚本以及更新函数的Hash码。也可以同时在路由节点102上缓存更新脚本及更新函数的Hash码,以便在将来的代码更新中,判断是否有相同内容的函数被传输。
步骤707:进入等待状态,不再进行任何代码更新相关,除非获得路由节点的应答。
步骤708:判断是否需要传输新生成的函数更新脚本。如果需要则执行下一步骤709;否则,跳转到步骤705
步骤709:传输新生成的函数更新脚本。
如图8所示,在进行代码更新时,在路由节点102上执行的步骤主要包括:
步骤801:通过比较当前函数更新脚本的Hash码,计算是否已经在本地保存了需要传输的函数更新脚本,如果已经保存了,则执行下一步骤802;否则,跳转到步骤803。
步骤802:向更新脚本生成节点发送信息要发送函数更新脚本。跳转到步骤610。
步骤803:直接从由本地节点向待更新节点发送函数更新脚本。跳转到步骤901。
如图9所示,在进行代码更新时,在待更新节点103执行的步骤主要包括:
步骤901:检查函数更新脚本中是否存在插入操作。如果不含有插入操作,则执行下一步骤902;否则,跳转到步骤903。
步骤902:使用空指令(NOP)或者相对跳转指令(JMP)实现删除操作,通过直接覆盖原函数代码实现替换操作,完成函数代码的重建。跳转到步骤908。
步骤903:检测插入的差异代码中是否是位于一个循环中。如果位于一个循环中则执行步骤904;否则,跳转到步骤905。
步骤904:将整个循环体作为差异代码进行函数化。跳转到步骤907。
步骤905:检测是否有相对跳转指令的跳转地址不正确。如果有,则执行下一步骤906;否则,跳转到步骤907。
步骤906:根据相对跳转指令处于的位置,分别采用尾部跳转或者相对跳转指令的特殊处理,正确修改相对跳转指令。
步骤907:采用差异代码函数化模块305,将所有函数化过后的差异代码放入变量存储单元1031中。
步骤908:向更新脚本生成节点发送确认函数更新完成的消息,请求对下一个发送下一个更新函数的脚本。跳转到步骤705。
与现有的代码更新系统相比,本发明实施例中的远程代码更新系统具有以下几点优势:(1)通过仅仅传输更新脚本,避免传输整个更新程序,从而降低代码更新所需的通信开销;(2)使用差异代码函数化技术,减少程序代码重建的次数,降低代码更新的重组开销;(3)通过仅仅对比函数间的差异,较少的存储空间,降低了在更新脚本生成节点101上消耗的计算开销,提高了生产更新脚本的速度;(4)在多跳传输的路径节点上缓存部分代码,可以避免对更新脚本的重复传输,有效降低通信开销;(5)充分考虑待更新节点上存储器的特点,使用低功耗的变量存储单元保存频繁更新的代码,降低代码更新所需的重组开销同时,可以避免由于电压过低导致的更新失败,并使用扩展存储单元备份整个程序,提高了代码更新的可靠性。
虽然本发明已经通过优选实施例进行了描述,然而本发明并非局限于这里所描述的实施例,在不脱离本发明范围的情况下还包括所作出的各种改变以及变化。
Claims (13)
1.一种无线传感器网络节点远程代码更新系统,包括:
更新脚本生成节点,其用于生成更新脚本,所述更新脚本包括新旧程序函数中的差异代码及其位置和需要执行的更新操作,所述更新操作为替换操作、删除操作或插入操作;
待更新节点,其用于根据所接收的更新脚本,对本节点上的程序代码执行相应的更新操作;
其中,所述待更新节点包括差异代码函数化模块,用于将需要插入的差异代码封装为一个差异代码函数,并以函数调用的方式执行这部分差异代码;所述差异代码函数化模块被配置为:
在需要插入代码的位置上使用一条对所述差异代码函数的进行函数调用的调用指令,而该位置上的原始数据被包含在差异代码函数中且位于所述差异代码之前;
当包含在差异代码函数中的相对跳转的指令的跳转范围超过了差异代码函数的范围时,对这条相对跳转指令进行修改,使它跳转到差异代码函数尾部,再由差异代码函数尾部的一条指令跳转到正确的地址;以及
当原函数的某条指令被替换成相对跳转指令后,需要跳转到的指令位于所述差异代码函数内时,将该相对跳转指令位置上使用对一个函数的调用指令,而该位置上的相对跳转指令以及该相对跳转指令的下一条指令被包含在该函数中,并且在该函数中使用分支指令代替该相对跳转指令。
2.根据权利要求1所述的系统,其中,所述更新脚本生成节点包括:
搜索函数模块,用于对新旧程序中各个函数代码段进行定位以确定每个函数所包含的代码,以及起始/结束的位置;
函数比较模块,用于确定需要更新的函数;
差异代码定位模块,用于确定所述需要更新的函数中差异代码及其位置;
确定更新操作模块,用于确定需要对所述差异代码执行的更新操作。
3.根据权利要求2所述的系统,其中,所述函数比较模块:
对新旧程序的代码进行整体编码和比较;如果新旧程序的代码不同,则对新旧程序中的每个函数进行编码和比较,以确定需要更新的函数。
4.根据权利要求2所述的系统,其中所述确定更新操作模块:
当新旧函数中两个相同的代码段之间存在一个长度相等的差异代码段时,确定要执行的更新操作为替换操作,以指示用新函数中的差异代码段将旧函数中的差异代码段替换掉;
当新函数中的差异代码段小于旧函数中的差异代码段时,确定要执行的更新操作为删除操作,以指示将旧函数中多余的代码进行删除;
当新函数中的差异代码段大于旧函数中的差异代码段时,确定要执行的更新操作为插入操作,以指示将新函数中增加的代码放入旧函数中。
5.根据权利要求1所述的系统,其中待更新节点还包括:
变量存储单元,用于保存部分需要频繁更新的程序代码;
代码存储单元,用于保存当前运行的程序代码;和
扩展存储单元,用于保存备份的程序代码。
6.根据权利要求1所述的系统,还包括路由节点,用于传输和转发更新脚本,以及缓存部分更新脚本,当需要的更新脚本已经存储在路由节点上时,直接由该路由节点发往待更新节点。
7.一种无线传感器网络节点远程代码更新方法,包括:
步骤1)生成更新脚本并将更新脚本发送到待更新节点,所述更新脚本包括新旧程序函数中的差异代码及其位置和需要执行的更新操作,所述更新操作包含替换操作、删除操作或插入操作;
步骤2)待更新节点接收更新脚本,根据所述更新脚本对本节点上的程序代码执行相应的更新操作;
其中,所述步骤2)包括:
步骤21)当收到更新脚本时,根据所述更新脚本中所包含的差异代码及其位置和要执行的更新操作来对本节点的程序代码进行如下操作:
步骤22)如果要执行的更新操作为替换操作,则用更新脚本中包含的新函数的差异代码段将旧函数中的差异代码段替换掉;
步骤23)如果要执行的更新操作为删除操作,则将旧函数中多余的代码进行删除;
步骤24)如果要执行的更新操作为插入操作,则将需要插入的差异代码封装为一个差异代码函数,并在原函数中以函数调用的方式执行这部分差异代码;
其中所述步骤24)包括在需要插入代码的位置上使用一条对所述差异代码函数的调用指令,而该位置上的原始数据被包含在差异代码函数中且位于所述差异代码之前;
所述步骤24)还包括当包含在差异代码函数中的相对跳转的指令的跳转范围超过了差异代码函数的范围时,对这条相对跳转指令进行修改,使它跳转到差异代码函数尾部,再由差异代码函数尾部的一条指令跳转到正确的地址;以及
当原函数的某条指令被替换成相对跳转指令后,需要跳转到的指令位于所述差异代码函数内时,将该相对跳转指令位置上使用对一个函数的调用指令,而该位置上的相对跳转指令以及该相对跳转指令的下一条指令被包含在该函数中,并且在该函数中使用分支指令代替该相对跳转指令。
8.根据权利要求7所述的方法,其中所述步骤1)包括:
步骤11)对新旧程序中各个函数代码段进行定位以确定每个函数所包含的代码,以及起始/结束的位置;
步骤12)确定需要更新的函数;
步骤13)确定所述需要更新的函数中差异代码及其位置;
步骤14)确定需要对所述差异代码执行的更新操作
步骤15)生成更新脚本并将其发送到待更新节点。
9.根据权利要求8所述的方法,其中,步骤12)包括:
步骤121)对新旧程序的代码进行编码和比较;
步骤122)如果新旧程序的代码不同,则对新旧程序中的每个函数进行编码和比较,以确定需要更新的函数。
10.根据权利要求9所述的方法,其中,步骤121)包括:
对整个旧程序的代码生成奇偶校验码;
对整个新程序的代码生成奇偶校验码,与旧程序的奇偶校验码进行对比,如果相同,则生成旧程序代码的Hash码和新程序代码的Hash码,如果这两个Hash码相同,则指示不需要进行程序升级。
11.根据权利要求9所述的方法,其中,步骤122)包括:如果新旧程序的代码不同,则对旧程序中每个函数i的代码生成奇偶校验码;
对新程序中每个函数i的代码生成奇偶校验码,与旧函数i的奇偶校验码进行对比;如果不同,则确定该函数i需要更新;否则生成旧函数的Hash码和新函数的Hash码,如果这两个Hash码相同,则指示该函数不需要更新,否则确定该函数i需要更新。
12.根据权利要求8所述的方法,其中,步骤13)包括:
对新旧代码进行差异对比,使用如下公式计算最大相同代码段:
<mrow>
<mi>c</mi>
<mo>&lsqb;</mo>
<mi>i</mi>
<mo>,</mo>
<mi>j</mi>
<mo>&rsqb;</mo>
<mo>=</mo>
<mfenced open = "{" close = "">
<mtable>
<mtr>
<mtd>
<mn>0</mn>
</mtd>
<mtd>
<mrow>
<mi>i</mi>
<mi>f</mi>
<mi> </mi>
<mi>i</mi>
<mo>=</mo>
<mn>0</mn>
<mi>o</mi>
<mi>r</mi>
<mi> </mi>
<mi>j</mi>
<mo>=</mo>
<mn>0</mn>
</mrow>
</mtd>
</mtr>
<mtr>
<mtd>
<mrow>
<mi>c</mi>
<mo>&lsqb;</mo>
<mi>i</mi>
<mo>-</mo>
<mn>1</mn>
<mo>,</mo>
<mi>j</mi>
<mo>-</mo>
<mn>1</mn>
<mo>&rsqb;</mo>
<mo>+</mo>
<mn>1</mn>
</mrow>
</mtd>
<mtd>
<mrow>
<mi>i</mi>
<mi>f</mi>
<mi> </mi>
<mi>i</mi>
<mo>,</mo>
<mi>j</mi>
<mo>></mo>
<mn>0</mn>
<mo>,</mo>
<msub>
<mi>x</mi>
<mi>i</mi>
</msub>
<mo>=</mo>
<msub>
<mi>y</mi>
<mi>j</mi>
</msub>
</mrow>
</mtd>
</mtr>
<mtr>
<mtd>
<mrow>
<mi>max</mi>
<mrow>
<mo>(</mo>
<mi>c</mi>
<mo>&lsqb;</mo>
<mi>i</mi>
<mo>,</mo>
<mi>j</mi>
<mo>-</mo>
<mn>1</mn>
<mo>&rsqb;</mo>
<mo>,</mo>
<mi>c</mi>
<mo>&lsqb;</mo>
<mi>i</mi>
<mo>-</mo>
<mn>1</mn>
<mo>,</mo>
<mi>j</mi>
<mo>&rsqb;</mo>
<mo>)</mo>
</mrow>
</mrow>
</mtd>
<mtd>
<mrow>
<mi>i</mi>
<mi>f</mi>
<mi> </mi>
<mi>i</mi>
<mo>,</mo>
<mi>j</mi>
<mo>></mo>
<mn>0</mn>
<mo>,</mo>
<msub>
<mi>x</mi>
<mi>i</mi>
</msub>
<mo>&NotEqual;</mo>
<msub>
<mi>y</mi>
<mi>j</mi>
</msub>
</mrow>
</mtd>
</mtr>
</mtable>
</mfenced>
</mrow>
x和y分别表示新旧函数中每个字节的代码,矩阵c是中记录了函数中的相同字节,当矩阵c生成之后,通过查找矩阵c中最长的相同字节,可以得到最大匹配字节,从而得到新旧函数中最大相同代码段;
在程序中最大相同代码段之间的代码段就是新旧函数间的最小差异代码段,最小差异代码段的位置由最大相同代码段的位置确定。
13.根据权利要求8所述的方法,其中,步骤14)包括:
当新旧函数中两个相同的代码段之间存在一个长度相等的差异代码段时,确定要执行的更新操作为替换操作,以指示用新函数中的差异代码段将旧函数中的差异代码段替换掉;
当新函数中的差异代码小于旧函数中的差异代码段时,确定要执行的更新操作为删除操作,以指示将旧函数中多余的代码进行删除;
当新函数中的差异代码段大于旧函数中的差异代码段时,确定要执行的更新操作为插入操作,以指示将新函数中增加的代码放入旧函数中。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201210327764.2A CN103677869B (zh) | 2012-09-06 | 2012-09-06 | 无线传感器网络节点远程代码更新系统及方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201210327764.2A CN103677869B (zh) | 2012-09-06 | 2012-09-06 | 无线传感器网络节点远程代码更新系统及方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN103677869A CN103677869A (zh) | 2014-03-26 |
CN103677869B true CN103677869B (zh) | 2017-10-10 |
Family
ID=50315533
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201210327764.2A Active CN103677869B (zh) | 2012-09-06 | 2012-09-06 | 无线传感器网络节点远程代码更新系统及方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN103677869B (zh) |
Families Citing this family (14)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103823691B (zh) * | 2013-12-18 | 2017-10-24 | 浙江工商大学 | 基于网络编码的无线传感器网络安全在线重编程方法 |
CN104199661B (zh) * | 2014-08-29 | 2017-06-16 | 苏州大学 | 一种面向mc1321x的无线传感器网络wsn重编程方法 |
CN105700899A (zh) * | 2014-11-25 | 2016-06-22 | 中兴通讯股份有限公司 | 一种人机命令脚本更新方法及装置 |
CN104636471A (zh) * | 2015-02-12 | 2015-05-20 | 中国农业银行股份有限公司 | 一种程序代码的查找方法及装置 |
CN105677415B (zh) * | 2016-01-06 | 2020-07-17 | 网易(杭州)网络有限公司 | 热更新方法及装置 |
CN105740038B (zh) * | 2016-02-02 | 2019-04-23 | 浙江工业大学 | 一种面向物联网重编程的存储优化方法 |
US10318247B2 (en) * | 2016-03-18 | 2019-06-11 | Ford Global Technologies, Llc | Scripting on a telematics control unit |
CN105824644A (zh) * | 2016-03-25 | 2016-08-03 | 重庆邮电大学 | 一种适用于无线传感器网络的增量式代码分发协议 |
CN107783775A (zh) * | 2016-08-25 | 2018-03-09 | 南京理工大学 | 基于rtos嵌入式远程在线升级函数方法 |
CN107943512A (zh) * | 2017-11-28 | 2018-04-20 | 晶晨半导体(上海)股份有限公司 | 一种软件系统的更新方法 |
CN109933364A (zh) * | 2019-02-25 | 2019-06-25 | 晶晨半导体(上海)股份有限公司 | 一种代码管理方法 |
CN113805927A (zh) * | 2020-06-11 | 2021-12-17 | 中移(苏州)软件技术有限公司 | 一种代码更新方法、装置、电子设备及计算机存储介质 |
CN113037621B (zh) * | 2021-03-12 | 2022-08-02 | 云知声智能科技股份有限公司 | 边缘网关、边缘网关动态策略服务实现方法、装置及系统 |
CN115017058B (zh) * | 2022-08-04 | 2022-11-29 | 飞腾信息技术有限公司 | 一种内核模块的测试方法、装置、电子设备及存储介质 |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101002406A (zh) * | 2004-06-10 | 2007-07-18 | 三星电子株式会社 | 高效生成用于无线网络中的空中下载升级的增量文件的装置和方法 |
CN101232516A (zh) * | 2008-01-31 | 2008-07-30 | 北京航空航天大学 | 无线传感器网络应用中使用差分压缩的低功耗系统更新方法 |
-
2012
- 2012-09-06 CN CN201210327764.2A patent/CN103677869B/zh active Active
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101002406A (zh) * | 2004-06-10 | 2007-07-18 | 三星电子株式会社 | 高效生成用于无线网络中的空中下载升级的增量文件的装置和方法 |
CN101232516A (zh) * | 2008-01-31 | 2008-07-30 | 北京航空航天大学 | 无线传感器网络应用中使用差分压缩的低功耗系统更新方法 |
Non-Patent Citations (1)
Title |
---|
《EasiCache:一种基于缓存机制的低开销传感器网络代码更新方法》;邱杰凡 等;《计算机学报》;20120331;第35卷(第3期);第555-567页 * |
Also Published As
Publication number | Publication date |
---|---|
CN103677869A (zh) | 2014-03-26 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN103677869B (zh) | 无线传感器网络节点远程代码更新系统及方法 | |
CN101557583B (zh) | 直放站设备嵌入式软件的远程升级与版本切换方法 | |
CN102142006B (zh) | 分布式文件系统的文件处理方法及装置 | |
CN102299904B (zh) | 一种实现业务数据备份的系统及方法 | |
US10929046B2 (en) | Identifying and relocating hot data to a cache determined with read velocity based on a threshold stored at a storage device | |
CN102665196B (zh) | 一种无线传感器网络的在线渐进式程序更新方法 | |
CN103885807A (zh) | 设备程序更新方法 | |
CN110333881B (zh) | 一种基于星载fpga处理的载荷类设备软件在轨重构方法 | |
CN108415718B (zh) | 一种应用于星载软件在线更新的BootLoader设计方法 | |
CN102216899A (zh) | 管理高速缓存数据和元数据 | |
CN107515800A (zh) | 基于软件冗余的星载软件可靠性设计系统及方法 | |
CN102150131A (zh) | 管理高速缓存数据和元数据 | |
CN103871447A (zh) | 与非门快闪存储器阵列及芯片及其存取、读取及管理方法 | |
Shafi et al. | No-reboot and zero-flash over-the-air programming for wireless sensor networks | |
CN109683941A (zh) | 一种基于单芯片在线加载的应答机软件升级方法 | |
CN109521960A (zh) | 数据读写方法、装置和系统 | |
US20130238859A1 (en) | Cache with scratch pad memory structure and processor including the cache | |
CN105103136A (zh) | 共享和受管的存储器统一访问 | |
CN101459559A (zh) | 一种对监控用户配置信息进行存储及管理的方法与系统 | |
Li et al. | Code offload with least context migration in the mobile cloud | |
CN110308920B (zh) | 一种不影响正常运行的在轨修改星上产品软件的方法 | |
CN103488585B (zh) | 用于实现可重构系统中配置信息缓存更新的控制器 | |
CN102023845B (zh) | 一种基于状态机的Cache并发访问管理方法 | |
CN103970512A (zh) | 多核处理器及其并行重放方法 | |
Mazumder et al. | An efficient code update solution for wireless sensor network reprogramming |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |