[现象]
在用ARM的ADS调试的时候,在调试某一行看起来极其简单,应该不会出错的程序时候,按F8希望进入该函数,但是整个程序却死了,中断运行,显示的信息如下所示:
DBE Warning 00056: The statement into which was stepped is singular (i.e. it has no exit)
经过调试,最终发现,是在执行此行程序之前,由于申请emWin的Memory Device,也就是申请一块内存的时候,由于堆内空闲空间不够,所以申请失败,所以获得的该memdev的指针也就为NULL了,而接着的memset操作,导致清空了不该清空的内容,好像是清空了0x0002C或者0x0000,往后一段空间,主要是中断向量表之类的内容,因此,在下面的执行之前,栈内的各个变量,如堆栈指针sp内容也都不对了,而且pc的值,也不对了,最后是PC的值为0,因此程序执行了reset,进入了死循环.
[办法]
将emWin的堆的空间大小的宏定义GUI_ALLOC_SIZE加大,重新编译emWin的库
[总结]
1.开始时候,看堆栈的sp有问题,怀疑是堆栈溢出,sp的值应该在0x3065073c -> 0x3064c73c之间,但是此时sp已经是0x00045C之类的值,显然不是溢出,而是被冲掉了.所以继续debug,才知道是申请memdev失败返回memdev指针对空,而后的memset,将0x0002C之后的一段代码清空所导致的问题.
2.以后一定要记住,在申请空间后,一定要判断返回值是否为空.任何一处的返回值判断都不能少,否则就会出现严重时甚至会导致系统崩溃的问题….
转载请注明:在路上 » ADS调试程序时进入死循环