(玩电子) 电子技术学习与研讨
当时方位:单片机教程网 >> 根底教程 >> 阅览文章

Keil教程(2)

作者:佚名   来历:本站原创   点击数:x  更新时刻:2007年09月12日   【字体:

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”。灵敏运用这几种办法,可以大大提 高查错的功率。

二、在线汇编

?
在进入 Keil 的调试环境今后,假如发现程序有错,可以直接对源程序进行修正,可是 要使修正后的代码起作用,有必要先退出调试环境,从头进行编译、衔接后再次进入调试,如 果仅仅需求对某些程序行进行测验,或仅需对源程序进行暂时的修正,这样的进程不免有些 费事,为此 Keil 软件供给了在线汇编的才干,将光标定坐落需求修正的程序行上,用菜单 Debug->Inline  Assambly… 即可呈现如

图 3 的对话框,在 Enter  New 后边的 编缉框内直接输入需更改的程序语

句,输入完后键入回车将主动指向下 一条句子,可以持续修正,假如不再 需求修正,可以点击右上角的封闭按钮封闭窗口。



三、断点设置

图 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 则中止程序运转。除

casino

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

值相与)等运算符号。

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 所示。 然后封闭窗口,再进行调试,发现程序可以正确地履行了,这阐明修正是正确的。留意,这 时分的源程序并没有修正,此刻应该退出调试程序,将源程序更改过来,并从头编译衔接,

以取得正确的方针代码。

宣布谈论】【告知老友】【保藏此文】【封闭窗口
上一篇:Keil教程(3)

文章谈论