观察窗口是很重要的一个窗口,存储器中仅可以观察到工作寄存器和有限的寄存器(如a、b、dptr等),如果需要观察其他的寄存器的值或者在高级语言编程时需要直接观察变量,就要借助于观察窗口了。其他窗口将在以下的实例中介绍。一般情况下,仅在单步执行时才对变量的值的变化感兴趣,全速运行时,变量的值是不变的,只有在程序停下来之后,才会将这些值最新的变化反映出来,但是,在一些特殊场合下也可能需要在全速运行时观察变量的变化,此时可以选择“view”→“periodicwin-dowupdata”(周期更新窗口),确认该项处于被选中状态,即可在全速运行时动态地观察有关值的变化。但是选中该项,将会使程序模拟执行的速度变慢。
以下通过一个高级语言程序示例来说明这些窗口的使用。
图7-38 存储器窗口寄存页
【例7-2】 高级语言程序如下:
这个程序的工作过程是:不断调用延时程序,每次延时10ms,然后将变量i加1,随后对变量i进行判断,如果i的值等于10,那么将p1.0取反,并将i清“0”,最终的执行效果是p1.0每0.1s取反一次。
输入源程序并以exam2.c为文件名存盘,建立名为exam2的项目。将exam2.c加入项目,编译、连接后按ctrl+f5键进入调试,按f10键单步执行。注意观察窗口,其中有一个标签页为“locals”,这一页会自动显示当前模块中的变量名及变量值。可以看到窗口中有名为i的变量,其值随着执行的次数而逐渐增加,如果在执行到“mdelay(10)”行时按f11键跟踪到mdelay函数内部,该窗口的变量自动变为delaytime和j。另外两个选项卡“watch#1”和“watch#2”可以加入自定义的观察变量,单击“typef2toedit”后再按f2键即可输入变量,试着在“watch#1”中输入i,观察它的变化。在程序较复杂,变量很多的场合,这两个自定义观察窗口可以筛选出我们自己感兴趣的变量加以观察。观察窗口中变量的值不仅可以观察,还可以修改,以该程序为例,i须加10次才能到10,为快速验证是否可以正确执行到“p10=!p10”行,单击i后面的值,再按f2键,该值即可修改,将i的值改到9,再次按f10键单步执行,即可以很快执行到“p10=!p10”行。该窗口显示的变量值可以以十进制或十六进制形式显示,方法是在显示窗口单击鼠标右键,在快捷菜单中按图7-39所示选择。
图7-39 设定观察窗的显示方式
选择“view”→“dissamblywindow”可以打开反汇编窗口,该窗口可以显示反汇编后的代码、源程序和相应反汇编代码的混合代码,可以在该窗口进行在线汇编、利用该窗口跟踪已找行的代码、在该窗口按汇编代码的方式单步执行,这也是一个重要的窗口。打开反汇编窗口,单击鼠标右键,出现快捷菜单,如图7-40所示。
(www.xing528.com)
图7-40 反汇编窗口快捷菜单
其中,“mixedmode”是以混合方式显示,“assemblymode”是以反汇编码方式显示。程序调试中常使用设置断点,然后全速运行的方式,在断点处可以获得各变量值,但却无法知道程序到达断点以前究竟执行了哪些代码,而这往往是需要了解的。为此,keil提供了跟踪功能,在运行程序之前打开调试工具条上的允许跟踪代码开关,然后全速运行程序,当程序停止运行后,单击查看跟踪代码按钮,自动切换到反汇编窗口,其中前面标有“-”号的行就是中断以前执行的代码,可以单击窗口边的上卷按钮,上翻查看代码执行记录。
利用工程窗口可以观察程序执行的时间,下面观察一下该例中延时程序的延时时间是否满足要求,即是否确实延时10ms,展开存储器窗口regs选项卡中的“sys”目录树,其中的“sec”项记录了从程序开始执行到当前程序流逝的秒数。单击“rst”按钮以复位程序,“sec”的值回零,按下f10键,程序窗口中的黄色箭头指向“mdelay(10)”行,此时,记录下“sec”值为000038900,然后再按f10键执行完该段程序,再次查看“sec”的值为001051200,两者相减大约是001s,所以延时时间大致是正确的。读者可以试着将延时程序中的“unsignedint”改为“unsignedchar”,看时间是否仍正确。注意,使用这一功能的前提是在项目设置中正确设置晶体振荡频率的数值。
keil提供了串行窗口,我们可以直接在串行窗口中键入字符,该字符虽不会被显示出来,但却能传递到仿真cpu中。如果仿真cpu通过串口发送字符,那么这些字符会在串行窗口显示出来,用该窗口可以在没有硬件的情况下用键盘模拟串口通信。下面通过一个例子说明keil串行窗口的应用。该程序实现一个行编缉功能,每键入一个字母,会立即回显到窗口中。编程的方法是通过检测ri是否等于1来判断串口是否有字符输入,如果有字符输入,则将其送到sbuf,这个字符就会在串行窗口中显示出来。其中ser_init是串行口初始化程序,要使用串口,必须首先对串口进行初始化。
【例7-3】 keil串行窗口应用示例。示例程序如下:
输入源程序,并建立项目,正确编译、连接,进入调试后,全速运行,单击串行窗口1按钮,即在原源程序窗口位置出现一个空白窗口,即可在窗口中输入相应的字母。在窗口中单击鼠标右键,出现一个快捷菜单,选择“asciimode”即以ascii码的方式显示接收到的数据;选择“hexmode”以十六进制码方式显示接收到的数据;选择“clearwindow”可以清除窗口中显示的内容。
由于部分cpu具有双串口,故keil提供了两个串行窗口,本章选用的89c51芯片只有一个串口,所以“serial2”串行窗口不起作用。
上面简单介绍了软件调试的基本方法,在实际使用工程中,可以灵活使用,或多种方法综合使用,以更好地分析程序。
项目文件经过调试通过后,说明功能基本达到了设计要求。下一步是将经过软件仿真后的程序加载到硬件目标板上调试运行。有条件的话,一般在将程序加载到实际的目标板上之前,还要将软件先加载到硬件仿真器进行硬件仿真。硬件仿真的方法与采用的仿真板关系密切。限于篇幅,本书对该部分内容不作介绍。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。