一种面向物联网重编程的存储优化方法与流程

文档序号:13743291阅读:101来源:国知局
技术领域本发明涉及一种基于分页机制的重编程存储优化方法,它能够有效地降低对高功耗存储单元的读写操作数量,从而缓解工业实践中现有重编程方法普遍存在着的传输和重组开销过高的问题。

背景技术:
随着传感技术和无线通信技术的快速发展,无线传感器网络(wirelesssensornetwork)受到广泛的关注,物联网也飞速发展发展,越来越多的物联网应用示范项目已经在多个领域取得了成功。这些物联网系统与传统传感器网络类似,往往都是为解决某一领域的特定问题或者满足特定区域的具体需求而构建的。在构建的过程中,各个网络由于采用了不同的硬件设备、软件模块甚至编程方法,形成了众多异构的物联网。但是网络之间相对独立,缺乏有效的协同,因而越来越多的研究者认为:物联网应该是以连接和协调众多异构计算网络为目的的全局性网络。物联网的未来发展趋势是整合网络中的各种节点设备资源,由使用者根据自己的需求动态地组合复用设备,因此需要各种节点设备具备无线重编程的能力,以动态地调整自身功能。未来在大多数物联网应用场景中,将允许使用者根据自己的需求复用当前已部署的物联网节点设备,从而要求节点设备具备对本地软件程序无线重编程的能力。然而,现有重编程方法普遍存在着传输和重组开销过高的问题。物联网基础设施中包含大量电池供电的节点设备,无线重编程的能量开销主要来自于节点间发送和接收代码时产生的传输开销,以及节点上读写存储单元时产生的重组开销,频繁地使用重编程升级节点设备上的软件程序,会影响节点的使用寿命。增量式重编程方法能有效减少传输开销,它是通过传输新旧代码的差异代码完成软件升级。然而,这类增量式重编程方法需要在节点本地存储单元中重建新程序镜像。如果根据不同使用者的需求在几个程序镜像中反复切换,则可以预先将差异代码保存在大容量存储单元中,避免重复数据的传输,这时重编程开销将主要取决于在节点本地对新镜像的代码重组开销。重编程的能量开销主要来源于无线传输代码的代码传输开销和节点本地存储单元执行读写操作的重做开销。节点MUC内部易失性RAM的读写能量开销要远小于对非易失性存储单元flash。因此,我们降低重编程重组开销时,主要目的在于尽可能减少对flash的读写操作,将操作尽可能转变为关于RAM的读写操作。为此可以将频繁更新的代码段以函数(function)为单位缓存到低功耗RAM中并执行,以有效减少对flash的读写操作。然而,由于重编程方法普遍存在着的传输和重组开销过高并且物联网应用需求改变具有随机性,节点软件程序可能发生剧烈变化,在软件连续升级初期,缓存命中率较低。

技术实现要素:
为了克服已有重编程方法传输和重组开销过高、物联网应用需求改变具有随机性、节点软件程序可能发生剧烈变化、在软件连续升级初期缓存命中率较低的不足,本发明提供了一种面向物联网重编程的存储优化方法,改善重编程方法普遍存在着的传输和重组开销过高的问题。并且有效缓解由于物联网应用需求改变具有随机性,节点软件程序可能发生剧烈变化,在软件连续升级初期,动态特征信息不足导致的命中率下降问题。本发明解决其技术问题所采用的技术方案是:一种面向物联网重编程的存储优化方法,根据使用者编写的新程序镜像自动执行重编程任务,过程如下:首先将在计算机端根据新旧镜像以函数为单位生成差异代码;随后,计算机通过串口将包含差异代码与重编程操作的增量脚本(deltascript)后发往汇聚节点(Sink);汇聚节点收到增量脚本之后,以无线多跳(multi-hop)方式将增量脚本发往待升级节点;在待升级节点收到包含差异代码的增量脚本后,将增量脚本下载到RAM中与旧函数代码组合后,生成新函数;如果新函数的尺寸超过了旧函数的尺寸,则需要在调整其所在函数页中相关函数的位置,以便放入尺寸增大后的新函数;重新计算当前函数页的整体替换权重值之后,判断是否需要缓存当前函数页;如果需要,则将函数页整体放入缓存区。进一步,通过将多个具有相似性的函数聚合成一个函数页(functionpage),使得每个函数页的尺寸相对固定。整个程序镜像将被平均地划分为多个以函数页为单位的代码段,同时向每个函数页fpx的末尾增加一个尺寸为Ex溢出空间(slopregion),专门用于函数尺寸增大时的位置调整。再进一步,给定函数u和函数v,令N(u)和N(v)分别表示u和v中需要调用的函数.通过Jaccard公式计算函数u和函数v的相似度:suv=|N(u)∩N(v)||N(u)∪N(v)|---(1)]]>或者通过余弦相似度计算:suv=|N(u)∩N(v)||N(u)||N(v)|---(2).]]>更进一步,使用寄存器相对寻址方式代替直接寻址方式,对函数页内函数地址的集中管理;若干函数已经被聚合到一个函数页中,当函数页整体被放入缓存区时,函数页包含的所有函数的入口地址都将发生变化。在考虑重编程动态特征的同时,将程序结构作为重编程静态特征引入函数页的缓存算法,该缓存算法基于函数页之间的调用关系建立映射结构图,并利用马尔科夫链分析各个函数页在初始阶段被更新的可能性;当前函数页是否容易被修改,来自于是否有很多函数页被当前函数页调用,如果一个函数页包含多个对其它函数页的调用,则其被修改更新的概率更高,应该更长时间地留在缓存中;赋予每一个函数页缓存权重值W(fpx),决定是否将函数页替换出缓存。本发明的技术构思为:将需要频繁更新的函数保存到RAM中,减少读取内部flash中保存的代码,同时也考虑到缓存使用率以及命中率下降的问题。该方法通过分页机制,将可能同时更新的相似函数聚合到一个函数页中,在降低缓存碎片化程度的同时,可以提高缓存的命中率。并通过在每一个函数页中添加溢出空间实现了函数位置的局部调整。本发明的有益效果主要表现在:(1)缓存碎片化程度低,缓存命中率和利用率比较高。(2)缓存开销和能量开销比较低。(3)函数分页化后对于程序的执行效率的影响不大。附图说明图1为节点升级装置组成示意图;图2为重编程方法存储结构示意图;图3为函数调用的流程图;图4为函数二次调用示意图;图5为存储优化方法的执行实现的结构示意图;图6为采用存储优化方法后的程序镜像编译阶段流程图;图7为采用存储优化方法后的重编程阶段流程图。具体实施方式下面结合附图和具体实施方法对本发明做进一步说明。应该指出的是,所描述的实施案例仅旨在便于对本发明的理解,而对其不起任何限定作用。参照图1~图7,一种面向物联网重编程的存储优化方法,根据使用者编写的新程序镜像自动执行重编程任务,过程如下:首先将在计算机端根据新旧镜像以函数为单位生成差异代码;随后,计算机通过串口将包含差异代码与重编程操作的增量脚本(deltascript)后发往汇聚节点(Sink);汇聚节点收到增量脚本之后,以无线多跳(multi-hop)方式将增量脚本发往待升级节点;在待升级节点收到包含差异代码的增量脚本后,将增量脚本下载到RAM中与旧函数代码组合后,生成新函数;如果新函数的尺寸超过了旧函数的尺寸,则需要在调整其所在函数页中相关函数的位置,以便放入尺寸增大后的新函数;重新计算当前函数页的整体替换权重值之后,判断是否需要缓存当前函数页;如果需要,则将函数页整体放入缓存区。进一步,通过将多个具有相似性的函数聚合成一个函数页(functionpage),使得每个函数页的尺寸相对固定。整个程序镜像将被平均地划分为多个以函数页为单位的代码段,同时向每个函数页fpx的末尾增加一个尺寸为Ex溢出空间(slopregion),专门用于函数尺寸增大时的位置调整,为了保证每个函数页可以被灵活地增量修改。解决了函数尺寸不确定导致的存储空间浪费问题。再进一步,借鉴了推荐系统中常用的协同过滤思想描述函数之间的相似度.给定函数u和函数v,令N(u)和N(v)分别表示u和v中需要调用的函数.可以通过Jaccard公式计算函数u和函数v的相似度:suv=|N(u)∩N(v)||N(u)∪N(v)|---(1)]]>或者通过余弦相似度计算:suv=|N(u)∩N(v)||N(u)||N(v)|---(2).]]>更进一步,针对函数页的缓存特点,重新设计函数的调用和加载方式。使用寄存器相对寻址方式代替直接寻址方式,通过对函数页内函数地址的集中管理,有效减少由于缓存函数页导致的读写操作。在本方法中,若干函数已经被聚合到一个函数页中,当函数页整体被放入缓存区时,函数页包含的所有函数的入口地址都将发生变化。为此,需要在原有函数二次调用的基础上,采用更加高效的方式完成对函数地址的管理。如表1所示,采用了一种改进的指令数据混合列表。表1最后在考虑重编程动态特征的同时,将程序结构作为重编程静态特征引入函数页的缓存算法。该算法基于函数页之间的调用关系建立映射结构图,并利用马尔科夫链分析各个函数页在初始阶段被更新的可能性,有效提高了连续升级过程中,初始阶段的缓存命中率。当前函数页是否容易被修改,来自于是否有很多函数页被当前函数页调用。如果一个函数页包含多个对其它函数页的调用,则其被修改更新的概率更高,应该更长时间地留在缓存中。我们赋予每一个函数页缓存权重值W(fpx),决定是否将函数页替换出缓存。在本方法中,若干函数已经被聚合到一个函数页中,当函数页整体被放入缓存区时,函数页包含的所有函数的入口地址都将发生变化。为此,需要在原有函数二次调用的基础上,采用更加高效的方式完成对函数地址的管理。图1是本发明中硬件设备系统升级的实施装置,它包括计算机端和节点端。图中,增量脚本在计算机端生成,首先转发给汇聚节点,然后汇聚节点通过多跳路由到达待升级节点。图2是基本的增量重编程方法的存储结构示意图。TelosB节点的微控制器(MCU)采用flash+RAM的存储结构。当执行行代码重组时,首先将差异代码外部flash,然后和旧程序整合成新程序,最后将新程序写入MUC的内部flash中。图3是函数调用的流程图,函数调用是要进行二次调用。图4是函数页的函数调用和加载方式,使用寄存器相对寻址方式代替直接寻址方式,通过对函数页内函数地址的集中管理,有效减少由于缓存函数页导致的读写操作。图3中.data段表示数据段,.bss段表示用来存放程序中未初始化的全局变量和静态变量的一块内存区域,text段表示代码段。由于需要频繁地对若干全局变量进行修改,定义了.dataram段表示初始化全局变量段,.bssdata段表示未初始化全局变量段,它们都被设定特殊地址放入RAM中。FunPage1~FunPage7表示1-7号函数页,Time1.fired、Time1.fired表示依次调用的函数,Ex表示溢出空间。callFP1Base(r5)、callFP1Base(r5)依次表示FunPage1和FunPage2函数页的地址函数。如图3所示,函数需要进行二次调用,位于在函数页FunPage1中的函数Time1.fired地址为0X1250,被存储到RAM中。当调用函数Time1.fired指令时,需要先跳转到指令混合列表相应函数页的地址函数(地址为0xB010H),然后获得函数Time1.fired的入口地址的存储地址(0xB013H),取得Time1.fired真实地址完成调用。图5是存储优化方法的具体实现过程。它根据使用者编写的新程序镜像自动执行重编程任务.首先将在计算机端根据新旧镜像以函数为单位生成差异代码。随后,计算机通过串口将包含差异代码与重编程操作的增量脚本(deltascript)后发往汇聚节点(Sink)。汇聚节点收到增量脚本之后,以无线多跳(multi-hop)方式将增量脚本发往待升级节点。在待升级节点收到包含差异代码的增量脚本后,将增量脚本下载到RAM中与旧函数代码组合后,生成新函数。如果新函数的尺寸超过了旧函数的尺寸,则需要在调整其所在函数页中相关函数的位置,以便放入尺寸增大后的新函数。重新计算当前函数页的整体替换权重值之后,判断是否需要缓存当前函数页。如果需要,则将函数页整体放入缓存区。最终,软件重启节点,开始执行新的程序镜像。在程序编译阶段实现函数的分页机制,需要执行两次编译。程序镜像编译阶段流程如图6所示。步骤301,第一次编译过程中,针对TinyOS死代码消除机制做出修改,保留与当前需要执行函数相关的所有函数。然后,通过读取可执行文件(.exe)的符号表,建立函数表。步骤302,函数表在程序镜像编译后自动生成,并根据新的程序镜像进行调整。利用函数之间的调用关系,可以计算出所有函数两两之间的相似度,用于确定函数页划分方案。依照这个方案,重新调整所有函数的位置,并为每个函数页预留相应的溢出空间。步骤303,根据函数新位置,第二次重新编译源文件。在预编译阶段,先修改函数的调用方式并加入寄存器赋值指令,随后调整函数的存储位置并修改函数表中对应函数的地址。步骤304,根据函数页的调用关系,计算出每个函数页的初始替换权重值,并最终生成分页的程序镜像(.exe文件)。在节点部署之后,节点运行时系统将根据使用者编写的新程序镜像自动执行重编程任务。如图7为节点重编程阶段流程图。步骤401,在计算机端根据新旧镜像以函数为单位生成差异代码。步骤402,计算机通过串口将包含差异代码与重编程操作的增量脚本(deltascript)后发往汇聚节点(Sink)。步骤403,汇聚节点收到增量脚本之后,以无线多跳(multi-hop)方式将增量脚本发往待升级节点。步骤404,升级节点收到包含差异代码的增量脚本后,将增量脚本下载到RAM中与旧函数代码组合后,生成新函数。如果新函数的尺寸超过了旧函数的尺寸,则需要在调整其所在函数页中相关函数的位置,以便放入尺寸增大后的新函数。重新计算当前函数页的整体替换权重值之后,判断是否需要缓存当前函数页。如果需要,则将函数页整体放入缓存区。最终,软件重启节点,开始执行新的程序镜像。本方法可以适用于现有大多数传感器网络操作系统,这里我们以较为流行的TinyOS为例。重编程过程可以分为两个阶段:对程序镜像编译的编译阶段,以及在部署之后对节点重编程的运行阶段。应该指出的是,所描述的实施案例仅旨在便于对本发明的理解,而对其不起任何限定作用。
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1