(玩电子) 电子技术学习与研究
当前位置单片机教程网 >> 基础教程 >> 浏览文章

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


设定定时初值等点击选中 TR0status 后的 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 看被调用都花费同样的时间看不出 MinMax

和 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 的大小有关


这使看执行该程序所花的时间不一样编译执行该程序再次观察性能分析窗口可以

看出 MinMaxAvg 的意义

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 芯线将 它们连起来连线的方法是

23

32

55

接好线把两个插头分别插入 PC 机系串口 1 与串口 2找一个 PC 机系串口终端调 试软件如串口精灵之类运行该软件设置好串口参数其中串口选择 2串口参数设置 为

19200n81 其含义是波特率为 19200无奇偶校验8 位数据1 位停止位 在 Keil 调源口的 command 页中输入

>mode com1 19200,0,8,1

>assign com1 <sin>sout

注意两行最前面的>是提示符不要输入第二行中的<和>础小于和 大于符号中间的是字母s和input的前两个字母最后是字母s和output 的前三个字母

第一行命令定义串口 1 的波特率为 19200无奇偶校验8 位数据1 位停止位第二 行是将串口 1com1分配给串行窗口

全速运行程序然后切换串口精灵开始发停会看到发送后的数据会立即回显到窗口 中说明已接收到了发送过来的数据切换到 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

同样的览可以用 port0port2port3 分别向端口 023 输入信号

3直接更改内存值

在程序运行中另一种输入数据的方法是直接更改相应的内存单元的值例如某数据 采集程序使用 30H 和 31H 作为存储单元采入的数据由这两个单元保存那么我们更改

了 30H 和 31H 单元的值就相当于这个数据采集程序采集到了数据这可以在内存窗口中直 接修改参考上一讲部以通过命令进行修改命令的形式是 _WBYTE (地址,数据)

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

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

发表评论告诉好友收藏此文关闭窗口

文章评论

һ֮Ƶ