在用KEIL调试程序时,遇到读取外部数据、死循环使得程序不能继续执行时怎么办?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在用KEIL调试程序时,遇到读取外部数据、死循环使得程序不能继续执行时怎么办?相关的知识,希望对你有一定的参考价值。

在循环处设断点,程序执行到后修改一下外部数据,使其满足跳出循环的条件,然后再执行,这样就可以继续调试下去。如果这种情况很多,可以通过在程序中增加条件编译语句方便调试。比如:

#define DEBUG //条件编译选择,可放在文件头部.H文件之后。
。。。。。。。

#ifdef DEBUG
x=0; //调试时使用这条语句,执行下一句时就能跳出循环了
#endif
while(x==1); //假设这就是你所说的读取外部数据的语句,未读到数据则原地循环

调试完成后注掉#define DEBUG,也就是
//#define DEBUG
这样正式编译时x=0;这条语句就不会被编译进去了。以后调试时再恢复。

这只是个例子,相信你能理解这个含义从而加以应用。
参考技术A 怎么会呢?你的调试环境选择使用外部总线了没?追问

什么外部总线?可以说清楚点吗?

我用keil进行调试时,程序总是自汇编的一段程序里反复执行,无法跳到main函数,请问一下大家怎么解决

0x0000089A F000FAAD BL.W 0x00000DF8
0x0000089E F000FA8F BL.W 0x00000DC0
0x000008A2 F7FFFE52 BL.W 0x0000054A
0x000008A6 E7F8 B 0x0000089A
这是程序在汇编不断循环执行的语句
请教一下大家怎么解决这个问题

1. 正式产品的C51程序应该是一个死循环。如果不是死循环,执行完main后,执行RET,将会将堆栈里的数据当做地址压入PC,程序跑错。最后会回到地址0000H,重新开始,进入main。你仿真在00H做中断,就会发现他回去了。
2. 你说的不清楚,跳转还是会跳转的。程序运行结果正确就说明没有错。除非你程序错误。如果你是在仿真时看到没有跳转,还是在那一行,那是他还有数据要处理,看汇编就知道了。
参考技术A 需要整体看代码的,仅看这几行跳转指令,解答不了 参考技术B 你那个汇编程序就是个死循环啊,你是用ARM芯片吗?在ARM7和Cortex-M3的启动代码中,默认异常处理都是死循环的,看你是否触发了异常? 参考技术C 关注这个问题 参考技术D 检查你的系统时钟配置是否异常?

以上是关于在用KEIL调试程序时,遇到读取外部数据、死循环使得程序不能继续执行时怎么办?的主要内容,如果未能解决你的问题,请参考以下文章

KEIL里代码debug时无法打点

c程序hex文件在用keil2编译生成新的hex文件怎么不一样了

如何使 GDB 与外部程序一起工作

keil调试中的问题。

keil uVision3 输入程序时,输入的程序不对齐?

STM32的SWD调试进不了main函数