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

Keil教程(4)

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

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  外围设备之守时器


casino

设定守时初值等,点击选中 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 单元中。

宣布谈论】【告知老友】【保藏此文】【封闭窗口
m88 188bet uedbet 威廉希尔 明升 bwin 明升88 bodog bwin 明升m88.com 18luck 188bet unibet unibet Ladbrokes Ladbrokes casino m88明升 明升 明升 m88.com 188bet m88 明陞 uedbet赫塔菲官网 365bet官网 m88 help

文章谈论