程序调试时,一些程序行必须满足一定的条件才能被执行到(如程序中某变量达到一定的值、按键被按下、串口接收到数据、有中断产生等),这些条件往往是异步发生或难以预先设定的,这类问题使用单步执行的方法是很难调试的,这时就要使用到程序调试中的另一种非常重要的方法——断点设置。断点设置的方法有多种,常用的是在某一程序行设置断点,设置好断点后可以全速运行程序,一旦执行到该程序行即停止,可在此观察有关变量值,以确定问题所在。在程序行设置、移除断点的方法是将光标定位于需要设置断点的程序行,依次选择“debug”→“insert/removebreakpoint”设置或移除断点(也可以用鼠标在该行双击实现同样的功能);“debug”→“enable/disablebreakpoint”是开启或暂停光标所在行的断点功能;“debug”→“disableallbreakpoint”暂停所有断点;“debug”→“killallbreakpoint”清除所有的断点设置。
这些功能也可以用工具条上的快捷按钮进行设置。除了在某程序行设置断点这一基本方法以外,keil软件还提供了多种设置断点的方法,选择“debug”→“breakpoints”即出现一个对话框,该对话框用于对断点进行详细的设置,如图7-34所示。
图7-34 断点设置对话框
图7-34中“expression”后的文本框内用于输入表达式,该表达式用于确定程序停止运行的条件,这里表达式的定义功能非常强大,涉及keil内置的一套调试语法,这里不作详细说明,仅举若干实例,希望读者可以举一反三。
1)在“experssion”中键入“a==0xf7”,再单击“define”即定义了一个断点。注意,a后有两个等号,意即相等。该表达式的含义是:如果a的值到达0xf7则停止程序运行。除使用相等符号之外,还可以使用“>”、“>=”、“<”、“<=”,“!=”(不等于)、“&”(两值按位与)、“&&”(两值相与)等运算符号。(www.xing528.com)
2)在“experssion”中键入“delay”,再单击“define”,其含义是如果执行标号为de-lay的行则中断。
3)在“experssion”中键入“delay”,按“count”后的微调按钮,将值调到3,其意义是当第3次执行到delay时才停止程序运行。
4)在“experssion”中键入“delay”,在“command”中键入“printf("subroutinedelayhasbeencalled\n")”,则主程序每次调用delay程序时并不停止运行,但会在输出窗口“command”页输出一行字符,即“subroutinedelayhasbeencalled”。其中“\n”的用途是回车换行,使窗口输出的字符整齐。
5)设置断点前先在输出窗口的“command”页中键入“defineinti”,断点设置同第4)步,但是“command”后键入“printf("subroutinedelayhasbeencalled%dtimes\n",++i)”,则主程序每次调用“delay”时将会在“command”窗口输出该字符及被调用的次数,如“subroutinedelayhasbeencalled10times”。对于使用c语言程序的调试,表达式中可以直接使用变量名,但必须要注意,设置时只能使用全局变量名和调试箭头所指模块中的局部变量名。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。