<meta name="keywords" content="必胜时时彩开户,keywords" /> Keil教程(2) 联系我们

Keil教程(2)

Keil 的调试敕令、在线汇编与断点设置

上一讲中我们学习了若何培植工程、汇编、毗连工程,并取得目的代码,但是做到这一 步仅仅代表你的源法式模范模范没有语法弱点,至于源法式模范模范中存在着的其它弱点,必须经由历程调试才干 发现并处置赏罚赏罚,现实上,除极质朴的法式模范模范以外,绝年夜部门的法式模范模范都要经由历程重复调试才干取得 准确的效果,是以,调试是软件开发中主要的一个环节,这一讲将简介经常应用的调试敕令、利 用在线汇编、种种设置断点阻拦法式模范模范调试的措施,并经由历程实例简介这些措施的应用。

一、经常应用调试敕令
在对工程告成地阻拦汇编、毗连以后,按 Ctrl+F5 或许应用菜单 Debug->Start/Stop Debug Session 便可进入调试状态,Keil 内建了一个仿真 CPU 用来模拟推行法式模范模范,该仿真 CPU 功 能强年夜,可以在没有硬件和仿真机的情形下阻拦法式模范模范的调试,下面将要学的就是该模拟调试 功效。不外在学习之前必须明确,模拟现实只是模拟,与真实的硬件推行法式模范模范一定照样有区 其他,其中最显着的就是时序,软件模拟是弗成能和真实的硬件具有类似的时序的,详细的 体现就是法式模范模范推行的速率和各人应用的盘算机有关,盘算机性能越好,运转速率越快。

进入调试状态后,界面与主笔状态相比有显着的变换,Debug 菜单项中原来不克不及用的命 令现在已可以应用了,工具栏会多出一个用于运转和调试的工具条,如图 1 所示,Debug 菜 单上的年夜部门敕令可以在此找到对应的快捷按钮,从左到右按序是复位、运转、暂停、单步、 历程单步、推行完以后子法式模范模范、运转到今先行、下一状态、掀开跟踪、不雅不雅察跟踪、反汇编窗 口、不雅不雅察窗口、代码作用规模剖析、1#串行窗口、内存窗口、性能剖析、工具按钮等敕令。

? 图 1  调试工具条
学习法式模范模范调试,必须明 确两个主要的看法,即单步推行与全速运转。全速推行 是指一行法式模范模范推行完以后紧

接着推行下一行法式模范模范,中央一直止,这样法式模范模范推行的速率很快,并可以看到该段法式模范模范推行的全体效果,即事实效果准确 还是弱点,但假定法主意度模范模范有错,则难以确认弱点涌现在哪些程 序行。单步推行是每次推行一行法式模范模范,推行完该行法式模范模范以后 即阻拦,期待敕令推行下一行法式模范模范,此时可以不雅不雅察该行法式模范模范 推行完以后取得的效果,能否与我们写该行法式模范模范所想要取得 的效果类似,借此可以找到法式模范模范中效果所在。法式模范模范调试中, 这两种运转要领都要用到。

应用菜单 STEP 或照顾的敕令按钮或应用快捷键 F11 可 以单步推行法式模范模范,应用菜单 STEP OVER 或功效键 F10 可以 以历程单步形式推行敕令,所谓历程单步,是指将汇编语言 中的子法式模范模范或高等语言中的函数作为一个语句来全速推行。


图 2  调试窗口



按下 F11 键,可以看到源法式模范模范窗口的左边泛起了一个黄色彩试箭头,指向源法式模范模范的第一行,如图 2 所示。每按一次 F11,即推行该箭头所指法式模范模范行,然后箭头指向下一行,当箭头 指向 LCALL   DELAY 行时,再次按下 F11,会发现,箭头指向了延时子法式模范模范 DELAY 的第 一行。赓续按 F11 键,便可徐徐推行延时子法式模范模范。

经由历程单步推行法式模范模范,可以找出一些效果的所在,但是仅依附单步推行来查错有时是艰辛 的,或虽能查掉落足误但效力很低,为此必须辅之以其它的措施,如本例中的延时法式模范模范是经由历程

将 D2: DJNZ    R6,D2 这一行法式模范模范推行六万一再再三来到达延时的目的,假定用按 F11 六万多

次的措施来推行完该法式模范模范行,显着不合适,为此,可以接纳以下一些措施,第一,用鼠标在 子法式模范模范的最后一行( ret)点一下,把光标定位于该行,然后用菜单 Debug->Run to Cursor line

(推行到光标所在行),便可全速推行完黄色箭头与光标之间的法式模范模范行。第二,在进入该子

法式模范模范后,应用菜单 Debug->Step Out of Current Function(单步推行到该函数外),应用该敕令 后,即全速推行完调试光标所在的子法式模范模范或子函数并指向主法式模范模范中的下一行法式模范模范(这里是 JMP   LOOP 行)。第三种措施,在泉源调试的,按 F10 而非 F11,法式模范模范也将单步推行,不合 的是,推行到 lcall            delay 行时,按下 F10 键,调试光标不进入子法式模范模范的外部,而是全速 推行完该子法式模范模范,然后直接指向下一行“JMP   LOOP”。无邪应用这几种措施,可以年夜年夜提 高查错的效力。

2、在线汇编

?
在进入 Keil 的调试情形以后,假定发现法式模范模范有错,可以直接对源法式模范模范阻拦修改,然则 要使修改后的代码起作用,必须先加入调试情形,重新阻拦编译、毗连后再次进入调试,如 果只是须要对某些法式模范模范行阻拦测试,或仅需对源法式模范模范阻拦暂时的修改,这样的历程难免难免有些 费事,为此 Keil 软件供应了在线汇编的才干,将光标定位于须要修改的法式模范模范行上,用菜单 Debug->Inline  Assambly… 便可泛起如

图 3 的对话框,在 Enter  New 前面的 主笔框内直接输入需更改的法式模范模范语

句,输入完后键入回车将自动指向下 一条语句,可以一连修改,假定不再 须要修改,可以点击右上角的关闭按钮关闭窗口。



3、断点设置

图 3  在线汇编窗口

法式模范模范调试时,一些法式模范模范行必须知足一定的条件才干被推行到(如法式模范模范中某变量到达一定

的值、按键被按下、串口吸收到数据、有中止发生等),这些条件经常是异步发生或难以预 先设定的,这类效果应用单步推行的措施是很难调试的,这时间间就要应用到法式模范模范调试中的此外一 种异常主要的措施——断点设置。断点设置的措施有多种,经常应用的是在某一法式模范模范行设置断点, 设置好断点后可以全速运转法式模范模范,一旦推行到该法式模范模范行即阻拦,可在此不雅不雅察有关变量值,以 一定效果所在。在法式模范模范行设置/移除断点的措施是将光标定位于须要设置断点的法式模范模范行,使 用菜单 Debug->Insert/Remove BreakPoint 设置或移除断点(也能够或许用鼠标在该行双击完成同 样的功效);Debug->Enable/D isable   Breakpoint  是开启或暂停光标所在行的断点功效; Debug->Disable All Breakpoint 暂停一切断点;Debug->Kill All BreakPoint 扫除一切的断点设 置。这些功效也能够或许用工具条上的快捷按钮阻拦设置。

除在某法式模范模范行设置断点这一基本措施以外,Keil 软件还供应了多种设置断点的措施,

按 Debug->Breakpoints… 即泛起一个对话框,该对话框用于对断点阻拦详细的设置,如图 4

所示。

图 4 中 Expression 后的主笔框内用于输入表达式,该表达式用于一定法式模范模范阻拦运转的条 件,这里表达式的界说功效异常强年夜,触及到 Keil 内置的一套调试语法,这里不作详细说 明,仅举若干实例,欲望读者可以闻一知十。

1) 在 Experssion 中键入 a==0xf7,再点击 Define 即界说了一个断点, 重视,a 后有两 个等号,意即相等。该表达式的寄义是:假定 a 的值到达 0xf7 则阻拦法式模范模范运转。除

应用相等符号以外,还可以应用>,>=,<,<=,!=(不即是),&(两值按位与),&&(两

值相与)等运算符号。

2) 在 Experssion 后中键入 Delay 再点击 Define,其寄义是假定推行标号为 Delay 的行 则中止。

?
3) 在 Experssion 后中键入 Delay,按 Count 后的微调按钮,将值调到 3,其意义是 当第三次推行到 Delay 时才阻拦法式模范模范运 行。

4) 在  Experssion   后键入  Delay ,在                     

Command   后键入 printf(“SubRoutine

‘Delay’has  been  Called\n”)主法式模范模范每次 挪用 Delay 法式模范模范时并一直止运转,但会 在输入窗口 Command  页输入一行字 符,即 SubRoutine   ‘Delay’ has   been Called。其中“\n”的用处是回车换行, 使窗口输入的字符整齐。

5) 设置断点前先在输入窗口的 Command

页中键入 DEFINE int I,然后在断点设


图 4  断点设置对话框

置时同 4),但是 Command 后键入 printf(“SubRoutine  ‘Delay’ has  been  Called  %d times\n”,++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 所示。 然后关闭窗口,再阻拦调试,发现法式模范模范能够准确地推行了,这诠释修改是准确的。重视,这 时间的源法式模范模范并没有修改,此时应当加入调试法式模范模范,将源法式模范模范更悛改来,着重新编译毗连,

以取得准确的目的代码。