您的位置 首页 软件

Keil的代码优化发生的问题

阅读了《单片机与嵌入式系统应用》2005年第10期杂志《经验交流》栏目的一篇文章《KeilC5l对同一端口的连续读取方法》(原文)后,笔者认…

阅 读了《单片机嵌入式体系运用》2005年第10期杂志《经验交流》栏目的一篇文章《Keil C5l对同一端口的接连读取办法》(原文)后,笔者以为该文并未就此问题进行深化精确的剖析。文章中说到的两种处理办法并不直接和简略。笔者以为这并非是 Keil C51中不能处理对一个端口进行接连读写的问题,而是对Keil C51的运用不行了解和规划不行详尽的问题,因而特编撰本文。

本文中对原文说到的问题,提出了三种不同于原文的处理办法。每种办法都比原文中说到的办法更直接和简略,规划也更标准。(无意批判,请原文作者见谅)

1 问题回忆和剖析

原文中说到:在实践工作中遇到对同一端口重复接连读取,Keil C5l编译并未到达预期的成果。原文作者对C编译出来的汇编程序进行剖析发现,对同一端口的第2次读取句子并未被编译。但惋惜原文作者并未剖析没有被编译 的原因,而是匆忙地选用一些不太标准的办法实验出了两种处理办法。

对此问题,翻阅Keil C51的手册很简略发现:KellC51的编译器有一个优化设置,不同的优化设置,会产生不同的编译成果。一般状况缺省编译优化设置被设定为8级优化,实践最高可设定为9级优化:

①Dead code elimination。

②Data overlaymg。

③Peephole optimization。

④Register variables。

⑤Common subexpression elimination。

⑥Loop rotation。

⑦Extended Index Access 0ptimizing。

⑧Reuse Common。Entry Code。

⑨Common Block Subroutines。

而以上的问题,正是由于KeiI C5l编译优化产生的。由于在原文程序中将外设地址直接按如下界说:

unsigned char xdata MAXl97_at_Ox8000;

选用_at_将变量MAXl97界说到外部扩展RAM指定地址Ox8OOO。因而,Keil C51优化编译天经地义以为重复读第2次是没有用的,直接用第一次读取的成果就能够了,因而编译器越过了第二条读取句子。至此,问题就一望而知了。

2 处理办法

由以上剖析很简略就能提出很好的处理办法。

2.1 最简略最直接的办法

程序一点都不必修正,将Keil C5l的编译优化挑选设置为0(不优化)就能够了。

挑选project窗口的Target,然后翻开“Options forTarget”设置对话框,挑选“C5l”选项卡,将“Code Optimiztaion”中的“Level”挑选为“0:Costant folding”。再次编译后,我们会发现编译成果为:

CLR MAXHBEN

MOV DPTR,#M.AXl97

MOVX A,@DPTR

MOV R7.A

MOV down8.R7

SETB MAXHBEN

MOV DPTR,#MAXl97

MOVX A,@DPTR

MOV R7.A

MOV uD4.R7

两次读取操作都被编译出来了。

2.2 最好的办法

告知Keil C51,这个地址不是一般的扩展RAM,而是衔接的设备,具有“蒸发”特性,每次读取都是有意义的。

能够修正变量界说,添加“volatile”关键字阐明其特征:

unsigned char volatile xdata MAXl97_at_Ox8000;

也能够在程序中包括体系头文件:“#incIude”,然后在程序中修正变量,界说为直接地址:

#defme MAXl97 XBYTE[Ox8000]

这样,。Keil C51的设置依然能够保存高档优化,且编译成果中,相同两次读取并不会被优化越过。

2.3 硬件处理办法

原文中将MAXl97的数据直接衔接到数据总线,而对地址总线并未运用,选用一根端口线挑选操作凹凸字节。很简略的修正办法便是运用一根地址线挑选操作高 低字节即可。比方:将P2.0(A8)衔接到本来P1.O衔接的HBEN脚(MAXl97的5脚),在程序中别离界说凹凸字节的操作地址:

unsigned char volatile xdata MAXl97_L_aI_Ox8000;

unsigned char volatile xdata MAXl97 H at 0.x8100;

将本来的程序:

MAXHBEN=O; //读取低8位

down8=MAXl97:

MAXHBEN=1; //读取高4位

up4=MAXl97:

改为以下两句即可:

down8=MAXl97_L; //读取低8位

up4=MAXl97_H; //读取高4位

3 小结

Keil C51经过长时间检测和改善以及很多开发人员的实践运用,现已克服了绝大多数的问题,而且其编译功率也十分高。关于一般的运用,很难再发现什么问题。笔者曾 经大略研讨过一下Keil C51优化编译的成果,十分敬服Keil C51规划者的才智,一些C程序编译产生的汇编代码,乃至比一般程序员直接用汇编编写的代码还要优异和简练。经过研读KeilC51编译产生的汇编代码, 对进步汇编语言编写程序的水平都是很有协助的。

由本文中的问题能够看出:在规划中遇到问题时,必定不要被表面现象遮盖,不要急于处理。应该仔细剖析,找出问题的原因,这样才干从根本上完全处理问题。上不会呈现不必要的搅扰,避免了数据不一致的产生。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qianrushi/ruanjian/276716.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部