在使用Keil进行单片机程序调试的时候,有时会遇到无法设置断点的问题。这主要是因为Keil调试时使用了单步执行的方式,而该方式与单片机架构的特点不兼容导致的。
单片机架构有三个特点:分立式、同步式、时序式。分立式意味着在单片机中,每一种器件、每一条线路都是独立的,没有一条唯一的控制总线;同步式则表示即使几个操作是同时开始的,也要按照一个确定的事件顺序完成;时序式代表着各种操作必须在一个确定的时间内完成。
Keil在调试时使用单步执行的方式,即一次只执行一条指令,然后将程序计数器(PC)指向下一条指令。这样的方式无法满足单片机的同步式和时序式特点,因为在单片机中,不同的操作可能同时开始,但需要按照特定的时序依次完成,一次只执行一条指令的方式就无法满足这个要求。
因此,即使在代码中设置了断点,在Keil中也无法直接将CPU停在指定的地址上,而是只能跳过该操作,单步执行下一条指令。
既然Keil无法直接满足单片机特点,我们需要采用其他方式来解决无法设置断点的问题。一种常用的方法是在程序中插入一些占位语句,这些语句不会影响程序的执行,但是可以让Keil在调试时停在这些语句上,达到类似断点的效果。
比如,我们可以在代码中加入一些空的While循环:
while(1)
//占位语句
这样,在Keil调试时就可以停在这些占位语句上,达到类似断点的效果了。
另外,还可以使用仿真器进行调试,因为仿真器是基于模拟电路完成调试的,不会受到单步执行的限制,可以满足单片机的特点。不过,使用仿真器需要相应的调试工具和硬件支持,不是所有人都能轻松使用。