专利名称::一种嵌入式系统的错误侦测和修复方法
技术领域:
:本发明属于计算机
技术领域:
,特别涉及了一种嵌入式系统的错误侦测和修复方法。
背景技术:
:由于嵌入式系统的快速发展,目前嵌入式系统发展趋势为系统晶片、低耗电的通讯模块和低电源的系统架构。正朝着更小而且更省电的嵌入式系统设计迈进,而无线传感器正是在这种趋势下衍生出来的嵌入式系统。无线传感器节点拥有侦测与计算的能力,通过无线的方式通信,每一个传感器节点的硬件由嵌入式微处理器、存储器、传感器、无线通信模块及电池组成。无线传感器节点是资源受限的嵌入式系统,在其上的微处理器不具有存储管理单元。在无线传感网络上如何避免存储器错误而导致系统出错,势必成为一个重要问题。尤其在动态载入模块到存储空间时,更易产生错误。每个可动态载入的应用模块都有自己可存取的存储空间范围,当其试图存取合法范围以外的地方,则视为错误。在实际应用中,大部分的无线传感器节点散布在人为难以到达的地方,代替人类在难以到达的地方搜集需要的信息。因为这个特性,无线传感网络硬件设备架设完成后,使用者便不容易以人为方式到达这些被散布在外的节点上做错误修复的动作。当某些节点上面的系统出现错误而失去它的功用,这个系统的使用者无法马上得知这些错误,只能等使用者主动散步侦测信息或等到回传的资料出现错误才能发现。这些回传资料出现错误也会影响到搜集信息的正确性。目前无线传感器节点上的微处理器大部分都不具有存储管理单元,因此在无线传感器节点上的系统无法避免应用程序对系统核心的存储空间做存取的动作,此危险动作会影响到该节点的正常运行,可能会让系统产生不可预期的错误。
发明内容本发明的目的就是提供一种嵌入式系统的错误侦测和修复方法,避免应用程序侵占操作系统所属的存储空间,或侵占其它应用程序所属的存储空间。本发明中侦测嵌入式系统错误的方法包括静态检查和动态检査。静态检査的具体方法是检査所有静态给定存储空间位址的存储器存储指令,所述的存储器存储指令包括直接调用指令和相对跳跃指令;同一模块内的函数调用采用相对跳跃指令,不同模块内的函数调用采用直接调用指令;直接调用指令和相对跳跃指令格式如下InstructionOperationCallkPC=kJmp.+kPC=PC+kJmp.-kPC=PC-k如果直接调用后面给定位址中的任何一个位址不是系统调用跳跃表里面的其中一个合法值,则该模块为不合法,不能上传到传感器节点上;如果全部直接调用都是跳跃表里的合法值,则该模块为合法。动态检查的具体方法是步骤(l).改写模块内容、增加指令,就是把存储空间位址作为参数传进动态检査系统内以备调用;在编译时,如果目的位址无法在给定的指令前插入检査指令,则将欲存取的的存储空间位址设为参数,用来检査该位址的合法性;这些指令包括三形式,分别为间接调用、载入和存储,指令格式如下InstructionOperationicallPC=Z(R31:R30)IdRd,XRd=[X(R27:R26)]IdRd,YRd:[Y(R29駕)]IdRd,ZRd=[Z(R31:R30)]stX,Rr[X(R27:R26)]=RrstY,Rr[Y(R29:R28)]:RrstZ,Rr[Z(R31:R30)]=Rr当一段连续载入或存储指令出现时,并且其目的位址连续、中间未被修改,则在这一段连续存取指令的第一个存取指令前加上两个位址的检査,分别是这个连续存取存储空间位址的开头和结尾,如果确定两个位址的检査均5合法,则该段连续的存取都合法。步骤(2).检査调用存储空间位址和检查存储器载入存储过程,当一个调用的位址被传入时,这个函数首先取得该模块的编号,使用系统内原本提供的系统函数;然后依序检査该位址是否是系统调用的进入点、向系统预约的其它模块函数进入点或模块本身内部的跳跃点,如果是系统调用的进入点、向系统预约的其它模块函数进入点或模块本身内部的跳跃点中的任何一个,则存取合法,进行回传;如果不是系统调用的进入点、向系统预约的其它模块函数进入点或模块本身内部的跳跃点中的任何一个,则为发生错误。本发明中修复嵌入式系统错误的方法具体是.步骤(l).如果侦测出有错,则有错的模块立即停止工作;步骤(2).向服务器发送替换出错模块的请求,服务器收到请求后,检査是否有其它版本,如果有,则将另一版本加载到传感器节点上,用来取代原来模块的工作;如果没有,则传递原来版本再试一次,若再次出错,且没有发现其它版本,则修复无效,服务器留下记录告知使用者。本发明在S0S系统上以最小的修改系统架构方式,提出了一种可侦测存储器存取错误,并能使用模块替换的方式加以修复的方法。能够有效地增加无线传感网络的可用性,使存储器存取错误产生机会减少,搜集的信息也能更加有效益,在维护系统上更是轻而易举,不必担心何时该侦测网络上的无线传感器节点是否出错,就算可能出错的传感器节点也会被侦测到并主动修复,不需要有人随时在服务器端守候。具体实施例方式本发明用在S0S操作系统上,所选用传感器节点为Mica2Mote,其上的微处理器为Atmegal28L,使用的指令集为AVRInstructionSet。侦测嵌入式系统错误的方法包括静态检査和动态检查。静态检査的具体方法是检查所有静态给定存储空间位址的存储器存储指令,所述的存储器存储指令包括直接调用指令和相对跳跃指令;同一模块内的函数调用采用相对跳跃指令,不同模块内的函数调用采用直接调用指令;直接调用指令和相对跳跃指令格式如下InstructionOperationCallkPC=kJmp.+kPC=PC+kJmp.—kPOPC-k如果直接调用后面给定位址中的任何一个位址不是系统调用跳跃表里面的其中一个合法值,则该模块为不合法,不能上传到传感器节点上;如果全部直接调用都是跳跃表里的合法值,则该模块为合法。具体方法是将跳跃表的开头位址加上在跳跃表内的顺序乘以2,被检査的位址其值减掉跳跃表的开头位址后,将该值再除以2,若为整数,即为合法地址;否则不合法。动态检査的具体方法是步骤(l).改写模块内容、增加指令,就是把存储空间位址作为参数传进动态检査系统内以备调用;在编译时,如果目的位址无法在给定的指令前插入检查指令,则将欲存取的的存储空间位址设为参数,用来检査该位址的合法性;这些指令包括三形式,分别为间接调用、载入和存储,指令格式如下InstructionOperationicallPOZ(R31:R30)IdRd,XRd=[X(R27:R26)]IdRd,YRd=[Y(R29:R28)]IdRd,ZRd=[Z(R31:R30)]stX,Rr[X(R27:R26)]=RrstY,Rr[Y(R29:R28)]=RrstZ,Rr[Z(R31:R30)]=Rr当一段连续载入或存储指令出现时,并且其目的位址连续、中间未被修改,则在这一段连续存取指令的第一个存取指令前加上两个位址的检查,分别是这个连续存取存储空间位址的开头和结尾,如果确定两个位址的检查均合法,则该段连续的存取都合法。步骤(2).检查调用存储空间位址和检査存储器载入存储过程,当一个调用的位址被传入时,这个函数首先取得该模块的编号,使用系统内原本提供的系统函数;然后依序检査该位址是否是系统调用的进入点、向系统预约的其它模块函数进入点或模块本身内部的跳跃点,如果是系统调用的进入点、7向系统预约的其它模块函数进入点或模块本身内部的跳跃点中的任何一个,则存取合法,进行回传;如果不是系统调用的进入点、向系统预约的其它模块函数进入点或模块本身内部的跳跃点中的任何一个,则为发生错误。具体方法是首先检查系统调用进入点,先用最后一个进入点的值和传入的位址比较,比较值大的直接跳到下一个比较区域。如果传入位址比跳跃表开头还小,则为错误。其次检査向系统预约的其它模块函数,先修改节点上的加载器,载入模块时,从模块的档案中获得该模块向系统预约了哪些函数,将信息记录下来,执行检查时,如果是记录过的函数调用,则合法;否则,不合法。然后检查模块的程序区,从加载器上获得模块的程序区储存在系统的哪一个区段,获得该模块的开始位址和程序区大小,用这些信息确定该调用的位址是否落在该模块本身的程序区内,如果落在该程序区内,则合法;否则,不合法。修复嵌入式系统错误的方法具体是步骤(l).如果侦测出有错,则有错的模块立即停止工作;步骤(2).向服务器发送替换出错模块的请求,并把流程跳到排程上,避免执行接下来错误的指令。服务器把收到的包含模块号、版本号及节点号的信息,打包传给操作平台。当操作平台收到服务器信息,判断是否有可对应使用的其它版本,如果没有先传一次原版,并记一次重复记号。如果系统中有另一版本,服务器发送命令到传感器节点,卸载错误的模块。服务器完成卸载原来的模块后,接着上传另一个相同功能但版本不同的模块到该传感器节点上。如果重复要求第二次且还是只有一个版本,那就记录下该传感器节点号及模块号,告知使用者。权利要求1、一种嵌入式系统的错误侦测和修复方法,包括侦测嵌入式系统错误和修复嵌入式系统错误,其特征在于侦测嵌入式系统错误的方法包括静态检查和动态检查;所述的静态检查的具体方法是检查所有静态给定存储空间位址的存储器存储指令,所述的存储器存储指令包括直接调用指令和相对跳跃指令;同一模块内的函数调用采用相对跳跃指令,不同模块内的函数调用采用直接调用指令;直接调用指令和相对跳跃指令格式如下<tablesid="tabl0001"num="0001"><table><tgroupcols="2"><colspeccolname="c001"colwidth="48%"/><colspeccolname="c002"colwidth="51%"/><thead></column></row><row><column><entrymorerows="1">Instruction</entry><entrymorerows="1">Operation</entry></column></row></thead><tbody></column></row><row><column><entrymorerows="1">Callk</entry><entrymorerows="1">PC=k</entry></column></row></column></row><row><column><entrymorerows="1">Jmp.+k</entry><entrymorerows="1">PC=PC+k</entry></column></row></column></row><row><column><entrymorerows="1">Jmp.-k</entry><entrymorerows="1">PC=PC-k</entry></column></row></tbody></tgroup></column></row><table></tables>如果直接调用后面给定位址中的任何一个位址不是系统调用跳跃表里面的其中一个合法值,则该模块为不合法,不能上传到传感器节点上;如果全部直接调用都是跳跃表里的合法值,则该模块为合法;所述的动态检查的具体方法是步骤(1).改写模块内容、增加指令,就是把存储空间位址作为参数传进动态检查系统内以备调用;在编译时,如果目的位址无法在给定的指令前插入检查指令,则将欲存取的的存储空间位址设为参数,用来检查该位址的合法性;这些指令包括三形式,分别为间接调用、载入和存储,指令格式如下<tablesid="tabl0002"num="0002"><table><tgroupcols="2"><colspeccolname="c001"colwidth="42%"/><colspeccolname="c002"colwidth="58%"/><thead></column></row><row><column><entrymorerows="1">Instruction</entry><entrymorerows="1">Operation</entry></column></row></thead><tbody></column></row><row><column><entrymorerows="1">icall</entry><entrymorerows="1">PC=Z(R31:R30)</entry></column></row></column></row><row><column><entrymorerows="1">ldRd,X</entry><entrymorerows="1">Rd=[X(R27:R26)]</entry></column></row></column></row><row><column><entrymorerows="1">ldRd,Y</entry><entrymorerows="1">Rd=[Y(R29:R28)]</entry></column></row></column></row><row><column><entrymorerows="1">ldRd,Z</entry><entrymorerows="1">Rd=[Z(R31:R30)]</entry></column></row></column></row><row><column><entrymorerows="1">stX,Rr</entry><entrymorerows="1">[X(R27:R26)]=Rr</entry></column></row></column></row><row><column><entrymorerows="1">stY,Rr</entry><entrymorerows="1">[Y(R29:R28)]=Rr</entry></column></row></column></row><row><column><entrymorerows="1">stZ,Rr</entry><entrymorerows="1">[Z(R31:R30)]=Rr</entry></column></row></tbody></tgroup></column></row><table></tables>当一段连续载入或存储指令出现时,并且其目的位址连续、中间未被修改,则在这一段连续存取指令的第一个存取指令前加上两个位址的检查,分别是这个连续存取存储空间位址的开头和结尾,如果确定两个位址的检查均合法,则该段连续的存取都合法;步骤(2).检查调用存储空间位址和检查存储器载入存储过程,当一个调用的位址被传入时,这个函数首先取得该模块的编号,使用系统内原本提供的系统函数;然后依序检查该位址是否是系统调用的进入点、向系统预约的其它模块函数进入点或模块本身内部的跳跃点,如果是系统调用的进入点、向系统预约的其它模块函数进入点或模块本身内部的跳跃点中的任何一个,则存取合法,进行回传;如果不是系统调用的进入点、向系统预约的其它模块函数进入点或模块本身内部的跳跃点中的任何一个,则检查出发生错误;修复嵌入式系统错误的方法具体是步骤(a).如果侦测出有错,则有错的模块立即停止工作;步骤(b).向服务器发送替换出错模块的请求,服务器收到请求后,检查是否有其它版本,如果有,则将另一版本加载到传感器节点上,用来取代原来模块的工作;如果没有,则传递原来版本再试一次,若再次出错,且没有发现其它版本,则修复无效,服务器留下记录告知使用者。全文摘要本发明涉及一种嵌入式系统的错误侦测和修复方法。目前无线传感器节点的系统无法避免应用程序对系统核心的存储空间做存取的动作,可能会让系统产生不可预期的错误。本发明在SOS系统上以最小的修改系统架构方式,提出了一种可侦测存储器存取错误,并能使用模块替换的方式加以修复的方法,使存储器存取错误产生机会减少,搜集的信息也能更加有效益,在维护系统上更是轻而易举。利用本发明方法不必担心何时该侦测网络上的无线传感器节点是否出错,可能出错的传感器节点会被侦测到并主动修复,不需要有人随时在服务器端守候。文档编号G06F11/36GK101604289SQ20091010061公开日2009年12月16日申请日期2009年7月10日优先权日2009年7月10日发明者吴国华,祯张,方美娥,郑秋华申请人:杭州电子科技大学