Keil的调试命令、在线汇编与断点设置等调试方法介绍

发布者:tanjunhui最新更新时间:2018-12-12 来源: eefocus关键字:Keil  调试命令  在线汇编  断点设置 手机看文章 扫描二维码
随时随地手机看文章

三、断点设置

程序调试时,一些程序行必须满足一定的条件才能被执行到(如程序中某变量达到一定的值、按键被按下、串口接收到数据、有中断产生等),这些条件往往是异步发生或难以预先设定的,这类问题使用单步执行的方法是很难调试的,这时就要使用到程序调试中的另一种非常重要的方法——断点设置。断点设置的方法有多种,常用的是在某一程序行设置断点,设置好断点后可以全速运行程序,一旦执行到该程序行即停止,可在此观察有关变量值,以确定问题所在。在程序行设置/移除断点的方法是将光标定位于需要设置断点的程序行,使用菜单Debug->Insert/Remove BreakPoint 设置或移除断点(也可以用鼠标在该行双击实现同样的功能);Debug->Enable/Disable Breakpoint 是开启或暂停光标所在行的断点功能;

Debug->Disable All Breakpoint 暂停所有断点;Debug->Kill All BreakPoint 清除所有的断点设置。这些功能也可以用工具条上的快捷按钮进行设置。
除了在某程序行设置断点这一基本方法以外,Keil 软件还提供了多种设置断点的方法,
按Debug->Breakpoints… 即出现一个对话框,该对话框用于对断点进行详细的设置,如图4所示。

图4 中Expression 后的编缉框内用于输入表达式,该表达式用于确定程序停止运行的条件,这里表达式的定义功能非常强大,涉及到Keil 内置的一套调试语法,这里不作详细说明,仅举若干实例,希望读者可以举一反三。

1) 在Experssion 中键入a==0xf7,再点击Define 即定义了一个断点, 注意,a 后有两个等号,意即相等。该表达式的含义是:如果a 的值到达0xf7 则停止程序运行。除

图3 在线汇编窗口

使用相等符号之外,还可以使用>,>=,<,<=,!=(不等于),&(两值按位与),&&(两值相与)等运算符号。

2) 在Experssion 后中键入Delay 再点击Define,其含义是如果执行标号为Delay 的行则中断。


3) 在Experssion 后中键入Delay,按Count后的微调按钮,将值调到3,其意义是当第三次执行到Delay 时才停止程序运行。

4) 在Experssion 后键入Delay , 在Command 后键入printf(“SubRoutine‘Delay’ has been Calledn”)主程序每次调用Delay 程序时并不停止运行,但会在输出窗口Command 页输出一行字符,即SubRoutine ‘Delay’ has beenCalled。其中“n”的用途是回车换行,使窗口输出的字符整齐。

5) 设置断点前先在输出窗口的Command页中键入DEFINE int I,然后在断点设置时同4),但是Command 后键入printf(“SubRoutine ‘Delay’ has been Called %dtimesn”,++I),则主程序每次调用Delay 时将会在Command 窗口输出该字符及被调用的次数,如SubRoutine ‘Delay’ has been Called 10 times。

对于使用C 源程序语言的调试,表达式中可以直接使用变量名,但必须要注意,设置
时只能使用全局变量名和调试箭头所指模块中的局部变量名。

四、实例调试

为进行程序的调试,我们首先给源程序制造一个错误,将延时子程序的第三行“DJNZ
R6,$”后的$改为D1,然后重新编译,由于程序中并无语法错误,所以编译时不会有任何出
错提示,但由于转移目的地出错,所以子程序将陷入无限循环中。

进入调试状态后,按F10 以过程单步的形式执行程序,当执行到LCALL DELAY 行时,程序不能继续往下执行,同时发现调试工具条上的Halt 按钮变成了红色,说明程序在此不断地执行着,而我们预期这一行程序执行完后将停止,这个结果与预期不同,可以看出所调用的子程序出了差错。为查明出错原因,按Halt 按钮使程序停止执行,然后按RST 按钮使程序复位,再次按下F10 单步执行,但在执行到LCALL DELAY 行时,改按F11 键跟踪到子程序内部(如果按下F11 键没有反应,请在源程序窗口中用鼠标点一下),单步执行程序,可以发现在执行到“DJNZ R6,D1”行时,程序不断地从这一行转移到上一行,同时观察左侧的寄存器的值,会发现R6 的值始终在FFH 和FEH 之间变化,不会减小,而我们的预期是R6 的值不断减小,减到0 后往下执行,因此这个结果与预期不符,通过这样的观察,不难发现问题是因为标号写错而产生的,发现问题即可以修改,为了验证即将进行的修改是否正确,可以先使用在线汇编功能测试一下。把光标定位于程序行“DJNZ R6,D1”,打开\在线汇编的对话框,将程序改为“DJNZ R7,0EH”,即转回本条指令所在行继续执行,其中0EH 是本条指令在程序存储器中的位置,这个值可以通过在线汇编窗口看到,如图3 所示。然后关闭窗口,再进行调试,发现程序能够正确地执行了,这说明修改是正确的。注意,这时候的源程序并没有修改,此时应该退出调试程序,将源程序更改过来,并重新编译连接,以获得正确的目标代码。


 图4 断点设置对话框


关键字:Keil  调试命令  在线汇编  断点设置 引用地址:Keil的调试命令、在线汇编与断点设置等调试方法介绍

上一篇:Keil MDK 调试不能设置断点问题的解决
下一篇:keil利用Breakpoints追踪内存值异常修改分析说明

推荐阅读最新更新时间:2024-03-16 16:19

STM32 KEIL软件设置程序烧写起始地址选择
STM32系列的mcu,这儿以cortex-M4为例,我们在线调试时,一般会设置程序烧写起始地址和大小。这个大小一般是0x08000000,也就是内部flash的映射地址。不过有些产品是从0x08020000开始的,这是为什么呢?是因为在0x08000000-0x08020000这段空间放的是引导程序,也就是引导程序是从0x08000000开始存放,一般而言,引导程序最终也是要跳转到主app执行的,对于我们这儿而言,就是引导程序会跳转到0x08020000继续执行,而主工程代码是从0x08020000开始存放的,所以就这样串联起来了。 这儿可以看到我们设置的程序烧写的地址和大小,这个的设置是要和use memory layou
[单片机]
STM32 <font color='red'>KEIL</font>软件<font color='red'>设置</font>程序烧写起始地址选择
keil中勾选microlib使用printf
在keil (我用的是realview mdk3.11)建立ARM的工程时 其中有一项是选 use MicroLIB 由于对KEIL不是很熟悉,于是就查了查,得到了以下信息: microlib 是缺省 C 库的备选库。 它旨在与需要装入到极少量内存中的深层嵌入式应用程序配合使用。 这些应用程序不在操作系统中运行。 microlib 进行了高度优化以使代码变得很小。 它的功能比缺省 C 库少,并且根本不具备某些 ISO C 特性。 某些库函数的运行速度也比较慢,例如,memcpy()。 与缺省 C 库之间的差异 microlib 与缺省 C 库之间的主要差异是: microlib 不符合 ISO C 库标准。 不支持某些 IS
[单片机]
<font color='red'>keil</font>中勾选microlib使用printf
关于keil软件编译后的data xdata 和code的说明
在对51 单片机 的程序进行编译的时候,在编译的最后会提示Program Size: data= xx xdata=xx code=xx那么,这些存储时根据什么计算的呢?并且根据这个如何判断单片机内部的存储空间是否够用呢? 那么首先data xdata code分别代表什么意思呢? data表示使用的内部RAM,xdata表示使用的是外部RAM,code表示的是程序的大小。那么这些大小和程序以及我们的单片机型号有设么关系呢? 首先,我们建立一个简单的工程,然后进行编译,我们看结果如下。 这个占用的data为9.0。然后我们定义一个数组,之后再编译。 可以看到,在定义了一个8字节的数组后,data的值由9增加到17,所以可以得知da
[单片机]
Keil(MDK-ARM)系列教程(五)_Configuration(Ⅰ)
Ⅰ、写在前面 本文带来的内容正如标题“Configuration”,只是标题包含的内容较多,我计划将其分为:Configuration(Ⅰ)和Configuration(Ⅱ)两篇文章来讲述。 我们常见的字体大小、颜色、关键字、快捷键等这些都是在“Configuration”中进行设置。本文讲述Configuration中的前面3项Editor、Colors & Fonts、User KeyWords。 本文讲述的Configuration配置和前面文章Options for Target目标选项在保存上有一个明显的区别:Configuration修改过后并保存的配置是保存在你Keil(电脑)软件上;而Options for
[单片机]
<font color='red'>Keil</font>(MDK-ARM)系列教程(五)_Configuration(Ⅰ)
Keil C51中变量和函数的绝对地址定位问题
1、变量绝对地址定位 1) 在定义变量时使用 _at_ 关键字加上地址就可。 unsigned char idata myvar _at_ 0x40; 把变量 myvar 定义在 idata 的 0x40 处, 在 M51 文件中可以找到这麽一行 IDATA 0040H 0001H ABSOLUTE ;表示有变量在 idata 的 0x0040 处绝对地址定位. 2) 使用 KeilC 编译器定义绝对地址的变量, 方法待查. 2、函数绝对地址定位 1) 在程序中编写一函数 myTest void myTest(void) {   // Add your code here } 2)
[单片机]
MSP432(Keil5)——8.oled驱动
今天给大家带来msp432的oled驱动,本次实验代码移植的中景园电子的优秀代码。 使用的oled是7线spi方式的,熟悉oled的也可以自行修改成iic。 oled.c // //本程序只供学习使用,未经作者许可,不得用于其它任何用途 //中景园电子 //店铺地址:http://shop73023976.taobao.com/?spm=2013.1.0.0.M4PqC2 // // 文 件 名 : main.c // 版 本 号 : v2.0 // 作 者 : HuangKai // 生成日期 : 2014-0101 // 最近修改 : // 功能描述 : OLED 4接口演示例程(51系列) //
[单片机]
MSP432(<font color='red'>Keil</font>5)——8.oled驱动
深入剖析keil c51 --- 从汇编到c51
C插入汇编语句 #pragma asm ljmp 0 #pragma endasm 如果就这样直接编译的话,会出现以下错误: error C272: 'asm/endasm' requires src-control to be active 解决方法:在 Files Toolbar 中选中当前C51文件,点右键查看文件选项,将 Generate Assembler SRC File 与 Assemble SRC File 的勾选由灰色变为黑色,即使这两项有效! 第一节 main()函数和启动代码 汇编是从org 0000h开始启动,那么keil c51是如何启动main()函数的?keil c
[单片机]
keil出現 Error: Flash Download failed: - "Cortex-M3" 問題解決
有時候切換了編譯方式如從ARMCC轉變為GCC編譯器,編譯下載時會出現 Error: Flash Download failed: - Cortex-M3 這個錯誤。 目前,自己測試解決的方式是:刪除相同目錄下的 “DebugConfig” 、“Listings 、“Objects”、“JLinkLog.txt”、“JLinkSettings.ini” 然後重新設置調試方式,重新編譯,再下載。
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved