首页 理论教育Proteus单片机C程序调试技巧

Proteus单片机C程序调试技巧

【摘要】:要想在Proteus中对单片机的C程序进行调试与跟踪,单片机加载的程序必须要有可供调试的信息。Proteus软件支持的单片机仿真调试程序的格式有很多种,如ELF/DWARF、COFF、UBROF格式等,HEX格式的文件可以加载运行,但不能单步执行。请以上节中的仿真练习为例,初步学习Proteus中AVR单片机的C程序调试与跟踪,并在后面的编程学习过程中,能主动地通过C程序调试与跟踪来发现和解决程序中的问题。

单片机程序在编译时,程序中的语法错误通常可以由编译器检查并给出错误信息,但程序中的逻辑错误则需要用户自己来控制和排除。当程序编译通过并在单片机上加载运行时,有时程序运行的结果和用户预想的并不一样,而单纯的阅读和检查C程序源代码并不容易发现错误在那里,此时,就需要对C源程序进行调试和跟踪。通过程序断点或单步执行等方法,检查程序中关键点的运行结果,这样可以很容易发现错误之处。

要想在Proteus中对单片机的C程序进行调试与跟踪,单片机加载的程序必须要有可供调试的信息。Proteus软件支持的单片机仿真调试程序的格式有很多种,如ELF/DWARF、COFF、UBROF格式等,HEX格式的文件可以加载运行,但不能单步执行。CVAVR编译器支持COFF文件格式,其编译输出的“.cof”扩展名文件被仿真电路的单片机加载后,可以进行C源程序调试与跟踪。在ISIS仿真电路中调试程序时,可以做C程序调试所需要的三个主要工作:设置断点,单步执行,观察变量与寄存器值。

ISIS用户界面上4个运行控制按钮分别是“Play”“Step”“Pause”和“Stop”。当单片机加载了“.cof”文件后,可以单击“Play”按钮全速运行。此时若要调试程序,可以按下“Pause”按钮,全速运行的程序将停止在某一行代码上,同时会弹出“AVR Source Code”和“AVR Variables”等几个窗口。如果要从头开始单步调试程序,可以在初始时按“Step”按钮执行程序。若想要的窗口没有弹出,可以通过主菜单“Debug”→“AVR”→“...”命令选择并显示需要的窗口,或者在电路图上右键单击单片机芯片,在弹出的菜单下面“AVR...”中也可进行选择。这些窗口中显示的信息对程序调试非常重要,AVR单片机可供查看的窗口一共有7个,它们分别如下。

1.“AVR Source Code”窗口

这是最重要的一个窗口,带有编译地址的C源程序在这个窗口中显示。在任意一行可执行的代码上双击,可设置此行代码为程序执行断点。断点设置后,断点指令行的最左面会有一个棕色圆点指示。全速执行的程序遇到断点后,将停止在断点指令行上。此时,可以按代码窗口上面的单步执行按钮,并配合查看相应的寄存器或变量值,以检查程序执行结果是否正确。再次双击断点指令行,可以取消断点。

2.“AVR Variables”窗口

这个窗口中显示的是程序中定义的变量,变量的名称、地址、值等属性都有显示,右键单击某一变量,还可更改显示属性。单步执行时,程序中某一变量值被更改,立刻在此窗口中就会有所体现,这对程序调试是非常重要的。在程序调试阶段,最好用“volatile”关键字强制变量存储在RAM中,否则变量值有时不能正常显示。

3.“AVR CPU Registers”窗口

程序指针、CPU状态寄存器、32个通用工作寄存器以及堆栈指针都在这个窗口中显示,随着程序的执行,这些寄存器值都会跟着进行相应的变化,这不仅可以帮助调试程序,还有益于初学者理解AVR单片机的结构和原理。

4.“AVR Data Memory”窗口

AVR单片机的内存数据信息在这个窗口中显示。ATmega8A单片机前96个内存地址分配给了32个通用工作寄存器和64个I/O寄存器,所以窗口中显示的1 024个字节的内存地址是从0x0060开始,到0x45F结束。(www.chuimin.cn)

5.“AVR EEPROM Memory”窗口

AVR单片机的EEPROM中存储的数据在这个窗口中显示。

6.“AVR Program Memory”窗口

Flash程序存储器中,经编译后生成的机器指令,在这个窗口中以十六进制数据显示。

7.“AVR I/O Registers”窗口

AVR单片机的64个I/O寄存器的数据在这个窗口中显示。

此外,主菜单“Debug”下面还有一个“Watch Window”,选中后可以用来集中显示某些特定的寄存器和变量的值,在调试程序时也很有帮助。有时,float类型变量在“AVR Variables”窗口中显示出现问题时,可在这个窗口中进行特定设置而正常显示。向窗口中添加要观察的寄存器时,应右键单击“Watch Window”窗口,在弹出的菜单中选择“Add Items(By Name...)”,然后双击要显示的寄存器名称即可。如果向窗口中添加要观察的变量,则应右键单击窗口,在弹出的菜单中选择“Add Items(By Address...)”,然后在弹出的窗口中设置正确的变量参数。若变量在内存中,“Memory”项应选“AVR SRAM...”或“AVR Data Memory...”,“Name”项为程序中定义的变量名,“Address”值可根据“AVR Variables”窗口中给出的对应变量地址填入。数据类型要根据变量的定义选择,如果定义的是float类型,应选“IEEE Float(4 bytes)”。变量的显示格式,可根据需要选择。

程序调试是编程工作的一个重要方面,可以用来快速定位程序中存在的问题,并具有针对性地分析代码,实现快速解决问题的目的。对于初学者,调试中可以很清晰地看到程序的执行过程以及每一步产生的变化,这样直观的体验不仅比读代码更有益于学习,而且还有益于初学者对AVR单片机的结构和原理的理解。

请以上节中的仿真练习为例,初步学习Proteus中AVR单片机的C程序调试与跟踪,并在后面的编程学习过程中,能主动地通过C程序调试与跟踪来发现和解决程序中的问题。