ADS调试程序时进入死循环

[现象]

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值