问题描述:程序其他执行逻辑都正确,但是突然发现某个全局变量的值不按照预期的设计变化(比如,本来还每秒钟累加一次,结果值变成一个特别大的值且不变化)。或者发现某个函数执行逻辑与预期不符。
问题原因分析:通过单步调试程序,发现是程序执行到某个中断服务函数A后,全局变量或函数才开始变得异常。分析该中断回调函数的内容,发现其中使用了两个长度为1000字节左右的数组。同时,再结合程序编译后生成的map文件,发现map文件中为中断服务函数栈空间分配的2048字节。而从map文件可以看到该中断服务函数A所占用的中断栈空间已达到2116字节。因此,可以判断是由于中断栈空间溢出,导致非法修改了和该中断栈空间相邻的全局变量或函数内容,从而出现问题描述中的现象。
解决办法:不要在中断服务函数中使用超过栈空间大小的变量;或者使用传递指针的方式访问超长变量;或者修改配置文件,将中断服务函数的栈空间长度加大,以避免栈溢出。