Keil 的辅助工具和部份高级技巧

发布者:Aningmeng最新更新时间:2016-12-12 来源: eefocus关键字:Keil  辅助工具  高级技巧 手机看文章 扫描二维码
随时随地手机看文章

在前面的几讲中我们介绍了工程的建立方法,常用的调试方法,除此之外,Keil 还提供
了一些辅助工具如外围接口、性能分析、变量来源分析、代码作用分析等,帮助我们了解程
的性能、查找程序中的隐藏错误,快速查看程序变量名信息等,这一讲中将对这些功工具作
一介绍,另外还将介绍Keil 的部份高级调试技巧。
一、 辅助工具
这部份功能并不是直接用来进行程序调试的,但可以帮助我们进行程序的调试、程序性
能的分析,同样是一些很有用的工具。
1、外围接口
为了能够比较直观地了解单片机中定时器、中断、
并行端口、串行端口等常用外设的使用情况,Keil 提
供了一些外围接口对话框,通过Peripherals 菜单选择,
该菜单的下拉菜单内容与你建立项目时所选的CPU
有关,如果是选择的89C51 这一类“标准”的51 机,
那么将会有Interrupt(中断)、I/O Ports(并行I/O 口)、
Serial(串行口)、Timer(定时/计数器)这四个外围设
备菜单。打开这些对话框,列出了外围设备的当前使用情况,各标志位的情况等,可以在这
些对话框中直观地观察和更改各外围设备的运行情况。
下面我们通过一个简单例子看一看并行端口的外围设备对话框的使用。例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 四种工作方式,

图1 外围设备之并行端口


图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++; }
程序中定义了一个静态变量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 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 单元中。

关键字:Keil  辅助工具  高级技巧 引用地址:Keil 的辅助工具和部份高级技巧

上一篇:Keil C51调试程序时, 对ROM的查看以及RAM 查看或修改
下一篇:Keil C51常用功能模块使用说明(1)

推荐阅读最新更新时间:2024-03-16 15:24

Keil MDK环境下使用STM32固件库
简介 写这篇教程主要是和大家分享使用STM32的基本方法,也是给自己学习过程的总结、记录和备忘,避免重复学习之前明白但又忘记的知识和操作。我现在也是刚开始接触学习STM32,我是在STM32的固件库V3基础上进行学习。在这里我和大家分享一下使用V3.x库的方法,希望大家喜欢,如有错误请指出。 这篇教程分以下几个方面,一:建立工程,设置工程属性。二:建立条理清晰的GROUP;三:使用JLINK仿真调试。下面就分别逐个说明。 一、新建MDK工程 1、首先,打开MDK软件,再点击Project- New uVision Project ,如下图所示: 弹出如下对话框: 新建一个文件夹MDK工
[单片机]
基于keil C mdk开发环境的stm32的USB接口单片机程序设计
  首先,我们来看看usb的工作过程。   当usb设备接入到主机时,主机开始枚举usb设备,并向usb设备发出指令要求获取usb设备的相关描述信息,其中包括设备描述(dev IC e descriptor)、配置描述(configuration descriptor)、接口描述(interface descriptor)、端点描述(endpoint descriptor)等。这些信息是通过端点0(endpoint 0)传送到主机的。获取各种描述信息后,操作系统会为其配置相应的资源。这样主机就可以与设备之间进行通信了。   usb通讯有四种通讯方式控制(control)、中断(interrupt)、批量(bulk)和同步( s
[单片机]
基于keil5新建STM32F10x寄存器版本工程
一、前言 前面文章分享了很多关于STM32F103系列知识点、物联网相关的小项目,工程都采用的是寄存器方式编写;很多小伙伴接触STM32开始都采用库函数编程,不清楚如何使用寄存器方式开发STM32;这篇文章就讲一下如何新建寄存器风格的STM32工程,并介绍需要用到哪些官方系统文件等。 比较具有代表性的几篇物联网教程: 1. 智慧农业项目(基于腾讯物联网服务器) 2. 遥控小车项目 3. 智能门锁项目(基于腾讯物联网服务器) 4. 物联网项目(基于阿里云物联网服务器) 5. 智能家居项目(基于中国移动OneNet物联网服务器) 二、环境介绍 开发环境: keil5.25 编程语言: C语言 操作系
[单片机]
基于<font color='red'>keil</font>5新建STM32F10x寄存器版本工程
KEIL常见问题及解决办法
一、关于KEIL中的警告: warning: #1-D: last line of file ends without a newline keil软件编译时,有时会出现一个问题,点击问题时很难找到确切错误。 warning: #1-D: last line of file ends without a newline 错误信息如下: 解决方法: 你会发现在该.c/.h文件中,某行代码左侧有浅蓝色箭头,从此行往上依次进行警告排除。 把鼠标标记到这行代码的首位,按backspace键,缩进到上一行,再敲击“Enter”键。正常情况下光标会消失。如果往上移动,则重复以上步骤。 如果浅蓝色箭头没有
[单片机]
<font color='red'>KEIL</font>常见问题及解决办法
Keil for ARM中开关中断函数
/* $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ 函数名称:DisableInterrupt 功能描述:禁止中断 入口参数:无 出口参数:无 全局变量: 创建时间: 修改时间: 注:关中断要在中断模式里执行,SPSR要在arm模式才能识别 */ // $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ 以上原形声明的函数供本函数调用 void DisableInterrupt(void) __arm __swi(9) { //
[单片机]
STC单片机在KEIL编译器中的头文件
  STC单片机在 keil 编译器里找不到头文件如何处理。首先在网络上找到一个关于STC单片机的升级包。安装上去以后,就可以看到有STC型号的单片机可以选择了。但是此时,它的头文件却无法调用。也没有在keil的安装文件下找到这个升级包应该附带的STC单片机头文件。   解决办法就是打开一个AT89S52的头文件,在此头文件的基础上假如STC独有的一些SFR声明,然后把文件名改为STC89S52.H,然后放入工程所在文件夹,就可以进行正常调用了。   STC的特殊SFR声明如下:   /* After is STC additional SFR */   /* sfr AUXR = 0x8e; */   /* sfr
[单片机]
keil c文件中加入汇编方法
1.汇编语句写法 2.设置嵌套了汇编的C文件属性 勾选这两项为黑色 4.汇编常包含的库文件。自己看着选 存储模式是small模式添加这个文件 、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、 、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、 C51下加入汇编代码 使用如下标志符: #pragma asm ;汇编语句 #pragma endasm 注意:Keil编译器中需要激活Properties中的“Generate Assembler SRC File” 和“Assembler SRC File ”两个选项 以下举例: 1、把 xx
[单片机]
<font color='red'>keil</font> c文件中加入汇编方法
关于KeilC51的指针
  keil中的指针分为两种,一种是普通指针,兼容标准C语言的指针;另一种是我翻译成内存特殊指针(memory-specific pointers,翻译的不好: )      一、普通指针   普通指针的定义方式如下, char * ptr; 跟标准C的定义方式一样。这种指针占三个字节。第一个字节是标识存储类型,是指针指向的变量的数据类型。 第二个字节是指针存储地址的高位字节。第三个字节是指针存储地址的低位字节。   普通指针默认存储在内部存储器data,即片上RAM。如果想指定指针的存储位置,可以在 * 后加上存储类型,如下面几种定义方式: char * data ptr; //与char * ptr;等价,即默认的定义方
[单片机]
关于KeilC51的指针
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved