织梦CMS - 轻松建站从此开始!

罗索

ADS调试程序时进入死循环

落鹤生 发布于 2010-05-19 08:16 点击:次 
在用ARM的ADS调试的时候,在调试某一行看起来极其简单,应该不会出错的程序时候,按F8希望进入该函数,但是整个程序却死了,中断运行,显示的信息如下所示: DBE Warning 00056: The statement into which was stepped is singular (i.e. it has no exit)
TAG:

 

[现象]

在用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.以后一定要记住,在申请空间后,一定要判断返回值是否为空.任何一处的返回值判断都不能少,否则就会出现严重时甚至会导致系统崩溃的问题....

(serial_story)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201005/9438.html]
本文出处:百度博客 作者:serial_story
顶一下
(1)
100%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容