阅 读了《单片机与嵌入式体系运用》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编译产生的汇编代码, 对进步汇编语言编写程序的水平都是很有协助的。
由本文中的问题能够看出:在规划中遇到问题时,必定不要被表面现象遮盖,不要急于处理。应该仔细剖析,找出问题的原因,这样才干从根本上完全处理问题。上不会呈现不必要的搅扰,避免了数据不一致的产生。