单片机软件中断测试技术研究
2015-06-24代晓倩尤志坚
代晓倩++尤志坚
摘要:该文探讨了单片机软件测试的关键技术中断测试技术,并根据自己的测试实践讨论了型号项目软件测试中出现的问题。
关键词:软件测试;中断测试;单片机
中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2015)11-0195-02
Research of interrupt testing technology of Single Chip Microcomputer
Dai Xiao-qian,You Zhi-jian
(Shanghai Aerospace Electronic Technology Institute, Shanghai 201109, China)
Abstract: This paper discusses the important technology about interrupt testing of Single Chip Microcomputer software, according to the authors testing practice it discuss some issues derived from the software testing of a type of project.
Key words: software testing; Interrupt testing; Single Chip Microcomputer
单片机因其高可靠性已被广泛应用于航天系统中,因此单片机软件的可靠性也成为影响这些系统的非常关键的因素。由于中断技术在软件实时响应、多任务处理和突发事件响应中的优势,使得它在航天型号软件中不可或缺。但是中断程序执行的随机性,使得中断所带来的问题具有偶发性和隐蔽性,在软件测试中通常很难被发现,这给软件测试带来了很大的困难。
因此,本文结合航天软件测评工作的特点,将单片机软件中断测试细化到以下测试类型包括代码审查、性能测试、余量测试、强度测试中,力求中断测试更充分有效,更多发现问题。
1 代码审查
在实际应用中,由于中断和硬件、环境、以及应用密切相关,复杂性高,不可能进行充分的测试,所以必须在进行中断测试之前做好比较完备的中断代码审查及分析,然后在此基础上进行一些必要的测试。以单片机软件为例,做好中断的代码审查工作,除了编码的正确性需要得到保证之外,还需要着重对以下几个方面进行审查。
1.1 未使用中断向量是否处理
对未用中断的中断向量进行处理,避免触发未用中断或者跳到未用中断的中断向量区而带来的未知影响。处理方法可以采用跳转到统一的陷阱处理程序等。
1.2 软件复位是否进行两次中断返回
MSC-51单片机有两个中断优先级,如果软件在二级中断嵌套时走飞,随后由软件陷阱转入初始化程序时,则当前中断服务状态标志有2个,需要进行2次RETI操作来清除中断服务状态标志,否则,软件无法响应中断请求。代码实现如下:
1.3 检查是否存在函数重入
Keil c51默认环境下,函数如果不做特殊处理是不可重入的。如果函数调用有重入,会产生不同模块间变量相互覆盖的风险。对于无法避免重入函数的情况,设计师可编写两个语句相同名称不同的子函数分别供主程序和中断服务程序调用。
1.4 检查变量类型是否合理
在单片机高级语言编程中,对于在主程序和中断(或在不同优先级的中断)中同时用到的公共变量应尽量定义为单字节变量如unsigned char型。下文描述了一个错误的案例,代码如下图。
其中Int0为低优先级中断,Int1为高优先级中断。变量Cnt定义为16位unsigned int型,
在单片机中分高低字节存储。Int0中断服务子程序中Cnt加1(C语言描述为Cnt++)对应的汇编代码及解释如下:
其中“Cnt+01H”和“Cnt”分别表示存放Cnt变量的低字节和高字节数据地址。从上述汇编代码分析可知,当Int0中断服务子程序执行完第一句后执行第二句前,此时被高优先级的Int1中断打断,而后在Int1中断服务子程序中又将Cnt的高低字节均清为0,因此导致Int1中断处理结束后,程序回到Int0中断服务子程序执行上面第二句代码时,误以为是Cnt低字节加1溢出(0xff+1),因此将Cnt高字节加1(变为0x0100),进而导致后续大于200条件判断成立,即错误执行语句“Bus1553B= ERR;”从而导致软件复位1553B总线芯片。
1.5 中断资源冲突检查
中断程序可以在任何时刻运行,如某一资源同时为两个以上的中断程序或中断程序和主程序所使用,这时相互之间就可能发生资源冲突。当软件中断程序很长变量较多,并且比较复杂的情况下,中断资源冲突检查的难度也将大大增加。怎样才能做好中断资源冲突检查呢?目前,中断资源冲突检查主要还是采用人工分析方法,首先列出主程序和中断程序中使用的公共资源,包括括寄存器、变量、缓冲区、IO端口等等,并明确这些资源在函数中的访问特性,包括只读、只写、读写特性;接着对上述资源逐一分析,一般情况下,当公共资源在中断函数中为只读状态,不会与主程序使用该资源产生冲突;而当公共资源在中断函数中为读写或者只写状态时,就要注意资源使用冲突问题了。
做好中断资源冲突检查,测评人员不光要做到对中断程序心中有数,还要对整个系统运行十分清楚,这需要在工程实践中慢慢积累经验。
2 性能测试
与中断服务程序有关的性能好坏往往与软件质量有着密切的联系。通常可从以下几方面入手:
2.1 测试定时中断执行周期
主要测试定时中断周期设置是否合理,在被高优先级中断推迟执行的情况下,执行周期是否满足要求。
例如,若定时中断程序每0.5ms执行一次,且用来输出某周期性控制信号,而此周期信号的频率又被下级软件采集使用,则当软件中存在另一高优先级中断执行将定时中断推迟执行后,会直接影响某周期信号的输出,进而对下级软件的执行产生影响。
2.2 测试中断服务程序最长执行时间
通常中断服务程序执行时间不应太长,数据处理要尽量放在主程序中进行。在中断服务程序中应避免出现延时等待的语句。发生嵌套时高优先级的中断处理完毕后低优先级的中断应还有足够的时间继续处理。
测试的方法主要是利用性能测试的手段,得到高优先级和低优先级中断的最长处理时间,当中断嵌套产生时,高优先级中断最长处理时间加上低优先级中断最长处理时间应小于低优先级中断的产生周期。
2.3 分析中断执行时间对主循环的影响
主循环最大执行时间要考虑主循环被中断打断后的最大执行时间,并确认主循环最大执行时间是否仍然满足要求。
3 余量测试
中断的余量测试主要测试以下两点:
1) 中断执行时间的余量,一般针对有周期性时间要求的中断进行,测试的方法主要是利用性能测试的手段,得到中断的最长处理时间,中断处理时间一般要求留有20%的余量,即中断最长处理时间不应超过中断周期时间的80%。
2) 堆栈使用余量
函数/子程序嵌套、中断嵌套以及函数和中断之间的嵌套运行都要占用堆栈空间,而堆栈空间的不足会导致不可预知的后果。所以软件中断内代码不能太多,涉及变量也不要太多,否则可能会导致比较大的堆栈需要,甚至导致堆栈溢出。
堆栈使用情况的测试通常是先采用人工分析方法找出程序的最大调用深度即最长执行路径,然后在仿真环境中运行程序,记录SP指针的初始值,然后沿最大调用深度执行程序记录SP指针的最大值,最后计算堆栈空间余量。考虑系统升级和扩展的需要,堆栈使用余量要大于20%。
4 强度测试
中断的强度测试就是测试中断产生的频率达到什么情况时软件无法正常处理;一般都是对通讯类的中断进行强度测试,测试的方法是逐渐缩短中断产生的时间间隔直到软件无法正常响应,得到软件中断处理的强度。另外值得注意的是当缩短中断产生的时间间隔后,适当延长软件测试时间,往往可以加速暴露一些资源使用冲突问题,因此在进行强度测试时,在考虑增加频率的情况下应适当延长软件测试时间,使软件问题充分暴露。
5 结束语
本文从四大测试类型即代码审查、性能测试、余量测试、强度测试出发,全面总结了单片机软件中断测试技术。其中中断代码审查技术是重点也是基础,性能、余量、强度测试是深入化的测试,测试人员需灵活运用上述测试技术,才能较好的发现中断程序的问题,提高软件质量。
参考文献:
[1] 高锋,单片微型计算机原理与接口技术[M].科学出版社,2007.
[2] 柳纯录.软件评测师教程[M]. 清华大学出版社,2005.