3.进入调试 3.1用AvrStudio进行调试 进入AVRStudio后,如图1所示,可以看到,除了标准的菜单、工具条等之外,下面就是若干个窗口。其中中部左侧是Workspace窗口,该窗口有3个页面卡,进入调试后自动转到I/O页面,这里有单片机内部的各种资源。从这里,可以看出为什么在进入调试时要选定型号了,选了型号,这里出现的内容也各不相同。我们点击Portb将Portb展开,可以看到有3个项: PORTB 端口寄存器 DDRB 端口方向寄存器 PINB 引脚 用十六进制和二进制方式清晰地表达出了各位的清况。 右侧是源程序窗口,黄色箭头指向主程序。 这两个窗口下面又有两个窗口,左侧是OutPut窗口,进入调试后自动切换到信息页面。显示了调入文件的各种信息。右侧是观察窗口,有若干个页面卡,可以分组在各种页面卡中显示变量值。 除此之外,还可以通过菜单View分别调出寄存器、内存等各个不同的观察窗口。
 图1 AvrStudio的窗口 按下F11,即可单步执行程序,按下F10可以用过程单步的方式执行程序(将一个函数作为一个语句来执行,不进入这个函数的内部)。 按下F10以过程单步的方式执行(很奇怪,io_init()按说应该一次执行完毕,但却跟踪进入了这个函数体,原因暂未明),执行到:DDRB=0x01后可以看到左侧窗口中DDRB的相应变化。如图2所示。
 图2 DDRB的变化 继续按F10执行程序,可以看到PORTB和PINB都发生了变化,如图3所示
 图3 PORTB和PINB发生变化 执行一个循环后,我们按F11,跟踪到函数内部看一看,如图4所示是跟踪进入了mDelay函数。 此时,可以看到,观察窗口中原来没有显示的变量此时已显示出了其数值。  图4 进入mDelay函数 这样,一步一步执行程序,即可观察各变量的变化。如果跟踪一段时间后已查看到结果,觉得这样的查看太慢了,也可以将光标置于本函数的未一行,然后点击Debug->Run to Cursor,即可全速执行到该光标处。 在调试时,我们也感到AvrStudio的模拟执行速度较慢,比如mDelay(500)在实际中延时约0.5s,但在作者的机器上却要执行好长一段时间―――我的机器还算是新的。因此,在调试时希望先给一个较小的数值,以免影响调试的效率。为此,回到winavr的Programmer Notpad中,将mDelay(500)改为mDelay(5),然后重新编译,切换回AvrSTudio时,可以发现AVRStudio已“察觉”这种变化,并询问是否要重新加载,如图5所示。  图5 重新加载更新了的目标文件 除了以上的一些调试方法外,Debug菜单还提供了诸如Reset(复位)、AutoStep(自动单步)等调试手段,大家可以自行测试。 3.2用AtmanAvr进行调试 如果使用AtmanAvr,那么在编译完成后,按F5进入调试。此时,可以看到菜单上多出一项Debug项,同时,在菜单、工具条的下方多出了一些窗口,如图6所示。从图中可以看出,其窗口与图1有些类似,事实上,Atmavr应该是嵌入的AvrStudio的早期版本的调试窗口。 除了这些窗口外,还可以通过查看->调试窗口 选项来获得更多的窗口,除了AvrStudio原有的一些窗口外,AtmanAvr还得供了LCD、LED和键盘这样三个窗口,可用于真实仿真。  图6 AtmanAvr进入仿真状态 进行调试的方法和3.1节的叙述基本类似,通过Debug菜单进行单步、过程单步、全速、自动单步、设置断点、运行到光标处等方法进行程序的调试,这里就不再一一叙述了。Debug菜单条如图7所示。
 图7 AtmAvr的Debug菜单条
|
|