位置:51电子网 » 技术资料 » 测试测量

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

发布时间:2008/5/27 0:00:00 访问次数:531

        

    

    

    来源:单片机及嵌入式系统应用 作者:四川海力电子仪表制造有限公司 魏东

     

    阅读了《单片机与嵌入式系统应用》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 maxl

        

    

    

    来源:单片机及嵌入式系统应用 作者:四川海力电子仪表制造有限公司 魏东

     

    阅读了《单片机与嵌入式系统应用》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 maxl

相关IC型号

热门点击

 

推荐技术资料

音频变压器DIY
    笔者在本刊今年第六期上着重介绍了“四夹三”音频变压器的... [详细]
版权所有:51dzw.COM
深圳服务热线:13692101218  13751165337
粤ICP备09112631号-6(miitbeian.gov.cn)
公网安备44030402000607
深圳市碧威特网络技术有限公司
付款方式


 复制成功!