碧波液压网 欢迎你,游客。 登录 注册

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

版权信息:站内文章仅供学习与参考,如触及到您的版权信息,请与本站联系。

  本文中对原文提到的问题,提出了三种不同于原文的解决方法。每种方法都比原文中提到的方法更直接和简单,设计也更规范。

  1 问题回顾和分析

  原文中提到:在实际工作中遇到对同一端口反复连续读取,Keil C51编译并未达到预期的结果。原文作者对C编译出来的汇编程序进行分析发现,对同一端口的第二次读取语句并未被编译。但可惜原文作者并未分析没有被编译的原因,而是匆忙地采用一些不太规范的方法试验出了两种解决办法。

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

  ① Dead code elimination。

  ② Data overlaying。

  ③ Peephole optimization。

  ④ Register variables。

  ⑤ Common subexpression elimination。

  ⑥ Loop rotation。

  ⑦ Extended Index Access Optimizing。

  ⑧ Reuse Common Entry Code。

  ⑨ Common Block Subroutines。

  而以上的问题,正是由于Keil C51编译优化产生的。因为在原文程序中将外设地址直接按如下定义:

  unsigned char xdata MAX197 _at_ 0x8000;

  采用_at_将变量MAX197定义到外部扩展RAM指定地址0x8000。因此,Keil C51优化编译理所当然认为重复读第二次是没有用的,直接用第一次读取的结果就可以了,因此编译器跳过了第二条读取语句。至此,问题就一目了然了。

  2 解决方法

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

  2.1 最简单最直接的办法

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

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

  CLRMAXHBEN

  MOVDPTR,#MAX197

  MOVXA,@DPTR

  MOVR7,A

  MOVdown8,R7

  SETBMAXHBEN

  MOVDPTR,#MAX197

  MOVXA,@DPTR

  MOVR7,A

  MOVup4,R7

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

  2.2 最好的方法

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

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

  unsigned char volatile xdata MAX197 _at_ 0x8000;

你没有登陆,无法阅读全文内容

您需要 登录 才可以查看,没有帐号? 立即注册

标签:
点赞   收藏

相关文章

发表评论

请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。

用户名: 验证码:

最新评论