Keil C51 总线外设操作问题的深入分析

2007-03-09 19:03:27来源: 互联网
阅读了《单片机与嵌入式系统应用》2005年第10期杂志《经验交流》栏目的一篇文章《Keil C5l对同一端口的连续读取方法》(原文)后,笔者认为该文并未就此问题进行深入准确的分析。文章中提到的两种解决方法并不直接和简单。笔者认为这并非是Keil C51中不能处理对一个端口进行连续读写的问题,而是对Keil C51的使用不够熟悉和设计不够细致的问题,因此特撰写本文。 本文中对原文提到的问题,提出了三种不同于原文的解决方法。每种方法都比原文中提到的方法更直接和简单,设计也更规范。(无意批评,请原文作者见谅) 1 问题回顾和分析 原文中提到:在实际工作中遇到对同一端口反复连续读取,Keil C5l编译并未达到预期的结果。原文作者对C编译出来的汇编程序进行分析发现,对同一端口的第二次读取语句并未被编译。但可惜原文作者并未分析没有被编译的原因,而是匆忙地采用一些不太规范的方法试验出了两种解决办法。 对此问题,翻阅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.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编译产生的汇编代码,对提高汇编语言编写程序的水平都是很有帮助的。 由本文中的问题可以看出:在设计中遇到问题时,一定不要被表面现象蒙蔽,不要急于解决。应该认真分析,找出问题的原因,这样才能从根本上彻底解决问题。上不会出现不必要的干扰,防止了数据不一致的发生。
编辑: 引用地址:http://www.eeworld.com.cn/designarticles/mcu/200703/9000.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。
论坛活动 E手掌握
微信扫一扫加关注
论坛活动 E手掌握
芯片资讯 锐利解读
微信扫一扫加关注
芯片资讯 锐利解读
推荐阅读
全部

小广播

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 安防电子 医疗电子 工业控制

北京市海淀区知春路23号集成电路设计园量子银座1305 电话:(010)82350740 邮编:100191

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2016 EEWORLD.com.cn, Inc. All rights reserved