CN103885807A - 设备程序更新方法 - Google Patents
设备程序更新方法 Download PDFInfo
- Publication number
- CN103885807A CN103885807A CN201410134219.0A CN201410134219A CN103885807A CN 103885807 A CN103885807 A CN 103885807A CN 201410134219 A CN201410134219 A CN 201410134219A CN 103885807 A CN103885807 A CN 103885807A
- Authority
- CN
- China
- Prior art keywords
- function
- code
- new
- region
- program
- 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.)
- Pending
Links
Images
Landscapes
- Stored Programmes (AREA)
Abstract
本发明提供了一种设备程序更新方法,包括:在计算差异代码之前,首先确定需要更新的函数;计算新旧函数之间的差异代码;将需要频繁进行更新的代码保存在RAM中;调用函数时,先跳转到指令数据混合列表,将需要更新的旧函数代码与差异代码一起重建新函数。本发明利用代码预取区域有效避免对高功耗flash的读写操作,利用函数级代码差异对比,保留程序结构信息,降低了重编程开销。
Description
技术领域
本发明涉及设备的程序升级和更新,特别涉及一种传感器的远程代码更新方法。
背景技术
在大规模无人值守的传感器网络中,受节点自身资源的限制和周围环境变化的影响,开发者很难在开发阶段全面考虑节点在部署后可能遇到的各种突发情况,因此需要通过远程代码更新对节点进行灵活地配置和升级。随着物联网的发展,作为感知前端的传感器网络会越来越多地担负起局部数据处理工作。这不仅要求节点具有数据采集和发送功能,更需要节点能够根据外部需求变化,主动调整自身功能,动态实现各种算法。
以水质监测传感器网络为例,传感器节点一旦被部署到水域中,一般不会被方便地取出。而其中一些传感器节点频繁发送数据,导致电池能量迅速耗尽,而利用远程代码更新,可以根据节点所处环境,动态地调整节点上的休眠机制和数据保存机制,从而有效地延长节点的生命周期。比如节点受波浪及天气影响较大,特别是阴雨天气,经常发生数据被阻塞的情况。利用远程代码更新可以提前更新路由策略,防止数据阻塞情况的发生。另一方面,通过远程代码更新动态调整传感器的调度策略可以提高监测效率。
较高的更新开销一直困扰着远程代码更新的大规模应用。更新开销主要包括两方面:一方面是节点之间发送和接收更新代码时产生的传输开销;另一方面是节点上重建和存储代码时产生的重编程开销。目前大多数远程代码更新方法主要针对如何降低传输开销,而对如何降低重编程开销则关注较少。以增量式代码更新方法为例,该类方法通过只传输新旧程序的差异代码。该类方法在代码重编程时,通常要对外部flash(由节点板载的扩展flash组成,如TelosB节点默认的扩展flash为STM25P)和嵌入式芯片的内部flash进行读写操作。较高的flash读写功耗导致这类方法的重编程开销超过传输开销。使用低功耗RAM代替高功耗flash存储代码可以有效降低重编程开销,但是由于RAM空间有限,一般不可能将所有需要更新的代码都放入RAM中,只能将一部分需要频繁更新的代码放入。当前可供参考的方案是由开发者在编程阶段指定放入RAM中的代码。这种方法仍然是以简单的传感器节点作为应用对象,没有考虑在物联网中节点可能由于外界应用需求的变化而频繁地调整自身功能,从而改变最初程序中各部分代码更新的频度。
因此,针对相关技术中所存在的上述问题,目前尚未提出有效的解决方案。
发明内容
为解决上述现有技术所存在的问题,本发明提出了一种设备的代码更新方法,包括:
在计算差异代码之前,首先确定需要更新的函数;
计算新旧函数之间的差异代码;
通过代码预取区域机制,将需要频繁进行更新的代码保存在RAM中;
调用函数时,先跳转到指令数据混合列表,由指令数据混合列表中的函数调用指令调用函数,
设备接收到函数更新脚本后,如果根据指令数据混合列表确定旧程序中相应的函数已经被保存到代码预取区域中,则将需要更新的旧函数代码与差异代码一起放入函数组装区域进行组合,重建新函数。
优选地,所述确定需要更新的函数的步骤进一步包括:
采用二级比较机制,即通过比对新旧代码的奇偶校验码和MD5码的方式确定需要更新的函数。
优选地,首先对旧程序中的所有函数分别生成奇偶校验码以及MD5码,并对旧程序本身再生成一次奇偶校验码和MD5码,当获得新程序的代码后,首先生成新程序的奇偶校验码。对新旧程序的奇偶校验码进行比较,如果不同,直接开始比较新旧程序中的各个函数;否则计算新程序的MD5码,继续与旧程序的MD5码进行比较,
将新程序中每个函数的奇偶校验码与旧程序中对应函数的奇偶校验码进行比较,如果不同,则确定需要更新的函数;然后对所有奇偶校验码相同的函数分别生成MD5码,继续比较。
优选地,所述计算新旧函数之间的差异代码的步骤进一步包括:
输入新旧程序的汇编文件,计算后输出为汇编语言组成的差异代码文件,所述差异代码文件包括:以函数为单位的新旧程序的差异代码,差异代码距离函数第一条指令的指令偏移数以及需要进行的重编程操作,
所述重编程操作包括:删除操作、插入操作和替换操作,
其中,替换操作直接写入新代码覆盖旧代码,插入操作或删除操作会改变旧函数的大小,当一个函数的更新仅仅涉及替换操作或删除操作时,通过写入无条件跳转指令或者空指令来实现删除操作,并通过直接覆盖原始代码实现替换操作,如果对函数的更新包含了插入操作,则需要对函数进行重建。
优选地,所述代码预取区域首先进行初始化,RAM中地址自低到高依次存放.bas段、.data段、.bssram段以及.dataram段、函数组装区域、管理列表区域、代码预取区域以及系统堆栈。
优选地,所述指令数据混合列表由函数信息数据以及对函数的调用指令组成,函数的调用指令包含了函数当前的存储地址,函数信息数据包含了函数编号、函数代码量以及更新次数,该更新次数指示当前函数已被更新的次数,同时通过正负数区分当前函数是否已被保存在代码预取区域中,正数表示当前函数保存在内部flash中,负数表示保存在代码预取区域中。
优选地,缓存代码的替换以函数为单位进行,将函数变化次数以及函数变化的程度同时考虑,首先定义反映函数变化情况的变化率,即更新过程中函数代码总量与程序代码总量之比,在第k次升级时,计算函数在第k次升级时的替换因子,即函数变化率与第k次升级时函数被更新的次数的点积;
如果需要更新的函数没有保存在代码预取区域中,且它的替换因子大于已经保存在代码预取区域中的若干个函数的,则需要计算替换出这若干个函数后腾出的缓存空间是否足够保存当前函数。如果可以,则将这若干个函数回写入内部flash中,并将该函数保存在缓存中。反之如果仍然没有足够的缓存空间,则将该函数写入内部flash中。
优选地,当新函数被放入代码预取区域或者回写到内部flash中时,可以将原函数所占用的空间重新释放,保存其它新函数,采用缓存空闲空间列表和Flash空闲空间列表管理空闲空间,并将这两个列表保存在管理列表区域,缓存空闲空间列表和Flash空闲空间列表分别记录了代码预取区域和内部flash中空闲空间的起始地址及大小,当新函数需要重新选择地址保存时,通过空闲空间列表查找合适的存储空间,修改空闲空间列表对应的项,并将对应的原始函数的起始地址和函数大小记录到空闲空间列表,释放对应原函数的存储空间。
优选地,将RAM中代码预取区域和管理列表的内容备份到内部flash中,将内部flash中text段的内容备份到外部flash中,当设备重启之后首先将外部flash中的text段内容读入内部flash,然后将内部flash中代码预取区域和管理列表的内容读入RAM中,完成程序恢复,
仅当程序需要进行重大升级时,才进行代码备份,并记录备份程序的版本号。当设备完成程序恢复后,如果发现当前程序的版本号过低,可以要求计算机端重新发送最新程序的更新脚本,并更新至最新的程序。
相比于现有技术,本发明的技术方案的具有以下优点:利用代码预取区域机制,有效避免对高功耗flash的读写操作,设计了相应的替换算法降低重编程开销,结合与代码预取区域机制相匹配的函数级代码差异对比方法,在减少更新代码传输量的同时,可以保留程序结构信息,进一步降低了重编程开销。
附图说明
图1是根据本发明实施例的设备程序的代码更新的方法流程图。
具体实施方式
多种方式可以用于(包括实施为过程;装置;系统;物质组成;在计算机可读存储介质上包括的计算机程序产品;和/或处理器(诸如如下处理器,该处理器被配置成执行在耦合到处理器的存储器上存储的和/或由该存储器提供的指令))实施本发明。在本说明书中,这些实施或者本发明可以采用的任何其他形式可以称为技术。一般而言,可以在本发明的范围内变更公开的过程的步骤顺序。除非另有明示,描述为被配置成执行任务的部件(诸如处理器或者存储器)可以实施为被临时配置成在给定时间执行该任务的一般部件或者被制造成执行该任务的具体部件。
下文与图示本发明原理的附图一起提供对本发明一个或者多个实施例的详细描述。结合这样的实施例描述本发明,但是本发明不限于任何实施例。本发明的范围仅由权利要求书限定,并且本发明涵盖诸多替代、修改和等同物。在下文描述中阐述诸多具体细节以便提供对本发明的透彻理解。出于示例的目的而提供这些细节,并且无这些具体细节中的一些或者所有细节也可以根据权利要求书实现本发明。
本发明的目的在于提供一种无线设备尤其是传感器网络的代码更新方法,考虑在物联网应用中更新代码的需求,基于缓存机制和差异替换技术对设备的代码进行最小代价的更新。
本发明考虑在物联网中节点可能由于外界应用需求的变化而频繁地调整自身功能,从而改变最初程序中各部分代码更新的频度。即针对以下事实作出改进:一部分保存在内部flash中原本不需要更新的代码开始进行频繁更新,引起大量的读写flash操作;而一部分保存在RAM中原本需要频繁更新的代码则很长时间不进行更新,却占据着有限的RAM空间。
本发明优选的实施例以采用嵌入式芯片MSP430F16的TelosB节点为例,作为无线传感器节点。telosB节点相对应的无线微型控制器所采用的无线通信模块均为Zigbee短距离无线通信模块。使用.nc文件生成可执行的.ihex文件。TelosB传感器节点将保存有程序结构信息的汇编文件(.s)作为生成差异代码的比较对象.而最终生成的.ihex文件将作为传输对象,它可以被嵌入式芯片直接执行。
图1是根据本发明实施例的传感器程序代码更新的方法流程图。如图1所示,实施本发明的具体步骤如下:
步骤一:在计算差异代码之前,首先确定哪些函数需要更新。
采用二级比较机制,即通过比对新旧代码的奇偶校验码和MD5码的方式确定需要更新的函数。
首先对旧程序中的所有函数分别生成奇偶校验码以及MD5码,并对旧程序本身再生成一次奇偶校验码和MD5码。由于生成MD5码的计算开销较大,当获得新程序的代码后,并不立即生成新程序的MD5码,而是首先生成新程序的奇偶校验码。对新旧程序的奇偶校验码进行比较,如果不同,直接开始比较新旧程序中的各个函数;否则计算新程序的MD5码,继续与旧程序的MD5码进行比较。
新旧函数的比较与新旧程序的比较类似。首先将新程序中每个函数的奇偶校验码与旧程序中对应函数的奇偶校验码进行比较,如果不同,则确定需要更新的函数;然后对所有奇偶校验码相同的函数分别生成MD5码,继续比较。
步骤二:在确定需要更新的函数之后,直接计算新旧函数之间的差异代码。
计算过程的输入为新旧程序的汇编文件(app.s);输出为汇编语言组成的差异代码文件(Diff.s)。差异代码文件(Diff.s)中包括:以函数为单位的新旧程序的差异代码,差异代码距离函数第一条指令的指令偏移数以及需要进行的重编程操作。
由于每一条汇编指令对应的机器指令长度是一定的,所以在得到指令偏移数之后,可以计算得到差异代码相对于函数起始地址的偏移量。重编程操作包括:删除操作、插入操作和替换操作。替换操作不会改变函数的大小,可以直接写入新代码覆盖旧代码。插入操作或删除操作会改变旧函数的大小。由于保存了程序的结构信息,当一个函数的更新仅仅涉及替换操作或删除操作时,可以通过写入无条件跳转指令(MP)或者空指令(NULL)来实现删除操作,并通过直接覆盖原始代码实现替换操作,避免函数的代码重建,有效降低重编程开销。如果对函数的更新包含了插入操作,则需要对这个函数进行重建。
差异代码文件Diff.s中的差异代码经过链接器链接和嵌入式代码格式转换器最终生成嵌入式芯片可执行的代码(.ihex文件)。这些可执行的代码、重编程操作以及修改地址组成了代码更新所需的更新脚本。另外,需要特别指出的是由于上述生成更新脚本的过程全部由计算机完成,不会消耗传感器节点的能量,也不会给传感器网络增添额外的开销。
步骤三:代码预取区域初始化
由于读写RAM与flash的功耗差异巨大,本发明通过代码预取区域机制将需要频繁进行更新的代码保存在RAM中,减少对flash的读写操作。
开发者可以在编程阶段将特定函数放入特殊段,并通过链接器设置特殊段的起始地址。由于MSP430F16的RAM与flash统一编址,通过设定特殊段的地址,可以将程序的部分函数保存在RAM中并执行。使用属性(attribute)对需要放入特殊段的函数进行标记。
另外如果开发者可以预见到若干全局变量未来可能需要频繁修改,也可以使用相同的方法,将这些全局变量分别放入dataram段(初始化全局变量段)或者bssram段(未初始化全局变量段),再通过设定这两个特殊段的地址将它们放入RAM中。
由于RAM中默认存放了.bss段和.data段,为了避免.bssram段、.dataram段、代码预取区域(.cache段)、函数组装区域(FunctionAssembler)以及管理列表区域(ManagementList)与RAM默认存放的段发生地址冲突,需要进行两次编译。在第一次编译时,设定所有区域和段位于相距较远的地址上。由于代码预取区域、函数组装区域以及管理列表区域的大小是预先设定的,在进行一次编译后,只需要计算.bas段、.data段、.bssram段以及.dataram段的大小,确定所有段和区域的最终地址后,再进行一次编译。
经过代码预取区域初始化后,RAM中地址自低到高依次存放了.bas段、.data段、.bssram段以及.dataram段、函数组装区域、管理列表区域、代码预取区域(.cache段)以及系统堆栈。
步骤四:函数的二次调用
执行删除或者插入操作之后会导致函数代码量发生变化。特别是执行插入操作后,可能会增加函数的代码量。由于函数是连续存放的,如果将代码量增加后的新函数仍保存到旧函数地址上,势必会覆盖与它相邻的函数,严重时会导致整个程序崩溃,所以必须将新函数转存到其它地址上。转存之后,这个函数的入口地址发生改变,意味着对这个函数进行调用的所有指令都需要进行更新,而更新这些指令可能会引起较大的更新开销。
为此需要使用函数的二次调用解决这个问题:调用函数时,并不是直接对函数进行调用,而是先跳转到指令数据混合列表(InstrumentandDateList),由指令数据混合列表中的函数调用指令调用真正的函数。
指令数据混合列表由函数信息数据以及对函数的调用指令组成。嵌入式芯片存储资源的稀缺性(例如MSP430F16的存储空间小于64KB)要求必须尽量复用存储空间。函数调用指令包含了函数当前的存储地址,因此将它与函数的信息数据进行空间复用。函数的信息数据包含了函数编号、函数代码量以及更新次数。更新次数指示当前函数已被更新的次数,同时通过正负数区分当前函数是否已被保存在代码预取区域中(正数表示当前函数保存在内部flash中,负数表示保存在代码预取区域中)。
指令数据混合列表保存在管理列表区域中。列表中每条函数调用指令的位置是固定的。当某个函数的入口地址发生了变化,只需要修改指令数据混合列表中调用这个函数的指令,而不再需要修改其他对这个函数的调用指令。函数的二次调用实际上是一种对函数地址的集中式管理,只需要修改指令数据混合列表中的一条调用指令,就可以完成对所有调用指令的修改。函数的二次调用相当于在调用函数时增加一条跳转指令。
步骤五:代码预取区域的替换
节点接收到函数更新脚本后,根据指令数据混合列表中函数更新次数的正负,确定旧程序中相应的函数是否已经被保存到代码预取区域中。如果代码预取区域已经保存了这个需要更新的函数,称之为命中。将需要更新的旧函数代码与差异代码一起放入函数组装区域进行组合,重建新函数。
代码预取区域的容量通常在节点部署之前确定。其确定原则是不能够影响RAM中.bss段、.data段以及系统堆栈正常使用。如果代码预取区域即将被耗尽,而重建函数的代码量超出了代码预取区域的剩余容量,则需要将保存在缓存中的部分函数回写到内部flash中,腾出空间存放新函数,这个过程称为替换。
传统缓存代码替换算法通常关注保存在缓存中的代码是否被执行。如:最近最少使用(LeastRecentlyUsed,LRU)算法以代码被执行的次数作为是否替换的主要因素。在本发明中,缓存代码的替换以函数为单位进行,如果仅仅以函数被更新次数为替换的主要因素,有可能出现这样一种情况:一个函数每次升级都需要更新,命中率较高,但函数代码变化较小;而另一个函数被更新次数较少,命中率较低,但发生更新时代码变化较大。这时有可能将函数替换出去,仍然需要对f1ash进行大量的读写操作。
为此本发明改进了替换算法,称为最近最少变化算法,将函数变化次数以及函数变化的程度同时考虑。
首先定义反映函数变化情况的变化率,即更新过程中函数代码总量与程序代码总量之比。变化率越大说明函数的变化程度越高,在第k次升级时,本发明将函数被更新的次数和函数变化的程度统一考虑,并计算函数在第k次升级时的替换因子,即函数变化率与第k次升级时函数被更新的次数的点积。
如果需要更新的函数没有保存在代码预取区域中,且它的替换因子大于已经保存在代码预取区域中的若干个函数的,则需要计算替换出这若干个函数后腾出的缓存空间是否足够保存当前函数。如果可以,则将这若干个函数回写入内部flash中,并将该函数保存在缓存中。反之如果仍然没有足够的缓存空间,则将该函数写入内部flash中。
在本发明优选的实施例中,该方法还包括管理空闲空间。函数代码量在更新后有可能增加,这时需要将更新后的函数放入新的地址。如果直接将新函数放入代码预取区域或者内部flash的末尾空间,会造成嵌入式芯片上的存储资源被迅速耗尽。为了节约有限的存储资源,当新函数被放入代码预取区域或者回写到内部flash中时,可以将原函数所占用的空间重新释放,保存其它新函数。
本发明设计了缓存空闲空间列表(FreeCacheList)和Flash空闲空间列表管理空闲空间,并将这两个列表保存在管理列表区域。缓存空闲空间列表和Flash空闲空间列表分别记录了代码预取区域和内部flash中空闲空间的起始地址及大小。当新函数需要重新选择地址保存时,可以通过空闲空间列表查找合适的存储空间。转存之后,需要修改空闲空间列表对应的项,并将对应的原始函数的起始地址和函数大小记录到空闲空间列表,释放对应原函数的存储空间。
在本发明进一步优选的实施例中,由于使用易挥发性的RAM保存代码,当节点断电重启时可能导致RAM中的关键代码丢失,因此需要通过备份代码来消除潜在的程序安全隐患。本发明将RAM中代码预取区域和管理列表的内容备份到内部flash中,将内部flash中text段的内容备份到外部flash中。当节点重启之后首先将外部flash中的。text段内容读入内部flash,然后将内部flash中代码预取区域和管理列表的内容读入RAM中,完成程序恢复。为了尽量避免对flash的读写操作,并不是每一次升级都进行代码备份。只有当程序需要进行重大升级时,才进行代码备份,并记录备份程序的版本号。当节点完成程序恢复后,如果发现当前程序的版本号过低,可以要求计算机端重新发送最新程序的更新脚本,并更新至最新的程序。
综上所述,本发明利用代码预取区域机制,有效避免对高功耗flash的读写操作,设计了相应的替换算法降低重编程开销,结合与代码预取区域机制相匹配的函数级代码差异对比方法,在减少更新代码传输量的同时,可以保留程序结构信息,进一步降低了重编程开销。
显然,本领域的技术人员应该理解,上述的本发明的各模块或各步骤可以用通用的计算系统来实现,它们可以集中在单个的计算系统上,或者分布在多个计算系统所组成的网络上,可选地,它们可以用计算系统可执行的程序代码来实现,从而,可以将它们存储在存储系统中由计算系统来执行。这样,本发明不限制于任何特定的硬件和软件结合。
应当理解的是,本发明的上述具体实施方式仅仅用于示例性说明或解释本发明的原理,而不构成对本发明的限制。因此,在不偏离本发明的精神和范围的情况下所做的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。此外,本发明所附权利要求旨在涵盖落入所附权利要求范围和边界、或者这种范围和边界的等同形式内的全部变化和修改例。
Claims (10)
1.一种设备程序更新方法,其特征在于,包括:
在计算差异代码之前,首先确定需要更新的函数;
计算新旧函数之间的差异代码;
通过代码预取区域机制,将需要频繁进行更新的代码保存在RAM中;
调用函数时,先跳转到指令数据混合列表,由指令数据混合列表中的函数调用指令调用函数,
设备接收到函数更新脚本后,如果根据指令数据混合列表确定旧程序中相应的函数已经被保存到代码预取区域中,则将需要更新的旧函数代码与差异代码一起放入函数组装区域进行组合,重建新函数。
2.根据权利要求1所述的方法,其特征在于,所述确定需要更新的函数的步骤进一步包括:
采用二级比较机制,即通过比对新旧代码的奇偶校验码和MD5码的方式确定需要更新的函数。
3.根据权利要求2所述的方法,其特征在于,还包括:
首先对旧程序中的所有函数分别生成奇偶校验码以及MD5码,并对旧程序本身再生成一次奇偶校验码和MD5码,当获得新程序的代码后,首先生成新程序的奇偶校验码,对新旧程序的奇偶校验码进行比较,如果不同,直接开始比较新旧程序中的各个函数;否则计算新程序的MD5码,继续与旧程序的MD5码进行比较,
将新程序中每个函数的奇偶校验码与旧程序中对应函数的奇偶校验码进行比较,如果不同,则确定需要更新的函数;然后对所有奇偶校验码相同的函数分别生成MD5码,继续比较。
4.根据权利要求1所述的方法,其特征在于,所述计算新旧函数之间的差异代码的步骤进一步包括:
输入新旧程序的汇编文件,计算后输出为汇编语言组成的差异代码文件,所述差异代码文件包括:以函数为单位的新旧程序的差异代码,差异代码距离函数第一条指令的指令偏移数以及需要进行的重编程操作,
所述重编程操作包括:删除操作、插入操作和替换操作,
其中,替换操作直接写入新代码覆盖旧代码,插入操作或删除操作会改变旧函数的大小,当一个函数的更新仅仅涉及替换操作或删除操作时,通过写入无条件跳转指令或者空指令来实现删除操作,并通过直接覆盖原始代码实现替换操作,如果对函数的更新包含了插入操作,则需要对函数进行重建。
5.根据权利要求1所述的方法,其特征在于,所述代码预取区域首先进行初始化,RAM中地址自低到高依次存放.bas段、.data段、.bssram段以及.dataram段、函数组装区域、管理列表区域、代码预取区域以及系统堆栈。
6.根据权利要求1所述的方法,其特征在于,所述指令数据混合列表由函数信息数据以及对函数的调用指令组成,函数的调用指令包含了函数当前的存储地址,函数信息数据包含了函数编号、函数代码量以及更新次数,该更新次数指示当前函数已被更新的次数,同时通过正负数区分当前函数是否已被保存在代码预取区域中,正数表示当前函数保存在内部flash中,负数表示保存在代码预取区域中。
7.根据权利要求1所述的方法,其特征在于,该方法还包括:
缓存代码的替换以函数为单位进行,将函数变化次数以及函数变化的程度同时考虑,首先定义反映函数变化情况的变化率,即更新过程中函数代码总量与程序代码总量之比,在第k次升级时,计算函数在第k次升级时的替换因子,即函数变化率与第k次升级时函数被更新的次数的点积;
如果需要更新的函数没有保存在代码预取区域中,且它的替换因子大于已经保存在代码预取区域中的若干个函数的,则需要计算替换出这若干个函数后腾出的缓存空间是否足够保存当前函数。如果可以,则将这若干个函数回写入内部flash中,并将该函数保存在缓存中。反之如果仍然没有足够的缓存空间,则将该函数写入内部flash中。
8.根据权利要求1所述的方法,其特征在于,该方法还包括:
当新函数被放入代码预取区域或者回写到内部flash中时,可以将原函数所占用的空间重新释放,保存其它新函数,采用缓存空闲空间列表和Flash空闲空间列表管理空闲空间,并将这两个列表保存在管理列表区域,缓存空闲空间列表和Flash空闲空间列表分别记录了代码预取区域和内部flash中空闲空间的起始地址及大小,当新函数需要重新选择地址保存时,通过空闲空间列表查找合适的存储空间,修改空闲空间列表对应的项,并将对应的原始函数的起始地址和函数大小记录到空闲空间列表,释放对应原函数的存储空间。
9.根据权利要求1所述的方法,其特征在于,该方法还包括:
将RAM中代码预取区域和管理列表的内容备份到内部flash中,将内部flash中text段的内容备份到外部flash中,当设备重启之后首先将外部flash中的text段内容读入内部flash,然后将内部flash中代码预取区域和管理列表的内容读入RAM中,完成程序恢复,
仅当程序需要进行重大升级时,才进行代码备份,并记录备份程序的版本号。当设备完成程序恢复后,如果发现当前程序的版本号过低,可以要求计算机端重新发送最新程序的更新脚本,并更新至最新的程序。
10.根据权利要求1所述的方法,其特征在于,所述设备为无线传感器。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410134219.0A CN103885807A (zh) | 2014-04-03 | 2014-04-03 | 设备程序更新方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410134219.0A CN103885807A (zh) | 2014-04-03 | 2014-04-03 | 设备程序更新方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN103885807A true CN103885807A (zh) | 2014-06-25 |
Family
ID=50954717
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201410134219.0A Pending CN103885807A (zh) | 2014-04-03 | 2014-04-03 | 设备程序更新方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN103885807A (zh) |
Cited By (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105740038A (zh) * | 2016-02-02 | 2016-07-06 | 浙江工业大学 | 一种面向物联网重编程的存储优化方法 |
CN106020882A (zh) * | 2016-05-18 | 2016-10-12 | 青岛海信电器股份有限公司 | 一种应用升级方法、智能终端及升级系统 |
CN107992323A (zh) * | 2017-12-27 | 2018-05-04 | 深圳市科陆电子科技股份有限公司 | 一种集中器升级方法和系统 |
CN110312991A (zh) * | 2017-02-17 | 2019-10-08 | 日立汽车系统株式会社 | 信息处理装置 |
CN110719328A (zh) * | 2019-10-09 | 2020-01-21 | 广州粒子微电子有限公司 | 一种下载程序的方法 |
CN110737603A (zh) * | 2018-07-18 | 2020-01-31 | 炬新(珠海)微电子有限公司 | 一种替换rom中函数的方法及装置 |
CN111124444A (zh) * | 2018-11-01 | 2020-05-08 | 百度在线网络技术(北京)有限公司 | 代码注入的方法及其装置、计算机程序产品、存储介质 |
CN112711439A (zh) * | 2021-01-19 | 2021-04-27 | 天津飞腾信息技术有限公司 | 一种asic代码转换为fpga代码自动更新方法 |
CN113900680A (zh) * | 2020-07-06 | 2022-01-07 | 中国移动通信集团重庆有限公司 | 代码管理方法、装置及计算设备 |
-
2014
- 2014-04-03 CN CN201410134219.0A patent/CN103885807A/zh active Pending
Non-Patent Citations (1)
Title |
---|
邱杰凡,李栋,石海龙,杜文振,崔莉: "《EasiCache:一种基于缓存机制的低开销传感器网络代码更新方法》", 《计算机学报》 * |
Cited By (11)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105740038A (zh) * | 2016-02-02 | 2016-07-06 | 浙江工业大学 | 一种面向物联网重编程的存储优化方法 |
CN105740038B (zh) * | 2016-02-02 | 2019-04-23 | 浙江工业大学 | 一种面向物联网重编程的存储优化方法 |
CN106020882A (zh) * | 2016-05-18 | 2016-10-12 | 青岛海信电器股份有限公司 | 一种应用升级方法、智能终端及升级系统 |
CN110312991A (zh) * | 2017-02-17 | 2019-10-08 | 日立汽车系统株式会社 | 信息处理装置 |
CN107992323A (zh) * | 2017-12-27 | 2018-05-04 | 深圳市科陆电子科技股份有限公司 | 一种集中器升级方法和系统 |
CN110737603A (zh) * | 2018-07-18 | 2020-01-31 | 炬新(珠海)微电子有限公司 | 一种替换rom中函数的方法及装置 |
CN111124444A (zh) * | 2018-11-01 | 2020-05-08 | 百度在线网络技术(北京)有限公司 | 代码注入的方法及其装置、计算机程序产品、存储介质 |
CN111124444B (zh) * | 2018-11-01 | 2023-12-19 | 百度在线网络技术(北京)有限公司 | 代码注入的方法及其装置、计算机程序产品、存储介质 |
CN110719328A (zh) * | 2019-10-09 | 2020-01-21 | 广州粒子微电子有限公司 | 一种下载程序的方法 |
CN113900680A (zh) * | 2020-07-06 | 2022-01-07 | 中国移动通信集团重庆有限公司 | 代码管理方法、装置及计算设备 |
CN112711439A (zh) * | 2021-01-19 | 2021-04-27 | 天津飞腾信息技术有限公司 | 一种asic代码转换为fpga代码自动更新方法 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN103885807A (zh) | 设备程序更新方法 | |
CN102142006B (zh) | 分布式文件系统的文件处理方法及装置 | |
CN103677869B (zh) | 无线传感器网络节点远程代码更新系统及方法 | |
CN102693145B (zh) | 用于嵌入式系统的差分升级方法 | |
CN103098043B (zh) | 随需虚拟机映像流式传输的方法和系统 | |
CN106155915B (zh) | 数据存储的处理方法及装置 | |
CN105493053A (zh) | 多核处理器中的高速缓存划分 | |
US20170199817A1 (en) | Data storage device, data storage method, and non-transitory computer readable medium | |
JP2017527887A (ja) | ファイルシステムにおけるフラッシング | |
KR20150036176A (ko) | 비휘발성 메모리에 코드를 캐싱하는 방법들, 시스템들 및 장치 | |
CN102819494B (zh) | 一种闪存顺序写入时的优化方法 | |
CN105144120A (zh) | 基于存储器地址将来自高速缓存行的数据存储到主存储器 | |
CN109117088B (zh) | 一种数据处理方法及系统 | |
CN103136019A (zh) | 用于加载配置信息的方法和装置 | |
US8484435B2 (en) | Method for updating data in memories using a memory management unit | |
CN107566169A (zh) | 一种基于openwrt的固件升级方法及路由器 | |
CN106843954A (zh) | 传感器节点远程升级方法 | |
JP7366122B2 (ja) | プロセッサのフィルタリングされた分岐予測構造 | |
AU2013380500B2 (en) | Database device, program, and data processing method | |
US11099832B2 (en) | Method for updating a bootloader of a controller of a light | |
CN106844101A (zh) | 基于Cache感知的NVP性能优化备份方法及系统 | |
CN102169464B (zh) | 一种用于非易失性存储器的缓存方法、装置及智能卡 | |
CN103425761A (zh) | 一种对打包文件进行碎片整理的方法、系统及设备 | |
WO2018125408A1 (en) | Automatic identification and generation of non-temporal store and load operations in a dynamic optimization environment | |
CN102023845A (zh) | 一种基于状态机的Cache并发访问管理方法 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
RJ01 | Rejection of invention patent application after publication | ||
RJ01 | Rejection of invention patent application after publication |
Application publication date: 20140625 |