1.5程序的调试
在对工程成功地进行汇编、连接以后,按Ctrl+F5 或者使用菜单Debug->Start/Stop Debug
Session 即可进入调试状态,Keil 内建了一个仿真CPU 用来模拟执行程序,该仿真CPU 功
能强大,可以在没有硬件和仿真机的情况下进行程序的调试。
进入调试状态后,Debug 菜单项中原来不能用的命令现在已可以使用了,多出一个用于
运行和调试的工具条,如图1-11 所示,Debug 菜单上的大部份命令可以在此找到对应的快
捷按钮,从左到右依次是复位、运行、暂停、单步、过程单步、执行完当前子程序、运行到
当前行、下一状态、打开跟踪、观察跟踪、反汇编窗口、观察窗口、代码作用范围分析、1
#串行窗口、内存窗口、性能分析、工具按钮等命令。
点击菜单 Peripherals,即会多出一项“键盘LED 仿真板(K)”,选中该项,即会出现如
图1-9 有关编译、连接、项目设置的工具条
图1-11 调试工具条
图 1-10 编译、连接后得到目标代码
图1-12 所示界面。
使用菜单 STEP 或相应的命令按钮或使用快捷键F11 可以单步执行程序,使用菜单STEP
OVER 或功能键F10 可以以过程单步形式执行命令,所谓过程单步,是指把C 语言中的一
个函数作为一条语句来全速执行。
按下 F11 键,可以看到源程序窗口的左边出现了一个黄色调试箭头,指向源程序的第一
行。每按一次F11,即执行该箭头所指程序行,然后箭头指向下一行,当箭头指向
“mDelay(1000);”行时,再次按下F11,会发现,箭头指向了延时子程序mDelay 的第一行。
不断按F11 键,即可逐步执行延时子程序。
如果 mDelay 程序有错误,可以通过单步执行来查找错误,但是如果mDelay 程序已正
确,每次进行程序调试都要反复执行这些程序行,会使得调试效率很低,为此可以在调试时
使用F10 来替代F11,在main 函数中执行到mDelay(1000)时将该行作为一条语句快速执行
完毕。
Keil 软件还提供了一些窗口,用以观察一些系统中重要的寄存器或变量的值,这也是很
重要的调试方法。
以下通过一个对延时程序的延迟时间的调整来对这些调试方法作一个简单的介绍。
这个程序中用到了延时程序 mDelay,如果使用汇编语言编程,每段程序的延迟时间可
以非常精确地计算出来,而使用C 语言编程,就没有办法事先计算了。为此,可以使用观
察程序执行时间的方法了来解。进入调试状态后,窗口左侧是寄存器和一些重要的系统变量
的窗口,其中有一项是sec,即统计从开始执行到目前为止用去的时间。按F10,以过程单
步的形式执行程序,在执行到mDelay(1000)这一行之前停下,查看sec 的值(把鼠标停在sec
后的数值上即可看到完整的数值),记下该数值,然后按下F10,执行完mDelay(1000)后再
次观察sec 值,如图1-13 所示,这里前后两次观察到的值分别是:0.00040400 和1.01442600,
其差值为1.014022s,如果将该值改为124 可获得更接近于1s 的数值,而当该值取123 时所
获得的延时值将小于1s,因此,最佳的取值应该是124。
图 1-12 51 单片机实验仿真板
Session 即可进入调试状态,Keil 内建了一个仿真CPU 用来模拟执行程序,该仿真CPU 功
能强大,可以在没有硬件和仿真机的情况下进行程序的调试。
进入调试状态后,Debug 菜单项中原来不能用的命令现在已可以使用了,多出一个用于
运行和调试的工具条,如图1-11 所示,Debug 菜单上的大部份命令可以在此找到对应的快
捷按钮,从左到右依次是复位、运行、暂停、单步、过程单步、执行完当前子程序、运行到
当前行、下一状态、打开跟踪、观察跟踪、反汇编窗口、观察窗口、代码作用范围分析、1
#串行窗口、内存窗口、性能分析、工具按钮等命令。
点击菜单 Peripherals,即会多出一项“键盘LED 仿真板(K)”,选中该项,即会出现如
图1-9 有关编译、连接、项目设置的工具条
图1-11 调试工具条
图 1-10 编译、连接后得到目标代码
图1-12 所示界面。
使用菜单 STEP 或相应的命令按钮或使用快捷键F11 可以单步执行程序,使用菜单STEP
OVER 或功能键F10 可以以过程单步形式执行命令,所谓过程单步,是指把C 语言中的一
个函数作为一条语句来全速执行。
按下 F11 键,可以看到源程序窗口的左边出现了一个黄色调试箭头,指向源程序的第一
行。每按一次F11,即执行该箭头所指程序行,然后箭头指向下一行,当箭头指向
“mDelay(1000);”行时,再次按下F11,会发现,箭头指向了延时子程序mDelay 的第一行。
不断按F11 键,即可逐步执行延时子程序。
如果 mDelay 程序有错误,可以通过单步执行来查找错误,但是如果mDelay 程序已正
确,每次进行程序调试都要反复执行这些程序行,会使得调试效率很低,为此可以在调试时
使用F10 来替代F11,在main 函数中执行到mDelay(1000)时将该行作为一条语句快速执行
完毕。
Keil 软件还提供了一些窗口,用以观察一些系统中重要的寄存器或变量的值,这也是很
重要的调试方法。
以下通过一个对延时程序的延迟时间的调整来对这些调试方法作一个简单的介绍。
这个程序中用到了延时程序 mDelay,如果使用汇编语言编程,每段程序的延迟时间可
以非常精确地计算出来,而使用C 语言编程,就没有办法事先计算了。为此,可以使用观
察程序执行时间的方法了来解。进入调试状态后,窗口左侧是寄存器和一些重要的系统变量
的窗口,其中有一项是sec,即统计从开始执行到目前为止用去的时间。按F10,以过程单
步的形式执行程序,在执行到mDelay(1000)这一行之前停下,查看sec 的值(把鼠标停在sec
后的数值上即可看到完整的数值),记下该数值,然后按下F10,执行完mDelay(1000)后再
次观察sec 值,如图1-13 所示,这里前后两次观察到的值分别是:0.00040400 和1.01442600,
其差值为1.014022s,如果将该值改为124 可获得更接近于1s 的数值,而当该值取123 时所
获得的延时值将小于1s,因此,最佳的取值应该是124。
图 1-12 51 单片机实验仿真板