单片机程序调试的具体方法是什么
扫描二维码
随时随地手机看文章
当程序的运行结果与预期不同时,需要利用μVision4的调试功能分析和查找程序中隐藏的逻辑错误。下面介绍程序调试的具体方法。
1.进入调试环境的方法
通过单击μVision4工具栏上的快捷菜单“Start/Stop Debug Session”(见图7-15a)或“Debug”→“Start/Stop Debug Session”子菜单(见图7-15b)进入调试状态,其界面如图7-16所示。在调试状态下,工具栏中会出现用于调试的快捷图标栏(见图7-17a、b),并且“Debug”菜单下会出现更多用于程序调试的子菜单(见图7-17c)。
图7-15与调试相关的菜单
a)快捷菜单“Start/Stop Debug Session”b)“Debug”菜单
图7-16调试环境界面窗口
2.程序调试方法
程序由若干行指令构成,当其无法完成预期任务时,程序员需要确定程序中哪一行指令出现了问题,此时需要调试程序,即跟踪和分析程序执行的结果。在调试过程中,可以执行一行、几行或一段指令后停下来查看寄存器、变量或存储单元的值。
(1)控制指令执行
调试用快捷图标栏(见图7-17a)的图标用于程序调试,鼠标在图标上停留片刻后将弹出图标功能的英文解释,如图7-18所示。该图中各图标的作用分别如下:“Reset”—复位单片机;“Run”—程序全速运行;“Stop”—停止程序运行;“Step”—单片调试程序,每执行一行指令后暂停下来,遇到子程序调用指令时,进入子程序,在子程序中也是每执行一条指令后暂停下来;“Step Over”—单片调试程序与“Step”类似,但调试时不进入子程序;“Step Out”—跳出子程序;“Run to Cursor Line”—鼠标点中源程序窗口的某行时,程序全速运行到此行处后暂停;“Show Next Statement”—在源程序文件窗口和反汇编程序窗口中,始终有一个黄色的箭头出现在接下来要执行的指令的行首。另外,“Debug”菜单(见图7-17c)下也有与图7-18所示快捷图标功能和名称完全相同的子菜单。
图7-17调试用菜单和快捷图标
a)调试用快捷图标栏b)断点控制快捷图标c)“Debug”菜单
图7-18程序调试用快捷图标的作用
(2)断点的使用
为了更方便地控制调试中指令暂停的位置,可以在程序的某行或某几行前加入断点。加入断点后,若单击“Run”快捷菜单,程序会在有断点的行暂停下来。
加入断点的快捷图标如图7-17b所示,在“Debug”菜单(见图7-17c)下也有相应的子菜单可实现相同的功能。当鼠标停留在快捷菜单上时,将弹出信息框提示快捷菜单的功能,如图7-19所示。下面介绍与断点相关的快捷图标的作用。
图7-19断点相关快捷图标
a)“Insert/Remove Breakpoint”(添加/删除断点)b)“Enable/Disable Breakpoint”(允许/禁止断点)
c)“Disable All Breakpoints”(禁止所有断点)d)“Kill All Breakpoints”(去掉所有断点)
“Insert/Remove Breakpoint”(添加/删除断点):鼠标单击源程序窗口的某行后,再鼠标单击该快捷菜单,断点标记即出现在该行代码的行首,如图7-20a中的第28~30行之前的红色矩形框就是断点标志。鼠标左键单击有断点的代码行,然后再单击该快捷菜单,即可去掉这一行的断点。另外,双击源程序窗口中的代码行也可以实现添加和删除断点的功能。
图7-20源程序窗口中的断点相关标志
a)断点标志b)关闭指定断点的断点功能
“Enable/Disable Breakpoint”(允许/禁止断点):若希望程序执行到断点处不暂停下来,还可以在不去掉断点的情况下关闭断点功能。具体方法是:首先在源程序窗口内单击需要关闭断点功能的代码所在行(必须保证该行之前已经加上了断点),然后单击该快捷图标。之后,红色矩形框变成白色矩形框,表示断点功能已关闭。如图7-20b所示,第28行和30行未关闭断点功能,程序执行到此处会暂停下来;而第29行被关闭了断点功能,程序执行到此处不会暂停下来。
“Disable All Breakpoints”(禁止所有断点):直接单击此快捷菜单后,所有断点的断点功能被关闭,所有代表断点的红色矩形框将变成白色矩形框。
“Kill All Breakpoints”(去掉所有断点):直接单击此快捷菜单后,同时去掉程序中的所有断点,所有代表断点的红色矩形框将消失。
3.调试中常用观察窗口的使用方法
进入调试环境后,可以通过鼠标单击“View”菜单(见图7-21)下的子菜单打开各种调试用的观察窗口(Window),也可以通过鼠标左键单击图7-17a所示的快捷图标打开这些窗口。
(1)“Register Window”寄存器窗口
鼠标左键单击“View”→“Register Windows”菜单可以打开如图7-22所示的寄存器观
察窗口,该窗口显示了单片机内部主要寄存器的值,包括工作寄存器R0~R7、累加器A、寄存器B、堆栈指针SP、数据指针寄存器DPTR、程序计数器PC和程序状态字寄存器PSW的值。另外,该窗口中的“sec”显示的是程序当前已经运行的时间长度,单位是秒。利用“sec”,可查看指令和程序的运行时间。
(2)“Memory Windows”存储器窗口
单击“View”→“Memory Windows”菜单下的子菜单“Memory1”“Memory2”“Memory3”和“Memory4”最多可以打开4个不同的存储器观察窗口(见图7-23),这些窗口通常显示在μVision4软件的右下角。另外,也可以通过单击调试用的快捷图标打开这些窗口。
图7-21“View”菜单
图7-22“Register Window”寄存器窗口
图7-23“Memory Windows”存储器观察窗口
a)片内数据存储器内容显示b)程序存储器内容显示
4个Memory窗口没有差别,均可显示单片机片内数据存储器、片外数据存储器、特殊功能寄存器或程序存储器中的内容。“Memory Windows”显示数据的来源,由“Address”文本框中的输入决定。在Memory窗口中查看存储器和特殊功能寄存器数值的方法如下:
1)若显示片内数据存储器的数据,则应在“Address”文本框中输入以“I:”(英文字母大小写均可)开头的数字。该数字是片内数据存储器的地址值,其范围是0~FFH。通过该地址可以定位显示一片存储器区域的内容。例如,在图7-23a的“Address”框中输入的是“i:12H”,
则窗口中显示的是片内RAM中从地址12H开始的一片存储单元中的数据;窗口左侧的“I:0x12”表示片内RAM的地址12H(“0x”是十六进制数的前缀,C51程序中使用这种方法表示十六进制数);窗口中的数均为十六进制数,每个数对应于一个字节单元,其中左上角的十六进制数“78”是片内RAM中地址为12H的存储单元中的数据。
2)若显示片外数据存储器的数据,则应在“Address”文本框中输入以“X:”(英文字母大小写均可)开头的数字,该数是片外数据存储器的地址,其范围是0~FFFFH。
3)若显示特殊功能寄存器的数据,则应在“Address”文本框中输入以“D:”(英文字母大小写均可)开头的数字。当该数字在0~7FH范围内时,为片内数据存储器的地址;当该数字在80H~0FFH范围内时,为特殊功能寄存器的地址。
4)若显示程序存储器的数据,则应在“Address”文本框中输入以“C:”(英文字母大小写均可)开头的数字。该数字是程序存储器的地址,其范围是0~FFFFH。
(3)变量查看
通过鼠标单击“View”→“Watch Windows”菜单下的子菜单或图7-17a中的“Watch Windows”快捷图标可以打开用于查看变量值的“Locals”窗口和“Watch”窗
口,如图7-24所示。
“Locals”窗口用于显示子程序中局部变量的值。例如,在图7-24a中,左图是调试状态下的代码编辑窗口,其中箭头指向了第14行,表示子程序Delay_i_ms(unsigned int i)正在执行,此时可以在图7-24a右图所示的“Locals”窗口中看到该子程序中局部变量i和j的值。
图7-24变量观察窗口
a)“Locals”窗口b)“Watch”窗口
“Watch”窗口最多可以有两个,即“Watch1”和“Watch2”,如图7-24b所示。调试时可以将需要观察的变量加入到“Watch”窗口中。在“Watch”窗口中,Name一栏的最下面一行显示“”,双击这一行或按功能键〈F2〉时,该位置变为可编辑状态,此时可以在其中输入变量的名称,之后Value栏中会显示该变量的值。例如,在图7-24b中,左图显示的是代码编辑窗口,其中有变量LED,在右侧的“Watch”窗口中添加变量LED后即可看到LED的值为0。
(4)“Serial Windows”串行窗口
串行窗口可以通过单击“View”→“Serial Windows”菜单下的子菜单或图7-17a中的“Serial Windows”快捷图标打开。串行窗口最多有两个,在调试过程中,用于显示printf函数的输出结果及接收scanf函数的输入。例如,图7-25a中的3条指令执行后,图7-25b所
示的串行窗口“UART1”中将显示输入和输出结果。需要注意的是,该窗口模拟的是串口,因此,在使用printf和scanf函数之前必须进行相应的串口初始化操作。
图7-25“Serial Windows”窗口
a)printf与scanf指令b)串行窗口输入输出
(5)逻辑分析仪
如图7-26所示的逻辑分析仪可以显示变量等的时域波形,单击“View”→“Analysis Windows”菜单下的“Logic Analyzer”子菜单或图7-17a中的“Logic Analyzer”快捷图标可以打开其界面。
图7-26“Logic Analyzer”界面
逻辑分析仪的使用方法是:单击“Logic Analyzer”界面左上角的“Setup…”按钮,打开“Setup Logic Analyzer”界面(见图7-27a),该界面右上角的图标“
”和“
”分别用于添加(New)和删除(Delete)信号(变量)。单击窗口中的“
”图标后,文本框“Current Logic Analyzer Signals”中将添加一个可编辑行,可以在其中输入变量名。例如,在图7-27b中,添加的变量名是LED,该变量为sbit型变量,程序调试运行时,可以在逻辑分析仪窗口中看到该变量随时间变化的波形,如图7-27c所示。
图7-27“Setup Logic Analyzer”对话框的使用
a)“Setup Logic Analyzer”逻辑分析仪设置对话框b)添加被观察变量c)被观察变量的波形