一种提高嵌入式软件健壮性的方法与装置与流程

文档序号:25304162发布日期:2021-06-04 14:06阅读:147来源:国知局
一种提高嵌入式软件健壮性的方法与装置与流程

1.本发明属于嵌入式软件技术领域,更具体地,涉及一种提高嵌入式软件健壮性的方法与装置。


背景技术:

2.在嵌入式软件技术领域,当cpu在执行代码的汇编指令时,如果受到外部异常信号(如电压、电流不稳定导致的杂波信号)干扰或者未知原因导致的寄存器值读写异常或者寄存器值被异常改写等,都可能导致cpu执行指令时出现异常,例如出现非法指令错误或者段错误等,导致程序异常终止,而没有让程序继续正常执行的能力。传统技术通常只是从代码层面由程序员在编码时保证程序的健壮性,而对cpu异常信号、寄存器读写异常、寄存器被改写等导致的情况无法处理,因此存在一定的限制。
3.鉴于此,克服该现有技术产品所存在的不足是本技术领域亟待解决的问题。


技术实现要素:

4.针对现有技术的以上缺陷或改进需求,本发明提供了一种提高嵌入式软件健壮性的方法与装置,其目的在于当程序发生异常时,通过让程序重复执行使程序修复异常并继续正常执行,由此解决传统技术对cpu异常信号、寄存器读写异常、寄存器被改写等导致的异常无法处理的技术问题。
5.为实现上述目的,按照本发明的一个方面,提供了一种提高嵌入式软件健壮性的方法,包括:
6.当程序发生异常中断时,根据中断上下文分析该异常发生的次数,并判断该异常发生的次数是否在用户可容忍范围内;
7.如果在用户可容忍范围内,则根据中断上下文获取发生异常的指令,并通过分析该异常指令是否可重复执行来判断程序是否可重复执行,如果程序可重复执行则记录可重复执行指令的位置和寄存器;
8.更新当前程序的执行位置和寄存器为记录的可重复执行指令的位置和寄存器,并使程序跳转至所述可重复执行指令的位置进行重复执行。
9.优选地,当程序发生异常中断时,所述根据中断上下文分析该异常发生的次数,并判断该异常发生的次数是否在用户可容忍范围内,具体为:
10.根据中断上下文获取该异常发生的类型和物理位置,并根据该异常发生的类型和物理位置判断该异常是否为第一次发生;
11.如果是第一次发生,则记录该异常的类型、物理位置和次数信息;如果不是第一次发生,则更新该异常的次数信息;
12.根据最新的次数信息判断该异常发生的次数是否在用户可容忍范围内;如果在用户可容忍范围内则继续判断程序是否可重复执行,如果超出用户可容忍范围则记录异常信息到日志,并退出程序。
13.优选地,所述根据中断上下文获取发生异常的指令,并通过分析该异常指令是否可重复执行来判断程序是否可重复执行,具体为:
14.根据中断上下文获取异常指令,并分析该异常指令是否可重复执行;
15.如果异常指令不可重复执行,证明程序不可重复执行,则记录异常信息到日志,并退出程序;
16.如果异常指令可重复执行,证明程序可重复执行,则根据异常发生的类型记录可重复执行指令的位置和寄存器。
17.优选地,当异常指令可重复执行时,所述根据异常发生的类型记录可重复执行指令的位置和寄存器,具体为:
18.如果是非段错误引起的异常,则直接根据该异常指令记录可重复执行指令的位置和寄存器;
19.如果是段错误引起的异常,则从该异常指令处依次向前查找可重复执行的指令,并根据查找结果记录可重复执行指令的位置和寄存器。
20.优选地,对于段错误引起的异常,所述从该异常指令处依次向前查找可重复执行的指令,并根据查找结果记录可重复执行指令的位置和寄存器,具体为:
21.根据中断上下文获取该异常指令的前一条指令,并分析该指令是否可重复执行;如果该指令可重复执行,则继续获取该指令的前一条指令进行可重复执行性分析,直至获取到不可重复执行的指令时终止,并根据获取到的最后一条可重复执行指令记录可重复执行指令的位置和寄存器。
22.优选地,对于异常指令以及异常指令之前的任一指令,判断指令是否可重复执行的过程具体为:
23.从中断上下文获取当前指令对应的指令数据,并根据该指令数据解析出当前指令的目的寄存器和寻址方式;
24.根据寻址方式获取当前指令的源寄存器,并基于寻址方式以及源寄存器和目的寄存器的关系判断当前指令是否可重复执行。
25.优选地,所述寻址方式包括立即数寻址、寄存器寻址和基址加变址寻址,则所述根据寻址方式获取当前指令的源寄存器,并基于寻址方式以及源寄存器和目的寄存器的关系判断当前指令是否可重复执行,具体为:
26.如果是立即数寻址,则说明当前指令可重复执行;
27.如果是寄存器寻址,则获取当前指令的源寄存器,继续根据当前指令的源寄存器和目的寄存器是否相同判断当前指令是否可重复执行;
28.如果是基址加变址寻址,则获取当前指令的基址寄存器和变址寄存器作为源寄存器,继续根据当前指令的源寄存器和目的寄存器是否相同判断当前指令是否可重复执行。
29.优选地,对于寄存器寻址和基址加变址寻址,所述根据当前指令的源寄存器和目的寄存器是否相同判断当前指令是否可重复执行,具体为:
30.判断当前指令的源寄存器与目的寄存器是否相同;
31.如果不相同,则说明当前指令可重复执行;
32.如果相同,则记录该相同的寄存器r,并获取当前指令的前一条指令的目的寄存器,判断该目的寄存器是否与记录的寄存器r相同;
33.如果该目的寄存器与记录的寄存器r相同,则说明当前指令可重复执行;如果该目的寄存器与记录的寄存器r不相同,则说明当前指令不可重复执行。
34.优选地,所述异常信息包括异常发生的类型、时间、调用栈和寄存器中的一项或多项信息。
35.按照本发明的另一方面,提供了一种提高嵌入式软件健壮性的装置,包括至少一个处理器和存储器,所述至少一个处理器和存储器之间通过数据总线连接,所述存储器存储有可被所述至少一个处理器执行的指令,所述指令在被所述处理器执行后,用于完成第一方面所述的提高嵌入式软件健壮性的方法。
36.总体而言,通过本发明所构思的以上技术方案与现有技术相比,具有如下有益效果:本发明提供了一种提高嵌入式软件健壮性的方法与装置,当程序由于cpu异常信号、寄存器读写异常、寄存器被改写等导致执行异常中断时,通过分析中断上下文信息获取执行异常的指令,让程序重复执行,修复由于各种异常情况导致的指令或寄存器错误信息,让程序继续正常执行。该方案在程序发生异常时,使程序本身具有可重复执行的能力,减少程序异常退出情况,能显著增强软件的健壮性。
附图说明
37.图1是本发明实施例提供的一种提高嵌入式软件健壮性的方法流程图;
38.图2是本发明实施例提供的一种记录分析同一异常发生次数的流程图;
39.图3是本发明实施例提供的一种分析程序是否可重复执行的流程图;
40.图4是本发明实施例提供的一种段错误异常时的异常处理流程图;
41.图5是本发明实施例提供的一种分析指令是否可重复执行的流程图;
42.图6是本发明实施例提供的一种提高嵌入式软件健壮性的装置架构图。
具体实施方式
43.为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。此外,下面所描述的本发明各个实施方式中所涉及到的技术特征只要彼此之间未构成冲突就可以相互组合。
44.实施例1
45.为解决传统技术对cpu异常信号、寄存器读写异常、寄存器被改写等导致的异常情况无法处理的技术问题,有效提升程序的健壮性,本发明实施例提供了一种提高嵌入式软件健壮性的方法,如图1所示,主要包括以下步骤:
46.s10,当程序发生异常中断时,根据中断上下文分析该异常发生的次数,并判断该异常发生的次数是否在用户可容忍范围内。
47.该步骤主要是“记录并分析同一异常发生的次数”:当程序发生异常中断时,先根据中断上下文获取该异常发生的类型和物理位置,并根据该异常发生的类型和物理位置判断该异常是否为第一次发生。如果是第一次发生,则记录该异常的类型、物理位置和次数信息;如果不是第一次发生,则更新该异常的次数信息。最后根据最新的次数信息判断该异常发生的次数是否在用户可容忍范围内;如果在用户可容忍范围内则继续向下执行s20,即判
断程序是否可重复执行;如果超出用户可容忍范围则记录异常信息到日志,并退出程序。其中,所述异常信息包括异常发生的类型、时间、调用栈和寄存器中的一项或多项信息;所述用户可容忍范围可由用户根据自身需求进行配置,例如配置为3次,那么3次以内(即≤3次)就认为是在用户可容忍范围内。
48.s20,如果在用户可容忍范围内,则根据中断上下文获取发生异常的指令,并通过分析该异常指令是否可重复执行来判断程序是否可重复执行,如果程序可重复执行则记录可重复执行指令的位置和寄存器。
49.该步骤主要是“分析程序是否可重复执行(即是否可修复)”:根据中断上下文获取发生异常的指令,并分析该异常指令是否可重复执行。如果异常指令不可重复执行,证明程序不可重复执行,则记录异常信息到日志,并退出程序;如果异常指令可重复执行,证明程序可重复执行,则根据异常发生的类型记录可重复执行指令的位置和寄存器。
50.异常发生的类型主要分为非段错误和段错误。如果是非段错误引起的异常,则直接根据该异常指令记录可重复执行指令的位置和寄存器。如果是段错误引起的异常,则从该异常指令处依次向前查找可重复执行的指令,并根据查找结果记录可重复执行指令的位置和寄存器;具体地,首先根据中断上下文获取该异常指令的前一条指令,并分析该指令是否可重复执行;如果该指令可重复执行,则继续获取该指令的前一条指令进行可重复执行性分析,直至获取到不可重复执行的指令时终止,然后根据获取到的最后一条可重复执行指令记录可重复执行指令的位置和寄存器。
51.对于异常指令以及异常指令之前的任一指令,判断指令是否可重复执行的过程具体如下:首先从中断上下文获取当前指令对应的指令数据,并根据该指令数据解析出当前指令的目的寄存器和寻址方式;然后根据寻址方式获取当前指令的源寄存器,并基于寻址方式以及源寄存器和目的寄存器的关系判断当前指令是否可重复执行。其中,所述寻址方式通常包括立即数寻址、寄存器寻址和基址加变址寻址。如果是立即数寻址,则说明当前指令可重复执行。如果是寄存器寻址,则获取当前指令的源寄存器,继续根据当前指令的源寄存器和目的寄存器是否相同判断当前指令是否可重复执行。如果是基址加变址寻址,则获取当前指令的基址寄存器和变址寄存器作为源寄存器,继续根据当前指令的源寄存器和目的寄存器是否相同判断当前指令是否可重复执行。
52.其中,对于寄存器寻址和基址加变址寻址,所述根据当前指令的源寄存器和目的寄存器是否相同判断当前指令是否可重复执行,具体为:判断当前指令的源寄存器与目的寄存器是否相同。如果不相同,则说明当前指令可重复执行。如果相同,则记录该相同的寄存器r,并获取当前指令的前一条指令的目的寄存器,判断该目的寄存器是否与记录的寄存器r相同;如果该目的寄存器与记录的寄存器r相同,则说明当前指令可重复执行;如果该目的寄存器与记录的寄存器r不相同,则说明当前指令不可重复执行。
53.s30,更新当前程序的执行位置和寄存器为记录的可重复执行指令的位置和寄存器,并使程序跳转至所述可重复执行指令的位置进行重复执行。
54.该步骤主要是“程序的异常处理”:如果程序可重复执行,则更新当前程序的执行位置和寄存器信息为步骤s20中记录的可重复执行指令的位置和寄存器信息,并让程序跳转到该位置重新执行。
55.上述实施例提供的方法中,当程序由于cpu异常信号、寄存器读写异常、寄存器被
改写等导致执行异常中断时,通过分析中断上下文信息获取执行异常的指令,让程序重复执行,可修复由于各种异常情况导致的指令或寄存器错误信息,让程序继续正常执行。该方案在程序发生异常时,使程序本身具有可重复执行的能力,减少程序异常退出情况,能显著增强软件的健壮性。
56.实施例2
57.为了使本发明的技术方案更加清楚明白,本实施例进一步以采用hash表(即哈希表)记录异常发生的类型、物理位置和次数信息为例,对实施例1中的s10(即记录并分析同一异常发生的次数)进行详细介绍。如图2所示,具体实现步骤如下:
58.s101,从异常中断上下文获取异常发生的类型和物理位置信息。
59.其中,异常发生的类型通常有段错误和非段错误。异常发生的物理位置信息是指执行异常的指令所在的内存地址,如pc指针的值;对同一程序而言,同一物理位置发生的异常为同一异常。
60.s102,根据异常发生的类型和物理位置信息在hash表中查找,判断是否能找到对应异常的节点信息,即是否能在hash表中匹配到同样的异常类型和物理位置信息。
61.s103,如果hash表中获取不到该异常的节点信息,证明是第一次发生该异常,则记录该异常的类型、物理位置和次数信息到hash表。
62.s104,如果hash表中获取到该异常的节点信息,证明是重复执行后再次发生该异常,则更新hash表中该异常的次数信息。
63.s105,分析该异常发生的次数是否在用户可容忍范围内。
64.s106,如果该异常发生的次数在用户可容忍范围内,则继续分析程序是否可重复执行,如果可重复执行则进行异常处理。
65.s107,如果该异常发生的次数超过用户可容忍范围,则记录该异常发生的类型、时间、调用栈、寄存器等信息到日志,并退出程序。
66.实施例3
67.为了使本发明的技术方案更加清楚明白,本实施例进一步对实施例1中的s20(即分析程序是否可重复执行)进行详细介绍,如图3所示,具体实现步骤如下:
68.s201,从中断上下文获取异常指令所在的内存地址。其中,异常指令所在的内存地址是指发生异常的指令被存储在的内存单位地址。
69.s202,从异常指令所在的内存地址中获取对应的指令数据。
70.s203,通过分析该指令数据判断该异常指令是否可重复执行。其中:
71.指令可重复执行是指反复执行该指令不改变程序的行为。例如,32位arm cpu体系的ldr指令:ldrr0,[r1,#7],反复执行该指令时只是更新目的寄存器r0中的值,并不影响程序的正常流程,因此该指令可重复执行。
[0072]
指令不可重复执行是指第1次执行该指令时已经修改了指令源寄存器中的值,第二次再次执行该指令时从源寄存器获取的值已经变化,导致程序数据改变。例如,arm cpu体系的ldrr0,[r0,#7],第一次执行该指令时寄存器r0中的值已经变更,如果再次执行该指令时,获取的地址已经变化,与程序预期不符,因此该指令为不可重复执行。
[0073]
s204,如果异常指令不可重复执行,证明程序不可重复执行,则记录异常发生的类型、时间、调用栈、寄存器等信息到日志,并退出程序。
[0074]
s205,如果异常指令可重复执行,证明程序可重复执行,则根据异常发生的类型进行分析。
[0075]
s206,如果是非段错误引起的异常,则直接根据该异常指令记录可重复执行指令的位置和寄存器。
[0076]
其中,对于非段错误引起的异常,此时记录的可重复指令的位置即为该异常指令本身的位置信息,也就是此时要重复执行该异常指令。
[0077]
s207,如果是段错误引起的异常,则继续查找异常指令之前可重复执行的指令,并根据查找结果记录可重复执行指令的位置和寄存器。
[0078]
其中,参考图4,s207的具体实现步骤如下:
[0079]
s2071,从中断上下文获取异常指令的前一条指令。
[0080]
s2072,分析该指令是否可重复执行。
[0081]
s2073,如果该指令可重复执行,则继续获取该指令的前一条指令,并跳转至步骤s2072,继续分析前一条指令是否可重复执行。
[0082]
其中,由于可重复执行的指令条数越多,修复问题的可能性越大,因此需要尽可能多地向前找到可重复执行的指令。具体分析如下:段错误一般是由于异常指令前面的指令读写异常导致寄存器中值不对进而导致的异常。例如,第1条指令是从r0到r1,第2条指令是从r1到r2,第3条指令是使用r2中的值出现异常,而导致r2中值不对的原因可能是第一条指令异常导致的r1中的值不对进而导致r2中的值不对,也有可能是第二条指令直接导致r2中的值不对。这时候如果直接从第2条指令重复执行,对于是由第一条指令导致r2的值不对的情况是没有办法修复的,而从第一条指令重复执行则能修复。因此,不管是第一条指令还是第二条指令导致的不对,从第一条指令重新执行都能修复该异常,因此这里需要尽可能多地向前找到可重复执行的指令。
[0083]
s2074,如果该指令不可重复执行,则终止查找,并记录s2073中找到的最后一条可重复执行指令的位置和寄存器。
[0084]
实施例4
[0085]
为了使本发明的技术方案更加清楚明白,本实施例进一步对判断指令是否可重复执行的过程进行详细介绍。其中,判断指令可重复执行的一个关键点是数据源和数据目的不能是同一个来源,因为如果是同一个来源,在更新数据目的时对数据源也进行了更新,此时再次执行时数据已经变更,与源程序的数据源已经不同,重复执行时程序的结果已经不对。
[0086]
基于上述原理,如图5所示,对于异常指令以及异常指令之前的任一指令,分析其是否可重复执行的具体实现步骤如下:
[0087]
s21,从中断上下文中获取当前指令对应的指令数据。
[0088]
具体是先从中断上下文获取当前指令所在的内存地址,然后再从该内存地址中获取对应的指令数据。
[0089]
s22,初始化源寄存器集合r,并将源寄存器集合r置为空。
[0090]
s23,根据指令数据解析出当前指令的目的寄存器和寻址方式。
[0091]
s24,根据寻址方式判断当前指令是否可重复执行。
[0092]
s25,如果是立即数寻址,则说明当前指令可重复执行,获取当前指令的前一条指
令,并跳转到步骤s22执行。
[0093]
例如,32位arm cpu架构下指令ldr r1,(0x1234),该指令是将0x1234内存单元中的数据载入到寄存器r1中,此时多次反复执行该指令都不会改变程序的数据源,因此该指令是可重复执行的。
[0094]
s26,如果是寄存器寻址,则获取当前指令的源寄存器,并将源寄存器加入源寄存器集合r,然后跳转到步骤s28执行。
[0095]
例如,32位arm cpu架构下的指令ldrr1,(r0),该指令中寄存器r0中存储的是一个内存地址,该指令的作用是读取该内存地址的数据到寄存器r1中;此时多次反复执行该指令都不会改变程序的数据源也就是r0中的数据,因此该指令是可重复执行的。再例如,32位arm cpu架构下指令ldrr1,(r1),该指令是将r1中存储的内存地址中的数据读取到寄存器r1中,此时寄存器r1中的数据在第一次执行时已经变化,此时如果再次执行时数据源已经变化,会导致程序与原有不符,因此该指令是不能重复执行的。
[0096]
s27,如果是基址加变址寻址,则获取当前指令的基址寄存器和变址寄存器,并将基址寄存器和变址寄存器加入源寄存器集合r,然后跳转到步骤s28执行。
[0097]
例如,32位arm cpu架构下指令ldrr1,(r0,r2),该指令是将r0寄存器中的值作为一个基础内存地址,加上寄存器r2中的值,得到一个内存地址,然后在读取该内存地址中的数据到寄存器r1中;此时多次反复执行该指令都不会改变程序的数据源也就是r0中的数据,因此该指令是可重复执行的。再例如,32位arm cpu架构下指令ldrr1,(r1,r2),该指令在第一次执行时寄存器r1中的数据已经变化,此时如果再次执行时数据源已经变化,会导致程序行为与原来不符,因此该指令是不能重复执行的。
[0098]
s28,判断目的寄存器是否在源寄存器集合r中,实际上也就是判断当前指令的源寄存器与目的寄存器是否相同。
[0099]
s29,如果目的寄存器不在源寄存器集合r中,即当前指令的源寄存器与目的寄存器不相同,则说明当前指令可重复执行,获取当前指令的前一条指令,并跳转到步骤s22执行。
[0100]
s30:如果目的寄存器在源寄存器集合r中,即当前指令的源寄存器与目的寄存器相同,则记录该相同的寄存器为r,并获取当前指令的前一条指令。
[0101]
其中,虽然当前指令的源寄存器和目的寄存器都是r,但此时如果该指令的前一条指令的目的寄存器也是r,也就是通过执行前一条指令能对寄存器r的值进行恢复,那么该指令和前一条指令都是可以重复执行的。例如,32位arm cpu架构下的第一条指令ldrr2,(r0),第二条指令ldrr2,(r2);此时第二条指令ldrr2,(r2)的源寄存器和目的寄存器都是r2,该语句单独是不可重复执行的,但是和第一条指令一起能重复执行。
[0102]
s31,解析当前指令的前一条指令的目的寄存器,判断该目的寄存器与步骤s30中记录的寄存器r是否相同。
[0103]
s32,如果相同,说明当前指令(即步骤s30中的指令)可重复执行,继续获取当前指令的前一条指令,并跳转到步骤s22执行。
[0104]
s33,如果不同,说明当前指令(即步骤s30中的指令)不可重复执行,则终止查找。
[0105]
实施例5
[0106]
为了使本发明的技术方案更加清楚明白,本实施例进一步以32位armcpu架构为
例,结合具体的实施例描述本发明的技术方案。
[0107]
以32位arm cpu架构为例,源程序语句如下:
[0108]
a=10;b=&a;c=*b;该语句作用是,首先给a赋值10,然后将指针b指向a,再将指针b指向数据赋值给c,最终目的即是将c也赋值为10。
[0109]
语句对应的汇编指令如下:
[0110]
第1条:0x00035184
ꢀꢀꢀ
str
ꢀꢀꢀꢀꢀꢀ
r2,[r1]
[0111]
第2条:0x00035188
ꢀꢀꢀ
ldr
ꢀꢀꢀꢀꢀꢀ
r3,[r3]
[0112]
第3条:0x0003518c
ꢀꢀꢀ
mov
ꢀꢀꢀꢀꢀꢀ
r3,#10;0xa
[0113]
第4条:0x00035190
ꢀꢀꢀ
str
ꢀꢀꢀꢀꢀꢀ
r3,[r11,#

24]
[0114]
第5条:0x00035194
ꢀꢀꢀ
sub
ꢀꢀꢀꢀꢀꢀ
r3,r11,#24;0x18
[0115]
第6条:0x00035198
ꢀꢀꢀ
str
ꢀꢀꢀꢀꢀꢀ
r3,[r11,#

20]
[0116]
第7条:0x0003519c
ꢀꢀꢀ
ldr
ꢀꢀꢀꢀꢀꢀ
r3,[r11,#

20]
[0117]
第8条:0x000351a0
ꢀꢀꢀ
ldr
ꢀꢀꢀꢀꢀꢀ
r3,[r3]
[0118]
第9条:0x000351a4
ꢀꢀꢀ
str
ꢀꢀꢀꢀꢀꢀ
r3,[r11,#

16]
[0119]
其中,第3条和第4条指令对应语句a=10;第5条和第6条指令对应语句b=&a;第7条到第9条指令对应语句c=*b;
[0120]
假设在执行第7条指令时,由于寄存器读写异常导致寄存器r3中的值为0;那么在继续执行第8条指令时,去地址为0的内存单元读取数据,会导致程序发生段错误异常,即异常发生的物理位置在第8条指令处。具体执行过程如下:
[0121]
1)从中断上下中获取到该异常指令(即第8条指令)所在的内存地址为0x000351a0,异常发生的类型为段错误。
[0122]
2)查找记录异常的hash表,判断该异常为第一次发生,则记录该异常指令所在的内存地址和段错误信息到hash表,同时在hash表中记录该异常发生的次数为1。假设次数为1在用户可容忍范围内,则继续向下分析程序是否可重复执行。
[0123]
3)将源寄存器集合r置为空,此时r={},解析第8条指令,该指令采用的是寄存器寻址,源寄存器是r3,目的寄存器是r3,将源寄存器r3加入源寄存器集合r,此时r={r3}。
[0124]
4)判断第8条指令的目的寄存器r3是否在源寄存器集合r中,此时r3在r中,即源寄存器和目的寄存器相同,则记录该寄存器r3,并获取上一条指令即第7条指令继续判断。
[0125]
5)分析第7条指令,该指令的目的寄存器是r3,与之前记录的寄存器r3相同,说明每次执行第8条指令前,经过执行第7条指令能正确恢复r3中的值,因此第8条指令结合第7条指令能重复执行,记录可重复执行指令为第7条指令。
[0126]
6)重新将r置为空,此时r={},继续分析第6条指令,该指令的寻址方式为寄存器寻址,源寄存器为r3,目的寄存器为r11,将r3加入r,此时r={r3}。判断r11是否在集合r中,此时不在r中,则第6条指令是可以重复执行的,更新可重复执行指令为第6条指令。
[0127]
7)重新将r置为空,此时r={},继续分析第5条指令,该指令的寻址方式为寄存器寻址,源寄存器为r11,目的寄存器为r3,将r11加入r,此时r={r11}。判断r3是否在集合r中,此时不在r中,则第5条指令是可以重复执行的,更新可重复执行指令为第5条指令。
[0128]
8)重新将r置为空,此时r={},继续分析第4条指令,第4条指令分析过程与第6条指令相同,也是可以重复执行的,更新可重复执行指令为第4条指令。
[0129]
9)重新将r置为空,此时r={},继续分析第3条指令,第3条指令为立即数寻址,为可重复执行指令,更新可重复执行指令为第3条指令。
[0130]
10)重新将r置为空,此时r={},继续分析第2条指令,第2条指令与第8条指令类似,源寄存器和目的寄存器相同,记录为r3;继续判断第1条指令的目的寄存器为r2与记录的r3不同,因此第2条指令不可重复执行,终止查找,并记录最后一条可重复执行指令的位置和寄存器信息。由于查找到的最后一条可重复执行指令为第3条指令,因此最终记录的也就是第3条指令的位置。
[0131]
11)更新当前程序执行位置和寄存器信息为前面步骤10)中记录的可重复执行指令的位置和寄存器信息,即第3条指令的位置和寄存器信息,并让程序跳转到第3条指令的位置进行重复执行。
[0132]
实施例6
[0133]
在上述实施例1

实施例5提供的提高嵌入式软件健壮性的方法的基础上,本发明还提供了一种可用于实现上述方法的提高嵌入式软件健壮性的装置,如图6所示,是本发明实施例的装置架构示意图。本实施例的提高嵌入式软件健壮性的装置包括一个或多个处理器21以及存储器22。其中,图6中以一个处理器21为例。
[0134]
所述处理器21和所述存储器22可以通过总线或者其他方式连接,图6中以通过总线连接为例。
[0135]
所述存储器22作为一种提高嵌入式软件健壮性的方法非易失性计算机可读存储介质,可用于存储非易失性软件程序、非易失性计算机可执行程序以及模块,如实施例1中的提高嵌入式软件健壮性的方法。所述处理器21通过运行存储在所述存储器22中的非易失性软件程序、指令以及模块,从而执行提高嵌入式软件健壮性的装置的各种功能应用以及数据处理,即实现实施例1

实施例5的提高嵌入式软件健壮性的方法。
[0136]
所述存储器22可以包括高速随机存取存储器,还可以包括非易失性存储器,例如至少一个磁盘存储器件、闪存器件、或其他非易失性固态存储器件。在一些实施例中,所述存储器22可选包括相对于所述处理器21远程设置的存储器,这些远程存储器可以通过网络连接至所述处理器21。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。
[0137]
所述程序指令/模块存储在所述存储器22中,当被所述一个或者多个处理器21执行时,执行上述实施例1

实施例5中的提高嵌入式软件健壮性的方法,例如,执行以上描述的图1

图5所示的各个步骤。
[0138]
本领域普通技术人员可以理解实施例的各种方法中的全部或部分步骤是可以通过程序来指令相关的硬件来完成,该程序可以存储于一计算机可读存储介质中,存储介质可以包括:只读存储器(rom,read only memory)、随机存取存储器(ram,random access memory)、磁盘或光盘等。
[0139]
本领域的技术人员容易理解,以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1