当前位置:首页 > 单片机 > 单片机
[导读]当程序的运行结果与预期不同时,需要利用μVision4的调试功能分析和查找程序中隐藏的逻辑错误。下面介绍程序调试的具体方法。

当程序的运行结果与预期不同时,需要利用μ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)被观察变量的波形

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

该系列产品有助于嵌入式设计人员在更广泛的系统中轻松实现USB功能

关键字: 单片机 嵌入式设计 USB

单片机编程语言是程序员与微控制器进行交流的桥梁,它们构成了单片机系统的软件开发基石,决定着如何有效、高效地控制和管理单片机的各项资源。随着微控制器技术的不断发展,针对不同应用场景的需求,形成了丰富多样的编程语言体系。本文...

关键字: 单片机 微控制器

单片机,全称为“单片微型计算机”或“微控制器”(Microcontroller Unit,简称MCU),是一种高度集成化的电子器件,它是现代科技领域的关键组件,尤其在自动化控制、物联网、消费电子、汽车电子、工业控制等领域...

关键字: 单片机 MCU

STM32是由意法半导体公司(STMicroelectronics)推出的基于ARM Cortex-M内核的32位微控制器系列,以其高性能、低功耗、丰富的外设接口和强大的生态系统深受广大嵌入式开发者喜爱。本文将详细介绍S...

关键字: STM32 单片机

在当前的科技浪潮中,单片机作为嵌入式系统的重要组成部分,正以其强大的功能和广泛的应用领域受到越来越多行业的青睐。在众多单片机中,W79E2051以其卓越的性能和稳定的工作特性,成为市场上的明星产品。本文将深入探讨W79E...

关键字: 单片机 w79e2051单片机

单片机,又称为微控制器或微处理器,是现代电子设备中的核心部件之一。它集成了中央处理器、存储器、输入输出接口等电路,通过外部信号引脚与外部设备进行通信,实现对设备的控制和管理。本文将详细介绍单片机的外部信号引脚名称及其功能...

关键字: 单片机 微控制器 中央处理器

随着科技的飞速发展,单片机和嵌入式系统在现代电子设备中的应用越来越广泛。它们不仅提高了设备的智能化水平,还推动了各行各业的创新与发展。在单片机和嵌入式系统的开发中,编程语言的选择至关重要。本文将深入探讨单片机和嵌入式系统...

关键字: 单片机 嵌入式系统 电子设备

PLC(可编程逻辑控制器)和单片机是两种不同的控制设备,它们之间存在明显的区别:

关键字: 单片机 plc 控制器

Holtek隆重推出全新一代32-bit Arm® Cortex®-M0+ 5V CAN MCU - HT32F53231/HT32F53241/HT32F53242/HT32F53252。这一系列单片机带有来自Bosc...

关键字: MCU 工业自动化 单片机

Holtek精益求精,宣布推出全新5V宽电压Arm® Cortex®-M0+ 32-bit MCU系列HT32F50431/HT32F50441/HT32F50442/HT32F50452。此系列MCU经多方位升级能满...

关键字: 单片机 智能家居 工业控制
关闭