4、数组越界 原因:程序中定义的数组元素的个数小于程序中实际使用的数组元素的个数,数组使用循环函数时,如果循环变量没控制好则会出现数组越界,意外修改其他变量值可能会导致程序异常。 解决方法:检查函数中调用的数组是否存在越界的情况。 示例: A.定义SendBuffer和RecBuffer两个数组变量,数组长度为5,初值均为0。
B.主程序中对数组SendBuffer[0]~ SendBuffer[4]赋值,此时SendBuffer[5]和SendBuffer[6]也被意外赋值,从watch窗口可以看出,这两个值改变了原来RecBuffer[0]和RecBuffer[1]的值,可能会造成程序异常。
5、堆栈溢出 原因:函数嵌套太深或者局部变量太多导致超出堆栈空间,正常数据被改写。 解决方法:尽量减少函数调用层级,局部变量不要使用太多,尤其是局部大数组,从而减少压栈的时候所需的空间。 示例: A.定义4个全局变量和1个局部变量数组,总共占用RAM空间为249个字节
B.计算程序中所需的堆栈大小,主程序中调用Delay()函数,占用2个字节,中断服务函数占用16个字节,中断嵌套调用leddisplay()函数,占用2个字节,总共需要20个字节堆栈空间,由A可知,系统只剩下6个字节堆栈空间,所以程序运行后,堆栈一定会溢出。
C.运行程序,正常现象为P40端口一直翻转,TestData变量值始终为0,触发外部中断0,进入中断服务程序后,可以看到SP堆栈指针已经溢出,同时将R7寄存器的值压栈到0x08的地址上,通过.m51文件可以查到0x08正好是TestData变量地址,所以TestData的值被误改为0x01,导致主程序中条件判断出错,程序异常。
在调试MCU程序过程中,由于程序书写的不规范产生程序漏洞,跑飞现象比较常见,如果我们提前了解程序可能跑飞的原因,对于快速定位问题有很大帮助,从而提高分析和解决问题的效率,减少产品的开发周期,加速产品的上市时间。
|