www.pudn.com > KEIL.zip > keil调试.txt, change:2013-04-07,size:5048b


KeilKeil的调试命令的调试命令KeilKeil的调试命令的调试命令KeilKeil的调试命令的调试命令KeilKeil的调试命令的调试命令电子工程系电子工程系  
2010.122010.12调试的重要性?以前我们学习了如何建立工程、写C源文件、  
连接工程,并获得目标代码,但是做到这一步  
仅仅代表你的源程序没有语法错误,至于源程  
序中存在着的其它错误,必须通过调试才能发序中存在着的其它错误,必须通过调试才能发  
现并解决。事实上,除了极简单的程序以外,  
绝大部份的程序都要通过反复调试才能得到正  
确的结果,因此,调试是软件开发中重要的一  
个环节。主要内容?常用调试命令  
?常用窗口  
输出窗口输出窗口  
观察窗口  
反汇编窗口  
?结合实例常用调试命令?在对工程成功地进行汇编、连接以后,  
按Ctrl+F5或者使用菜单Debug-  
>Start/Stop Debug Session即可进入  
调试状态,Keil内建了一个仿真CPU用来调试状态,Keil内建了一个仿真CPU用来  
模拟执行程序,该仿真CPU功能强大,  
可以在没有硬件和仿真机的情况下进行  
程序的调试?进入调试状态后,界面与编缉状态相比有明显的变化,  
Debug菜单项中原来不能用的命令现在已可以使用了,  
工具栏会多出一个用于运行和调试的工具条,如图1所  
示,Debug菜单上的大部份命令可以在此找到对应的示,Debug菜单上的大部份命令可以在此找到对应的  
快捷按钮,从左到右依次是复位、运行、暂停、单步、  
过程单步、执行完当前子程序、运行到当前行、下一  
状态、打开跟踪、观察跟踪、反汇编窗口、观察窗口、  
代码作用范围分析、1#串行窗口、内存窗口、性能分  
析、工具按钮等命令。?学习程序调试,必须明确两个重要的概念:单步执行  
与全速运行。  
?全速执行是指一行程序执行完以后紧接着执行下一行  
程序,中间不停止,这样程序执行的速度很快,并可  
以看到该段程序执行的总体效果,即最终结果正确还  
是错误,但如果程序有错,则难以确认错误出现在哪  
些程序行。些程序行。  
?单步执行是每次执行一行程序,执行完该行程序以后  
即停止,等待命令执行下一行程序,此时可以观察该  
行程序执行完以后得到的结果,是否与我们写该行程  
序所想要得到的结果相同,借此可以找到程序中问题  
所在。程序调试中,这两种运行方式都要用到。?使用菜单STEP或相应的命令按钮或使用  
快捷键F11可以单步执行程序,使用菜单  
STEP OVER或功能键F10可以以过程单  
步形式执行命令,所谓过程单步,是指步形式执行命令,所谓过程单步,是指  
将汇编语言中的子程序或高级语言中的  
函数作为一个语句来全速执行。观察窗口?观察窗口是很重要的一个窗口,工程窗口中仅  
可以观察到工作寄存器和有限的寄存器如A、  
B、DPTR等,如果需要观察其它的寄存器的  
值或者在高级语言编程时需要直接观察变量,值或者在高级语言编程时需要直接观察变量,  
就要借助于观察窗口了。?#include"reg51.h"  
?sbit P1_0=P1^0;  
?void mDelay(unsigned char DelayTime)  
?{unsigned int j=0;  
?for(;DelayTime>0;DelayTime--)  
?{for(j=0;j<125;j++)  
?{;}  
?}  
?}  
?void main()  
?{unsigned int i;  
?for(;;)?for(;;)  
?{mDelay(10);  
?i++;  
?if(i==10)  
?{P1_0=!P1_0;  
?i=0;  
?}  
?}  
?}?编译、连接后按Ctrl+F5进入调试,按F10单步执行。  
注意观察窗口,其中有一个标签页为Locals,这一页  
会自动显示当前模块中的变量名及变量值。可以看到  
窗口中有名为I的变量,其值随着执行的次数而逐渐  
加大,如果在执行到mDelay(10)行时按F11跟踪到加大,如果在执行到mDelay(10)行时按F11跟踪到  
mDelay函数内部,该窗口的变量自动变为DelayTime  
和j。另外两个标签页Watch #1和Watch #2可以加  
入自定义的观察变量,点击“type F2 to edit”然后再  
按F2即可输入变量,试着在Watch #1中输入I,观察  
它的变化。观察窗口?观察窗口中变量的值不仅可以观察,还可以修  
改,以该程序为例,I须加10次才能到10,为  
快速验证是否可以正确执行到P1_0=!P1_0行,  
点击I后面的值,再按F2,该值即可修改,将  
I的值改到9,再次按F10单步执行,即可以很  
IF2  
I的值改到9,再次按F10单步执行,即可以很  
快执行到P1_0=!P1_0程序行。该窗口显示的  
变量值可以以十进制或十六进制形式显示,方  
法是在显示窗口点右键,在快捷菜单中选择如  
图5所示。?点击View->Dissambly Window可以打开反汇编窗口,  
该窗口可以显示反汇编后的代码、源程序和相应反汇  
编代码的混合代码,可以在该窗口进行在线汇编、利编代码的混合代码,可以在该窗口进行在线汇编、利  
用该窗口跟踪已找行的代码、在该窗口按汇编代码的  
方式单步执行,这也是一个重要的窗口。打开反汇编  
窗口,点击鼠标右键,出现快捷菜单,如图6所示,  
其中Mixed Mode是以混合方式显示,Assembly   
Mode是以反汇编码方式显示。?程序调试中常使用设置断点然后全速运行的方  
式,在断点处可以获得各变量值,但却无法知  
道程序到达断点以前究竟执行了哪些代码,而  
这往往是需要了解的,为此,Keil提供了跟踪  
功能,在运行程序之前打开调试工具条上的允  
许跟踪代码开关,然后全速运行程序,当程序许跟踪代码开关,然后全速运行程序,当程序  
停止运行后,点击查看跟踪代码按钮,自动切  
换到反汇编窗口,如图6所示,其中前面标有  
“-”号的行就是中断以前执行的代码,可以按  
窗口边的上卷按钮向上翻查看代码执行记录。?利用工程窗口可以观察程序执行的时间,下面我们观  
察一下该例中延时程序的延时时间是否满足我们的要  
求,即是否确实延时10毫秒,展开工程窗口Regs页中  
的Sys目录树,其中的Sec项记录了从程序开始执行到  
当前程序流逝的秒数。点击RST按钮以复位程序,  
Sec的值回零,按下F10键,程序窗口中的黄色箭头指  
向mDelay(10)行,此时,记录下Sec值为  
0.00038900F10  
mDelay(10)Sec  
0.00038900,然后再按F10执行完该段程序,再次查  
看Sec的值为0.01051200,两者相减大约是0.01秒,  
所以延时时间大致是正确的。读者可以试着将延时程  
序中的unsigned int改为unsigned char试试看时间是  
否仍正确。注意,使用这一功能的前提是在项目设置  
中正确设置晶振的数值。