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;j0;delaytime--)
{ for(j=0;jperformance 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(;jmode 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 单元中。

三大运营商2019年上半年总体业务营收情况分析
探析无人舰艇技术的现状及未来发展趋势
关于智闻机器人的性能分析和应用介绍
2019年中国制造的半导体产品收入将增长25%至1100亿美元
在Sansar上推出了Greenwall VR,利用VR正式进军电子竞技领域
Keil 的辅助工具和部份高级技巧
不损失SNR前提下 高压信号转换成低压ADC输入
三星重磅发布Galaxy SmartTags 可用于远程操控
美国麻省理工学院研发纳米粒子传感器用于治疗细菌性肺炎的患者
Alternistor:家用电器中的感性负载开关
华为发布一站式AI开发平台 已汇聚了150万全球开发者
贸泽电子连续第四年蝉联TE年度全球卓越服务分销商奖
浅析DCS、SIS和MIS三大控制系统的区别
据说有编程思维的孩子,运气都不会太差!
锤子科技夏季新品发布会将于8月20日在北京举行
利用原位激光辅助制造方案开发一种柔性石墨烯气体传感器制造工艺
皮秒激光打孔机的特点
跟随直线电机生产厂家走进清华音乐会
全球第一家:比亚迪停止制造燃油车
随着补贴政策退坡,新能源汽车市场进行了大变革