老古开发网首页
导航:老古开发网首页文章索引索引第2963页文章分类网络文摘第31页→[Keil C51 总线外设操作问题的深入分析]
| -文章搜索 - 最新文章 - |

第59253篇:Keil C51 总线外设操作问题的深入分析

发布时间:2006年11月3日 点击次数:52
来源:21IC.COM   作者:四川海力电子仪表制造有限公司 魏东
 
在实际工作中遇到对同一端口反复连续读取,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优化编译理所当然认为重复读第二次是没有用的,直接用第一次读取的结果就可以了,因此编译器跳过了第二条读取语句。至此,问题就一目了然了。 

由以上分析很容易就能提出很好的解决办法。

最简单最直接的办法    

程序一点都不用修改,将Keil C5l的编译优化选择设置为0(不优化)就可以了。    

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

   

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

最好的方法    

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

可以修改变量定义,增加“volatile”关键字说明其特征:    
 
unsigned char volatile xdata MAXl97_at_Ox8000;    

也可以在程序中包含系统头文件:“#incIude”,然后在程序中修改变量,定义为直接地址:    #defme MAXl97 XBYTE[Ox8000] 

这样,Keil C51的设置仍然可以保留高级优化,且编译结果中,同样两次读取并不会被优化跳过。   

硬件解决方法    

文中将MAXl97的数据直接连接到数据总线,而对地址总线并未使用,采用一根端口线选择操作高低字节。很简单的修改方法就是使用一根地址线选择操作高低字节即可。比如:将P2.0(A8)连接到原来P1.O连接的HBEN脚(MAXl97的5脚),在程序中分别定义高低字节的操作地址:   

    

Keil C51经过长期考验和改进以及大量开发人员的实际使用,已经克服了绝大多数的问题,并且其编译效率也非常高。对于一般的使用,很难再发现什么问题。笔者曾经粗略研究过一下Keil C51优化编译的结果,非常佩服Keil C51设计者的智慧,一些C程序编译产生的汇编代码,甚至比一般程序员直接用汇编编写的代码还要优秀和简练。通过研读KeilC51编译产生的汇编代码,对提高汇编语言编写程序的水平都是很有帮助的。   

欢迎进入老古论坛进行讨论
[网络文摘] 相关文章:
AVR单片机的RTOS-AVRX应用
简介:
引 言 随着技术的发展,嵌入式系统的设计及应用对人们的生活产生了很大的影响,并将逐渐改变人们未来的生活方式。在特定的操作系统上开发应用程序,可以使开发人员忽略掉很多底层硬件细节,使得应用程序调试更方便、易于维护、开发周期缩短并且降低开发成本,因而嵌入式操作系统深得开发人员的青睐。 AVR微处理器是Atmel公司开发的8位嵌入式RISC处理器,它具有高性能、高保密性、低功耗、非易失性......

“1+1”UPS并机系统供电系统研究
数字音频D类耳机放大器芯片NJU8721及其应用
基于GPRS远程监控系统数据终端的研究
基于DSL的IPTV测试
 
下一个:[新闻热点]飞思卡尔和意法半导体推动汽车合作向前迈进
简介:
飞思卡尔半导体(NYSE:FSL,FSL.B)和汽车行业领先的半导体供应商意法半导体公司(NYSE:STM)的联合设计计划已经取得关键的里程碑式的成就。该计划旨在加快汽车行业的创新。自从7个月前宣布计划以来,两家公司已经为联合设计中心配备人员,设计出下一代微控制器内核,并定义了产品路线图,和调整了工艺技术。 意法半导体公司副总裁兼汽车产品部总经理Ugo Carena表示:“依托双方的长期合作关系,意法半导体和飞......

上一个:[技术文章]SDRAM在视频处理器中的应用

老古开发网版权所有 2006年9月 asp.Net V2.0 设计:老古
页面缓存:否 执行时间:63毫秒