首 页 » 程序开发 » 调试运行正常,离开调试后却运行不正常问题总结

调试运行正常,离开调试后却运行不正常问题总结

[ 2013-04-23 22:09 | 浏览次数: 3,344次 | 0条评论 ]

这里主要讲嵌入式设备,因为这些设备最容易出问题.

所讲嵌入式设备包含各种单片机, 各种ARM(cortex-M)等等,比如PIC, ,,,msp,义隆,飞思卡尔()(,k15等等),Samsung、NXP、 Cirrus Logic、Atmel、TI、STM、Winbond.

我们有时会碰到一些奇怪的问题,比如在线调试(DEBUG),离开(断开/退出),下载(烧录)后却运行不正常了.

我就目前我所碰到的问题总结一下.

1.单步执行正常,继续执行(resume),程序看起来不往下执行了,直接下载后执行也是看起来不执行了.

问题分析: 单步正常,继续执行不正常,break断下来发现好像只执行了几行代码.

首先排除被watchdog重启,因为代码还是在这个位置. 硬件问题或调试器连接问题,这个看起来没有问题,因为break时正常.

原因: 某个地方触发了中断, 且中断函数没有清除中断标志,所以不单步执行(直接执行)时会不停的进中断,又由于中断标志没有清空,所以中断函数不停的进入, 所以代码看起来没有往下执行.  至于能够单步执行,是因为单步执行也是中断来实现的,它抢了那个中断.所以能够单步执行.

2.调试运行正常,下载后离开调试看起来好像没有运行似的.

问题分析:首先都是同样的代码,同样的bin文件,这可能就跟运行环境有关了.

原因:

a. 调试运行时在ram中(有些人为了加快调试速度,会把程序放在ram中跑),自然download时没用了,因为关机之后就没有代码了.

b.调试时ide关闭了watchdog,单独跑时,由于没有关watchdog,所以程序在不停的重启.

c. 代码中使用了semihost的printf, 由于semihost的printf会去等待调试器接受输出,所以如果没有调试器,那么printf将会不返回,死循环.这样程序运行到printf就停掉了.

 

注:调试()和直接运行的区别:

1.调试一般会自动关watchdog

2.调试可以接受printf输出到debug console(调试器终端/模拟串口)

3.调试单步执行也是用了中断,所以可能会影响其他中断

4.单步调试会停下timer,pwm输出,ADC转换等功能,这是为了方便调试,所以遇到问题先不要单步,让它跑起来,看看效果.

您可以任意转载本文,但转载时请勿删除作者信息。
作者:hgyxbll,原文链接:http://shashanzhao.com/archives/784.html
上一篇: | 下一篇:

沙发为空,还不快枪?[点此发言]

目前还没有任何评论.