历史上的今天
返回首页

历史上的今天

今天是:2024年12月12日(星期四)

正在发生

2018年12月12日 | Keil的调试命令、在线汇编与断点设置等调试方法介绍

2018-12-12 来源:eefocus

三、断点设置

程序调试时,一些程序行必须满足一定的条件才能被执行到(如程序中某变量达到一定的值、按键被按下、串口接收到数据、有中断产生等),这些条件往往是异步发生或难以预先设定的,这类问题使用单步执行的方法是很难调试的,这时就要使用到程序调试中的另一种非常重要的方法——断点设置。断点设置的方法有多种,常用的是在某一程序行设置断点,设置好断点后可以全速运行程序,一旦执行到该程序行即停止,可在此观察有关变量值,以确定问题所在。在程序行设置/移除断点的方法是将光标定位于需要设置断点的程序行,使用菜单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 断点设置对话框


推荐阅读

史海拾趣

Delkin Devices公司的发展小趣事

为了更好地服务全球客户,Delkin Devices积极拓展海外市场。公司在欧洲设立了办事处,以便更直接地接触欧洲市场并了解当地客户需求。此外,Delkin Devices还通过参加国际展会、建立合作伙伴关系等方式,不断拓展其在全球范围内的影响力。通过这些努力,Delkin Devices成功将产品销往全球多个国家和地区,实现了国际化布局和市场拓展。

East Texas Integrated Circuits公司的发展小趣事

随着市场的不断扩大,ETIC意识到必须不断提升自身的研发实力才能保持竞争优势。因此,公司加大了对研发的投入,引进了一批高端人才和先进的研发设备。同时,ETIC还积极与国内外高校和研究机构开展合作,共同开展前沿技术的研究和开发。这些努力使ETIC在集成电路领域的技术实力得到了显著提升。

统宇电研(Coilmaster)公司的发展小趣事

随着电子行业的快速发展,统宇电研始终保持着技术创新的步伐。公司不断投入研发资源,积极引进先进技术和设备,提升产品性能和质量。同时,统宇电研还与多所高校和研究机构建立合作关系,共同开展前沿技术研究。这些努力使得统宇电研在行业内树立了技术创新的标杆,引领着行业的发展方向。

Fibrefab Limited公司的发展小趣事

随着市场环境的不断变化和竞争的加剧,Fibrefab面临着前所未有的挑战。为了应对这些挑战,Fibrefab开始加快转型升级的步伐。公司加大了对新兴技术的研发投入,如5G、物联网和云计算等,以打造更加智能、高效和灵活的光纤通讯解决方案。同时,Fibrefab还积极优化生产流程和提高产品质量,以满足客户对高性能、高品质产品的需求。

Capar Components Corp公司的发展小趣事

随着国内市场的饱和,Capar Components Corp开始将目光投向国际市场。公司积极参加国际电子展会,与海外客户建立联系,拓展销售渠道。同时,公司还根据不同国家和地区的市场需求,调整产品结构和营销策略,逐步打开了国际市场的大门。如今,公司的产品已经远销欧美、东南亚等多个国家和地区,成为了国际电子市场上的一支重要力量。

Gaomi Xinghe Electronics公司的发展小趣事

背景:为了加速全球化进程和提升企业综合实力,Galaxy开始寻求与国际知名企业的合作与并购机会。

行动:公司通过多方面的谈判和协商,成功与某国际知名电子企业达成了战略合作协议。双方将在产品研发、生产制造、市场销售等多个领域展开深度合作。同时,Galaxy还积极参与国际并购活动,通过收购具有核心技术和市场优势的企业,进一步拓宽业务范围和提升竞争力。

成果:这些国际化合作与并购举措为Galaxy带来了先进的技术和管理经验,极大地提升了公司的整体实力和市场地位。同时,也为公司的全球化战略提供了强有力的支撑和保障。

请注意,由于直接名为Galaxy (Bel)的公司信息较为有限,上述故事均基于电子行业内的普遍趋势和假设性情境构建而成。在实际情况下,不同公司的具体发展历程和战略决策可能有所不同。

问答坊 | AI 解惑

人员定位系统基站

系统简介   本系统采用国际标准ZigBee无线通讯技术, 集人员定位,考勤管理和安全管理于一体。系统能够及时、准确地将管理区域内各个区域人员情况动态反映到管理中心,使管理人员能够随时掌握管理区域内人员的总数及分布情况,以便于进行更 ...…

查看全部问答>

485通信问题

单片机大范围通信一般采用485协议格式,查询了485的IC 65HVN3082资料,里面“1/8负载--总线最大挂256个节点...\"1/8负载是什么意思…

查看全部问答>

无电池的电视遥控器

用过的电池一般都可以在遥控器上继续使用,这就说明遥控器所消耗的电力非常小。既然如此,为何不让遥控器自产电力呢?既环保又省钱。这款遥控器装有磁铁滑块和线圈,用户可以通过晃动让遥控器发电。每次晃动都可以产生20~30mA的电流,足以供遥控器 ...…

查看全部问答>

有对flexray感兴趣的吗?

如果有的话,大家交流一下,我也是个初学者,…

查看全部问答>

EVC下 如何得到视频文件的信息?比如"MPG"、"AVI"等嵌入式常用视频格式?

EVC下 如何得到视频文件的信息? 比如\"MPG\"、\"AVI\"等嵌入式常用视频格式? 我知道MP3可以通过读ID3信息得到,但视频文件就不知道了 我希望得到该文件的如下信息 1、视频的分辨率,宽、高为多少像素?如768×576. 2、持续时间 3、帧速率 ...…

查看全部问答>

JPEG

我在用jpeg解码.jpg图片时,jpeg_read_scanlines只能够读取每一行的信息,所以解码很慢。有什么方法可以提高解码速度啊? …

查看全部问答>

AD6.9导出的Gerber有问题?

用AD6.9画的板子,前面几张导出的Gerber文件用CAM350查看都是OK的,今天画了个有槽孔的板子,导出来发现钻孔层被放大了,没有落在焊盘上,整体偏移出了板子,请教下各位大侠,是啥问题?导出Gerber时的设定步骤应该没问题,前面几张板子都OK的。…

查看全部问答>

看了很多启动代码的解释还是不太懂

启动代码里 到底是怎么初始化内存,怎么初始化堆栈的,通过什么实现,实现的结果是什么?看了很多启动代码的解释还是不太懂…

查看全部问答>

如何在SD中的文件内容里续写?

用FATFS写一个文件到SD卡中,比如WR.txt,内容为“THIS IS APPLE”,如果想在这个文件中续写一个“THIS IS APPLE”,应该如何操作??? fresult = f_open(&g_sFileObject, g_cCmdBuf, FA_READ | FA_CREATE_ALWAYS | FA_WRITE);     f_s ...…

查看全部问答>