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

Keil教程(4)

Keil 的赞助工具和部门高等手艺

在前面的几讲中我们简介了工程的培植措施,经常应用的调试措施,除此以外,Keil 还供应 了一些赞助工具如焦点接口、性能剖析、变量泉源剖析、代码作用剖析等,赞助我们明确程 的性能、查找法式模范模范中的隐藏弱点,快速检查法式模范模范变量名信息等,这一讲中将对这些功工具作 一简介,另外还将简介 Keil 的部门高等调试手艺。

一、 赞助工具

这部门功效着实不是直接用来阻拦法式模范模范调试的,但可以赞助我们阻拦法式模范模范的调试、法式模范模范性 能的剖析,异常是一些很有用的工具。

1、焦点接口


为了能够较量直不雅不雅地明确单片机中准时器、中止、

并行端口、串行端口等经常应用外设的应用情形,Keil  提 供了一些焦点接口对话框,经由历程 Peripherals 菜单选择, 该菜单的下拉菜单内容与你培植项目时所选的  CPU 有关,假定是选择的 89C51 这一类“尺度”的 51 机, 那么将会有 Interrupt(中止)、I/O Ports(并行 I/O 口)、 Serial(串行口)、Timer(准时/计数器)这四个焦点设

图 1  焦点装备之并行端口


备菜单。掀开这些对话框,列出了焦点装备的以后应用情形,各标志位的情形等,可以在这 些对话框中直不雅不雅地不雅不雅察和更改各焦点装备的运转情形。

下面我们经由历程一个质朴例子看一看并行端口的焦点装备对话框的应用。例 4:

 

MOV

A,#0FEH

LOOP:

MOV

P1,A

 

RL

A

 

CALL

DELAY   ;延时 100 毫秒

 

JMP

LOOP

其中延时 100 毫秒的子法式模范模范请自行编写。

编   译   、   连   接   进   入   调   试   后   ,   点   击 Peripherals->I/O-Ports->Port  1 掀开,如图 1 所示,全速运 行,可以看到代表列位的勾在赓续变换(假定看不到变换, 请点击 View->Periodic Window Updata),如允许以笼统地 看出法式模范模范推行的效果。

注:假定你看到的变换极快,以致看不太清晰,那么 诠释你的盘算机性能好,模拟推行的速率快,你可以试着 将加长延时法式模范模范的时间以加速速率。模拟运转速率与现实 运转的速率没法类似是软件模拟的一个固有弱点。

点击 Peripherals->I/O-Ports->Timer0 即泛起图 2 所示 准时/计数器 0 的焦点接口界面,可以直接选择 Mode 组中 的下拉列表以一定准时/计数使命要领,0-3 四种使命要领,

图 2  焦点装备之准时器


设定准时初值等,点击选中 TR0,status 后的 stop 就酿成了 run,假定全速运转法式模范模范,此时

th0,tl0 后的值也快速地泉源变换(异常请求 Periodic Window Updata 处于选中状态),直不雅不雅地 演示了准时/计数器的使命情形(虽然,由于你的法式模范模范未对此写任何代码,以是法式模范模范不会对 此准时/计数器的使命阻拦处置赏罚赏罚)。

2、性能剖析

Keil 供应了一个性能剖析工具,应用该工具,我们可以明确法式模范模范中哪些部门的推行时间 最长,挪用次数最多,从而明确影响一切法式模范模范中推行速率的瓶颈。下面经由历程一个实例来看一 看这个工具若何应用,例 5:

#include "reg51.h"

sbit P1_0=P1^0;                       //界说 P1.0

void mDelay(unsigned char DelayTime)

{     unsigned int j=0;

for(;DelayTime>0;DelayTime--)

{   for(j=0;j<125;j++)    {;}     }

}

void mDelay1(unsigned char DelayTime)

{     unsigned int j=0;

for(;DelayTime>0;DelayTime--)

{        for(j=0;j<125;j++)                         {;}             }


}

void main()

{     unsigned int i;

for(;;){              mDelay(10);                    // 延时  10

毫秒

i++;

if(i==10)

{       P1_0=!P1_0; i=0; mDelay1(10);}

} }

编译毗连。进入调试状态后应用菜单 View->Performance Analyzer Window,掀开性能分 析对话框,进入该对话框后,只需一项 unspecified,点鼠标右键,在快捷菜单被选择 Setup PA 即掀开性能剖析设置对话框,关于 C 语言法式模范模范,该对话框左边的“Function  Symbol”下的 列表框给出函数符号,双击某一符号,该符号即涌现在 Define Performance Analyzer 下的编 缉框中,每输入一个符号名字,点击 Define  按钮,行将该函数加入其上的剖析列表框。对 于汇编语言源法式模范模范,Function  Symbol  下的列表框中不会泛起子法式模范模范名,可以直接在主笔框 中输入子法式模范模范名,点击 Close 关闭窗口,回到性能剖析窗口,此时窗口共有 4 个选项。全速 推行法式模范模范,可以看到 mDelay 和 mDelay1 后泛起一个蓝色指导条,合营下面的标尺可以直不雅不雅 地看出每个函数占一切推行时间的比例,点击照顾的函数名,可以在该窗口的状态栏看到更 详细的数据,其中各项的寄义以下:

Min:该段法式模范模范推行所需的最短时间;Max:该段法式模范模范推行所需的最长时间;Avg:该 段法式模范模范推行所花匀称时间;Total:该段法式模范模范到现在为目总共推行的时间;%:占一切推行时 间的百分比;count:被挪用的次数。

本法式模范模范中,函数 mDelay 和 mDelay1 每次被挪用都破费异常的时间,看不出 Min、Max、

和 Avg  的意义,现实上,由于条件的变换,某些函数推行的时间不用定是一个结实的值, 借助于这些信息,可以对法式模范模范有更详细的明确。下面将 mDelay1 函数略作修改作一演示。

void mDelay1(unsigned char DelayTime)

{     static unsigned char k;

unsigned int j=0;

for(;DelayTime>0;DelayTime--)

{   for(;j<k;j++)

{;}

}     k++; }

法式模范模范中界说了一个静态变量 K,每次挪用该变量加 1,而 j 的循环条件与 k 的年夜小有关,


这使每次推行该法式模范模范所花的时间纷歧样。编译、推行该法式模范模范,再次不雅不雅察性能剖析窗口,可以

看出 Min、Max、Avg 的意义。

3、变量泉源浏览

该窗口用于不雅不雅察法式模范模范中变量名的有关信息,如该变量名在那一个函数中被界说、在那里 被挪用,共泛起若干次等。在 Source Browse 窗口中供应了完善的治理措施,如过滤器可以 分门别类地列出种种种别的变量名,可以对这些变量按  Class(组)、Type(类型)、Space

(所在空间)、Use(挪用次数)排序,点击变量名,可以在窗口的左边看到该变量名的更 详细的信息。

4、代码作用规模剖析

在你写的法式模范模范中,有些代码能够永世不会被推行到(这是有用的代码),也有一些代码 必须在知足一定条件后才干被推行到,借助于代码规模剖析工具,可以快速地明确代码的执 行情形。

进入调试后,全速运转,然后按阻拦按钮,停上去后,可以看到在源法式模范模范的左列有三种 色彩,灰、淡灰和绿,其中淡灰所指的行着实不是可推行代码,如变量或函数界说、注释行等 等,而灰色行是可推行但从未推行过的代码,而绿色则是已推行过的法式模范模范行。应用调试工具 条上的 Code Coverage Window 可掀开代码作用规模剖析的对话框,外面有各个模块代码执 行情形的更详细的剖析。假定你发现全速运转后有一些未被推行到的代码,那么就要仔细分 析,这些代码现实是有用的代码还是由于条件没有知足而没有被推行到。

二、部门高等调试手艺

Keil 内置了一套调试语言,许多高等调试手艺与此有关,但是周全学习这套语言着实不现 实,这不是这么几期连载可以胜任的,这里仅简介部门较为适用的功效,如要取得更详细的 信息,请参考 Keil 自带的赞助文件 GS51.PDF。

1、串行窗口与现实硬件相连

Keil 的串行窗口除可以模拟串行口的输入和输入功效外还可以与 PC 机上现实的串口相 连,吸收串口输入的内容,并将输入送到串口。这须要在 Keil  中阻拦设置。措施是首先在 输入窗口的 Command 页用 MODE 敕令设置串口的使命要领,然后用 ASSIGN 敕令将串行 窗口与现实的串口相联系关系,下面我们经由历程一个实例来诠释若何操作。例 6:


ORG       0000H JMP START

ORG       3+4*8     ;串行中止出口

JMP SER_INT START:

MOV      SP,#5FH    ;客栈初始化

CALL    SER_INIT ;串行口初始化 A SETB              EA   ;


SETB      ES   ;

JMP $                ;主法式模范模范到此阻拦

SER_INT:

JBC      RI,NEXT  ; 假定串口吸收到字 符,转

JMP              SEND                     ;否则转发送处置赏罚赏罚

NEXT:

MOV            A,SBUF                ;从 SBUF 中取字符



MOV    SBUF,A    ;回送到发送 SBUF 中

JMP   OVER SEND:

clr   ti

OVER:

reti

SER_INIT:                 ;中止初始化

MOV                       SCON,#50H


ORL         TMOD,#20H

ORL         PCON,#80H

MOV         TH1,#0FDH ;设定波特率 SETB TR1      ;准时器 1 泉源运转 SETB        REN     ;允许吸收

SETB       SM2

RET END


这个法式模范模范应用了中止要领编写串行口输入/输入法式模范模范,它的功效是将接串行口收到的字 符回送,即再经由历程串行口发送出去。

准确输入源文件、培植工程、编译毗连没有错后,可阻拦调试,应用 Keil  自带的串行 窗口测试功效能否准确,假定准确,可以阻拦下一步的连机实验。

为简质朴用,我们不借助于其它的硬件,而是让 PC 机上的两个串口交流数据,即 COM1 发送 COM2 吸收,而 COM2 发送则由 COM1 吸收,为此,须要做一根毗连线将这两个串口 连起来,做法很质朴,找两个可以拔出 PC 机串口的 DIN9 插座(母),然后用一根 3 芯线将 它们连起来,连线的措施是:

2——3

3——2

5——5

接好线把两个插头划分拔出 PC 机上的串口 1 与串口 2。找一个 PC 机上的串口终端调 试软件,如串口精灵之类,运转该软件,设置好串口参数,其中串口选择 2,串口参数设置 为:

19200,n,8,1 其寄义是波特率为 19200,无奇偶校验,8 位数据,1 位阻拦位。 在 Keil 调试窗口的 command 页中输入:

>mode com1 19200,0,8,1

>assign com1 <sin>sout

重视两行最前面的“>”是提醒符,不要输入,第二行中的“<”和“>”即“小于”和 “年夜于”符号,中央的是字母“s”和“input”的前两个字母,最后是字母“s”和“output” 的前三个字母。

第一行敕令界说串口 1 的波特率为 19200,无奇偶校验,8 位数据,1 位阻拦位。第二 行是将串口 1(com1)分配给串行窗口。

全速运转法式模范模范,然后切换串口精灵,泉源发送,会看到发送后的数据会急速回显到窗口 中,诠释已吸收到了发送已往的数据。切换到 uVison,检查串行窗口 1,会看到这里着实着实接 收到了串口精灵送来的内容。

2、从端口送入旌旗暗记

法式模范模范调试中假定须要有旌旗暗记输入,好比数据搜集类法式模范模范,须要从外界取得数据,由于 Keil 的调试完全是一个软件调试工具,没有硬件与之相连,以是弗成能直接取得数据,为此 必须接纳一些替换的措施,例如,某电路用 P1 口作为数据搜集口,那么可以应用的一种方 法是应用焦点接口,掀开 PORT 1,用鼠标在点击照顾端口位,使其酿成高电平或低电平, 便可以输入数据。显着,这类措施关于要输取得数据而不是作位处置赏罚赏罚来讲太费事了,此外一种方 法是直接在 command 页输入 port1=数值,以下是一个小小的验证法式模范模范。例 7:

LOOP:    MOV      A,P1


 

JZ          NEXT

MOV      R0,#55H JMP          LOOP

NEXT:    MOV      R0,#0AAH JMP        LOOP

END

该法式模范模范从 P1 口取得数据,假定 P1 口的值是 0,那么就让 R0 的值为 0AAH,否则让 R0 的值为 55H。输入源法式模范模范并培植工程,进入调试后,在不雅不雅察窗口加入 R0,然后全速运转程 序,重视确保  View->Periodic  Window  Updata  处于选中状态,然后在  Command  后输入 PORT1=0 回车后可以发现不雅不雅察窗口中的 R0 的值酿成了 0AAH,然后再输入 PORT1=1 或其 它非零值,则 R0 的值会酿成 55H。

异常的事理,可以用 port0、port2、port3 划分向端口 0、2、3 输入旌旗暗记。

3、直接更改内存值

在法式模范模范运转中,此外一种输入数据的措施是直接更改照顾的内存单元的值,例如,某数据 搜集法式模范模范,应用 30H 和 31H 作为存储单元,采入的数据由这两个单元生涯,那么我们更改

了 30H 和 31H 单元的值就相当于这个数据搜集法式模范模范搜集到了数据,这可以在内存窗口中直 接修改(参考上一讲),也能够或许经由历程敕令阻拦修改,敕令的形式是: _WBYTE (地址,数据),

其中地 址是 指待写 入内 存单元 的地 址,而 数据 则是待 写入 该地址 的数 据。例 如

_WBYTE(0x30,11)会将值 11 写入内存地址十六进制 30H 单元中。