tag 标签: c语言程序设计

相关博文
  • 热度 32
    2015-9-6 18:12
    2001 次阅读|
    0 个评论
    Keil C51总线外设操作问题的深入分析 1问题回顾和分析 在实际工作中遇到对同一端口反复连续读取,Keil C51编译并未达到预期的结果。对C编译出来的汇编程序进行分析发现,对同一端口的第二次读取语句并未被编译。 对此问题,翻阅Keil C51的手册很容易发现:KeilC51的编译器有一个优化设置,不同的优化设置,会产生不同的编译结果。一般情况缺省编译优化设置被设定为8级优化,实际最高可设定为9级优化: 1. Dead code elimination。 2.Data overlaying。 3.Peephole optimization。 4.Register variables。 5.Common subexpression elimination。 6.Loop rotation。 7.Extended Index Access Optimizing。 8.Reuse Common Entry Code。 9.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”。再次编译后,大家会发现编译结果为: CLR MAXHBEN MOV DPTR,#MAX197 MOVX A,@DPTR MOV R7,A MOV down8,R7 SETB MAXHBEN MOV DPTR,#MAX197 MOVX A,@DPTR MOV R7,A MOV up4,R7 两次读取操作都被编译出来了。 2.2最好的方法 告诉Keil C51,这个地址不是一般的扩展RAM,而是连接的设备,具有“挥发”特性,每次读取都是有意义的。可以修改变量定义,增加“volatile”关键字说明其特征: unsigned char volatile xdata MAX197 _at_ 0x8000; 也可以在程序中包含系统头文件;“#includeabsacc.h”,然后在程序中修改变量,定义为直接地址: #define MAX197 XBYTE 这样,Keil C51的设置仍然可以保留高级优化,且编译结果中,同样两次读取并不会被优化跳过。 2 .3硬件解决方法 原文中将MAX197的数据直接连接到数据总线,而对地址总线并未使用,采用一根端口线选择操作高低字节。很简单的修改方法就是使用一根地址线选择操作高低字节即可。比如:将P2.0(A8)连接到原来P1.0连接的HBEN脚(MAX197的5脚).在程序中分别定义高低字节的操作地址: unsigned char volatile xdata MAX197_L _at_ 0x8000; unsigned char volatile xdata MAX197_H _at_ 0x8100; 将原来的程序: MAXHBEN =0; down8=MAX197;//读取低8位 MAXHBEN =1; up4=MAX197;//读取高4位 改为以下两句即可 down8= MAX197_L;//读取低8位 up4=MAX197_H;//读取高4位 3小结 Keil C51经过长期考验和改进以及大量开发人员的实际使用,已经克服了绝大多数的问题,并且其编译效率也非常高。对于一般的使用.很难再发现什么问题。笔者曾经粗略研究过一下Keil C51优化编洋的结果.非常佩服Keil C51设计者的智慧,一些C程序编译产生的汇编代码.甚至比一般程序员直接用汇编编写的代码还要优秀和简练通过研读Kell C51编译产生的汇编代码.对提高汇编语言编写程序的水平都是很有帮助的。 由本文中的问题可以看出:在设计中遇到问题时.一定不要被表面现象蒙蔽,不要急于解决,应该认真分析,找出问题的原因.这样才能从根本上彻底解决问题。 转自畅学电子网。
  • 热度 20
    2015-9-6 16:38
    1745 次阅读|
    0 个评论
    Keil C51总线外设操作问题的深入分析 1问题回顾和分析 在实际工作中遇到对同一端口反复连续读取,Keil C51编译并未达到预期的结果。对C编译出来的汇编程序进行分析发现,对同一端口的第二次读取语句并未被编译。 对此问题,翻阅Keil C51的手册很容易发现:KeilC51的编译器有一个优化设置,不同的优化设置,会产生不同的编译结果。一般情况缺省编译优化设置被设定为8级优化,实际最高可设定为9级优化: 1. Dead code elimination。 2.Data overlaying。 3.Peephole optimization。 4.Register variables。 5.Common subexpression elimination。 6.Loop rotation。 7.Extended Index Access Optimizing。 8.Reuse Common Entry Code。 9.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”。再次编译后,大家会发现编译结果为: CLR MAXHBEN MOV DPTR,#MAX197 MOVX A,@DPTR MOV R7,A MOV down8,R7 SETB MAXHBEN MOV DPTR,#MAX197 MOVX A,@DPTR MOV R7,A MOV up4,R7 两次读取操作都被编译出来了。 2.2最好的方法 告诉Keil C51,这个地址不是一般的扩展RAM,而是连接的设备,具有“挥发”特性,每次读取都是有意义的。可以修改变量定义,增加“volatile”关键字说明其特征: unsigned char volatile xdata MAX197 _at_ 0x8000; 也可以在程序中包含系统头文件;“#includeabsacc.h”,然后在程序中修改变量,定义为直接地址: #define MAX197 XBYTE 这样,Keil C51的设置仍然可以保留高级优化,且编译结果中,同样两次读取并不会被优化跳过。 2 .3硬件解决方法 原文中将MAX197的数据直接连接到数据总线,而对地址总线并未使用,采用一根端口线选择操作高低字节。很简单的修改方法就是使用一根地址线选择操作高低字节即可。比如:将P2.0(A8)连接到原来P1.0连接的HBEN脚(MAX197的5脚).在程序中分别定义高低字节的操作地址: unsigned char volatile xdata MAX197_L _at_ 0x8000; unsigned char volatile xdata MAX197_H _at_ 0x8100; 将原来的程序: MAXHBEN =0; down8=MAX197;//读取低8位 MAXHBEN =1; up4=MAX197;//读取高4位 改为以下两句即可 down8= MAX197_L;//读取低8位 up4=MAX197_H;//读取高4位 3小结 Keil C51经过长期考验和改进以及大量开发人员的实际使用,已经克服了绝大多数的问题,并且其编译效率也非常高。对于一般的使用.很难再发现什么问题。笔者曾经粗略研究过一下Keil C51优化编洋的结果.非常佩服Keil C51设计者的智慧,一些C程序编译产生的汇编代码.甚至比一般程序员直接用汇编编写的代码还要优秀和简练通过研读Keil C51编译产生的汇编代码.对提高汇编语言编写程序的水平都是很有帮助的。 由本文中的问题可以看出:在设计中遇到问题时.一定不要被表面现象蒙蔽,不要急于解决,应该认真分析,找出问题的原因.这样才能从根本上彻底解决问题。 转自畅学电子网。
相关资源
  • 所需E币: 2
    时间: 2019-6-14 23:09
    大小: 18.75MB
    上传者: JC丶
    由谭浩强教授著、清华大学出版社出版的《C程序设计》是一本公认的学习C语言程序设计的经典教材。根据C语言的发展和计算机教学的需要,作者在《C程序设计(第三版)》的基础上进行了修订。《C程序设计(第4版)》按照C语言的新标准C99进行介绍,所有程序都符合C99的规定,使编写程序更加规范;对C语言和程序设计的基本概念和要点讲解透彻,全面而深入;按照作者提出的“提出问题―解决问题―归纳分析”三部曲进行教学、组织教材;《C程序设计(第4版)》的每个例题都按以下几个步骤展开:提出任务―解题思路―编写程序―运行程序―程序分析―有关说明。符合读者认知规律,容易入门与提高。本书内容先进,体系合理,概念清晰,讲解详尽,降低台阶,分散难点,例题丰富,深入浅出,文字流畅,通俗易懂,是初学者学习C程序设计的理想教材,可作为高等学校各专业的正式教材,也是一本自学的好教材。本书还配有辅助教材《C程序设计(第四版)学习辅导》。