一种存储异常信息的方法

文档序号:6751572阅读:858来源:国知局
专利名称:一种存储异常信息的方法
技术领域
本发明属于信息存储技术领域,具体来说是涉及一种存储异常信息的方法。
背景技术
目前,嵌入式系统应用越来越广泛,该系统是一种软硬件紧密结合,完成特定功能的计算机系统,其已经在通信、仪表、航空、医疗设备、军事等各种领域广泛运用,而用于嵌入式系统的软件规模也越来越复杂和庞大,从而由于其软件的不完善所导致的损失已经逐渐引起人们的重视。
目前嵌入式系统中可能导致软件出现异常的原因归纳起来大致有以下几点1、软件运行过程中无法捕捉的硬件故障,从而导致软件运行异常或死机,如强烈射线导致内存错误等。
2、CPU内部硬件故障,该故障一般可以被捕捉,如总线错误、预取指错误等等,当CPU出现这类错误时,一般产生不可屏蔽中断,然后由该中断进行处理。
3、软件BUG导致异常,如跳到0地址执行、不对齐访问错误、越界访问保护等,软件进入异常分支以及流程等。
4、一般性告警,外部异常条件触发。
嵌入式系统的软件和一般的软件一样,也有一个长期的逐渐完善的过程,总的来说,这个过程可以分为售前完善和售后完善两个阶段。在产品出售前,通过加强产品的实验室测试来发现尽可能多的缺陷(BUG)是发现软件问题的重要手段,但是实验室毕竟和实际应用环境有很大差别,过长的实验室测试不仅导致测试效率降低,而且产品成本也会急剧上升,甚至可能错过产品上市的最佳时机。因此,软件产品在实际运行中,捕捉并安全保留软件运行的异常信息显得尤为重要。
现有技术中通用的解决方法归纳如下1、将捕获的异常信息不进行存储。
一般情况下,由于嵌入式系统都是比较紧凑的,实际运行时不大可能连接标准输出设备,如计算机等,所以随时丢弃捕获的异常信息而没有存储环节。
2、将捕获的异常信息存储到随机存储器RAM中。
将作为此用途的RAM分成若干内存块,在软件异常分支将异常信息记录到内存块中,如果所有用于此用途的内存块全部使用完,则在第一个块的地方开始覆盖原来记录的内容。由于RAM是易失性存储器,掉电后内容丢失;即使不掉电,系统复位后也很难读取内存的数据。
3、将捕获的异常信息存储到存储器NVRAM中。
其存储方法和上述2类似。由于NVRAM具有掉点后内容不丢失的特点,但其容量往往也很小,不能满足较多信息量记录的要求。

发明内容
针对上述情形,本发明提出了一种存储异常信息的方法,以解决现有技术中存在的捕获的异常信息易被丢弃、掉电后记录内容易丢失、难以容纳较多信息量等问题。
为解决上述问题,本发明的解决方案是一种存储异常信息的方法,其将捕获的异常信息存储到存储器件中,其特征在于,包括如下步骤A、将存储器件初始化;B、将该存储器件分成至少两个存储块,每个存储块分成若干条记录,并设置记录最大重复次数;C、将所捕获的异常信息存储到该存储器件的存储块中,如果待存储块里所有的记录均已存储满,则先将下一个存储块擦除后,再继续存储。
其中,所述存储器件为FLASH。
所述存储器件的存储块和记录数目可预先设置。
所述的步骤B还进一步包含搜索存储器件,确定存储异常信息的起始记录位置。
所述的步骤B还进一步包含标记存储器件局部异常的记录区域。
所述的步骤C还进一步包含判断最近存储的信息,若相同的信息达到预定数目后,则不再存储其后捕获的相同信息。
本发明通过采用flash存储器件,并且通过特有的flash操作方法,充分发挥了fash存储器件的特性,既避免擦除flash存储器件的同时破坏以前有用的信息,又避免在存储大量信息的情况下频繁擦除flash存储器件,从而极大地延长flash存储器件使用寿命。同时,有效的实现了及时捕获并存储软件运行过程中的异常、告警以及其他有用信息,用于分析软件运行情况和定位问题,加快软件的稳定过程,具有掉电后记录内容不易丢失、容纳较多信息量等优点。
下面结合附图和具体实施例来详细描述本发明。


图1是本发明实施例所述的方法框图;图2是本发明实施例所述方法的初始化步骤具体实现流程图;图3是本发明实施例所述存储器件结构分配图;图4是本发明实施例所述存储记录的结构图;图5是本发明实施例所述方法的存储信息步骤具体实现流程图。
具体实施例方式
本发明实施例介绍了一种存储异常信息的方法,将异常信息永久存储到flash存储器件,既避免擦除flash存储器件的同时破坏以前有用的信息,又避免在存储大量信息的情况下频繁擦除flash存储器件,从而极大地延长flash存储器件使用寿命。
本发明实施例一种存储异常信息的方法,具体是在嵌入式系统软件系统代码中任何可能的异常处理函数中统一调用用于存储异常信息的函数,从而捕获软件运行过程中的异常、告警以及其它有用信息,并将其存储到flash存储器件中。
下面详细描述本发明实施例的具体实现过程,如图1所示,该过程分为三个步骤一、将存储器件初始化。
该初始化步骤主要是通过在系统初始化代码中调用voidlog_flash_init(void)函数来实现的,结构如下void sys_init(void){log_flash_init();…}该函数的主要功能是初始化代码,搜索flash内容,找到当前记录位置,初始化相关的全局变量。
二、将该存储器件分成至少两个存储块,每个存储块分成若干条记录,并设置记录最大重复次数。
其具体实现过程,如图2所示首先,将flash存储器件进行初始化,并预先设置存储块和记录的数目分别为n和m,其flash存储器件的存储结构,如图3所示,将该存储器件分成n个存储块,每个存储块分成m条记录,其中所分配的存储块和记录的大小是相等的。
其中,每条记录中各个域的排列结构,如图4所示,其每个域的含义介绍如下记录属性1指示该位置是否为有效记录,还是空记录,如果是其它值,则为非法,软件试图在该记录所有位置写入0。
记录编号2该编号是永远递增的,即使因记录过多而将以前的记录覆盖,该值仍然是递增的。
记录时间3如果单板支持实时时钟,则该域记录产生日期和时间。
文件名4记录该异常发生的代码的文件名。
行号5记录该异常产生的代码的行号。
当前tick6一般嵌入式系统有一个定时中断计数器,该域记录该异常情况发生时当前的tick,由此可以得知该系统连续运行多长时间后产生了该异常。
其它信息7记录其它的信息,如代码中一些变量的值、版本号等。
然后,搜索flash存储器件,确定存储异常信息的起始记录位置,以保证存储在单板重新启动时记录编号以及位置的连续性;还对flash存储器件局部异常的记录区域全部写0来加以标记。
最后,为了防止同一信息多次重复出现,保证flash存储器件的存储空间利用更加充分,如发现最近存储的记录完全相同,当其数量超过一定值时,其后相同的记录被忽略,以防止大量同样的记录覆盖有用信息,故而,还设置了相同的记录连续存储的最大值为10。
三、将所捕获的异常信息存储到该存储器件的存储块中,如果待存储块里所有的记录均已存储满,则先将下一个存储块擦除后,再继续存储该步骤是在系统软件的异常处理分支中调用void login_flash(char*file_name,unsigned int line,char*fmt,...)函数,将所捕获的异常信息存储到该flash存储器件的存储块中,其结构如下<pre listing-type="program-listing">void app_task(void){ int ret_val; … ret_val=function1(); if(ret_val!=OK) {&lt;dp n="d5"/&gt;login_flash(_FILE_,_LINE_,″Err!ret_val=%x″,ret_val); } …}</pre>这样,如果待存储块里所有的记录均已存储满,仍需继续存储,该函数会自动擦除下一个存储块,继续记录;如果所有的存储块都使用完,会再次擦除第一个块,继续记录。
如图5所示,下面介绍本发明实施例对异常信息的具体存储过程。
首先,准备需要存储的数据,比如当前文件名,行号,以及系统当前tick和用户添加的异常信息等,准备存储;然后,判断待存储的信息是否是重复存储的记录,若是,再进一步判断是否达到最大重复记录次数10,若是则丢弃该记录,否则继续存储;在写记录时,如果没有成功,则再写一次该记录属性标志,将该记录有效标志全部置0,表明该记录无效,在下一个位置继续存储该记录,直到存储成功此时,如果待存储块里所有的记录均已存储满,但仍有异常信息需要存储,则需进行跨块处理,先将其存储满的存储块随后的存储块擦除后,再将需要存储的异常信息继续存储到已擦除的存储块的首条记录中;如果分配的最后一个存储块也存储满了,则将分配的第一个块重新擦除,继续上述方式进行存储......,如此循环利用分配的flash存储器件的存储空间。
另外,在存储过程中,如果遇到标记为0的异常的记录区域,如已经损坏的记录区域,则会跳过该异常部分,继续存储。
存储信息查询如果某一个设备在实际环境中运行了一个较长时间后(如一个月或更长时间),通过检查flash存储器件中存储的内容,即调用void print_log(int entry_num)函数,通过打印最近存储的异常信息的记录,来查看是否有异常发生,从而判定软件运行的状态。如果有异常信息,可以对软件问题进行诊断和定位,从而得知软件的实际运行状况。比如,在这段时间内我们的设备是否主动复位、有那些异常等等。
本实施例分配n个块作为此用途,那么至少有n-1个块可以保存有效信息。因此,为了保证有效的信息不被删除,至少需分配两个存储块。这样一个块的信息被擦除时,另外一个块能够保存足够的有用信息。
本实施例通过采用上述顺序写入和块轮流擦除的方法,充分利用flash存储器件的特性,即每个比特只能由1写为0,而任何一个比特要由0改写为1,则需要将这个比特所在的块全部擦除。从而最大限度的减少了擦除flash存储器件的机会,保证了该器件的寿命足够使用。假设分配flash存储器件为n个块,每个块的大小为64kbyte,而存储块中每条记录的大小为64byte,flash存储器件的可擦除次数为100000次,那么最多可存储的信息为n*100000*64k/64=n*10e8,如果n=3,平均每天产生100条记录,则可以使用3×10e8/100/365=8129年。
综上所述,本发明实施例通过采用flash存储器件,并且通过特有的flash操作方法,从而充分发挥了flash存储器件的特性,有效的实现了及时捕获并存储嵌入式系统软件在运行过程中的异常、告警以及其他有用信息,用于分析软件运行情况和定位问题,加快软件的稳定过程。采用本实施例所述的存储异常信息的方法,具有掉电后记录内容不易丢失、容纳较多信息量等优点。
权利要求
1.一种存储异常信息的方法,其将捕获的异常信息存储到存储器件中,其特征在于,包括如下步骤A、将存储器件初始化;B、将该存储器件分成至少两个存储块,每个存储块分成若干条记录,并设置记录最大重复次数;C、将所捕获的异常信息存储到该存储器件的存储块中,如果待存储块里所有的记录均已存储满,则先将下一个存储块擦除后,再继续存储。
2.如权利要求1所述的一种存储异常信息的方法,其中,所述存储器件为FLASH。
3.如权利要求1所述的一种存储异常信息的方法,其中,所述存储器件的存储块和记录数目可预先设置。
4.如权利要求1所述的一种存储异常信息的方法,其中,所述的步骤B还进一步包含搜索存储器件,确定存储异常信息的起始记录位置。
5.如权利要求1所述的一种存储异常信息的方法,其中,所述的步骤B还进一步包含标记存储器件局部异常的记录区域。
6.如权利要求1所述的一种存储异常信息的方法,其中,所述的步骤C还进一步包含判断最近存储的信息,若相同的信息达到预定数目后,则不再存储其后捕获的相同信息。
全文摘要
本发明提出了一种存储异常信息的方法,其存储器件采用flash存储器件,该方法包含步骤将存储器件初始化;将该存储器件分成至少两个存储块,每个存储块分成若干条记录,并设置记录最大重复次数;将所捕获的异常信息存储到该存储器件的存储块中,如果待存储块里所有的记录均已存储满,则先将下一个存储块擦除后,再继续存储。本发明通过采用顺序写入和块轮流擦除的方法,充分利用flash存储器件的特性,并且通过特有的flash操作方法,有效的实现了及时捕获并存储软件运行过程中的异常、告警以及其他有用信息,用于分析软件运行情况和定位问题,加快软件的稳定过程,具有掉电后记录内容不易丢失、容纳较多信息量等优点。
文档编号G11C16/06GK1570879SQ0314400
公开日2005年1月26日 申请日期2003年7月25日 优先权日2003年7月25日
发明者孙志军 申请人:华为技术有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1