版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、keilc51 代码优化详细分析阅读了单片机与嵌入式系统应用 2005 年第 10 期杂志经验交流栏目的一篇文章 Keil C51 对同一端口的连 续读取方法 (原文 )后 ,笔者认为该文并未就此问题进行深入准确的分析 文章中提到的两种解决方法并不直接和简单。笔者认为这并非是 Keil C51 中不能处理对一个端口进行连续读写的问题 ,而是对 Kei1 C51 的使用不够熟悉和设计不够细 致的问题 ,因此特撰写本文。本文中对原文提到的问题 ,提出了三种不同于原文的解决方法。 每种方法都比原文中提到的方法更直接和简单,设计也更规范。 (无意批评 ,请原文作者见谅 )1 问题回顾和分析原文中提到:
2、在实际工作中遇到对同一端口反复连续读取,Keil C51编译并未达到预期的结果。原文作者对C编译出 来的汇编程序进行分析发现 ,对同一端口的第二次读取语句并未被编译。但可惜原文作者并未分析没有被编译的原因 而是匆忙地采用一些不太规范的方法试验出了两种解决办 法。对此问题 ,翻阅 Keil C51 的手册很容易发现: KeilC51 的编译器有一个优化设置 ,不同的优化设置 ,会产生不同的编译结果。一般情况缺省编译优化设置被设定为8 级优化 ,实际最高可设定为 9 级优化:1. Dead code elimination 。2. Data overlaying 。3. Peephole opti
3、mization 。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指定地址0x80
4、00。因此,KeilC51优化编译理所当然认为重复读第 次是没有用的 ,直接用第一次读取的结果就可以了 ,因此编译器跳过了第二条读取语句。至此 ,问题就一目了然了。2 解决方法 由以上分析很容易就能提出很好的解决办法。2 1 最简单最直接的办法程序一点都不用修改 ,将 Keil C51 的编译优化选择设置为0(不优化)就可以了。选择Project窗口的Target,然后打开“Options for Target ”设置对话框,选择“C51 ”选项卡,将“CodeOptimiztaion ”中的“ Level ”选择为“ 0:Costant folding ”。再 次编译后 ,大家会发现编译结果
5、为:CLR MAXHBENMOV DPTR,#MAX197MOVX A,DPTRMOV R7,AMOV down8,R7SETB MAXHBENMOV DPTR,#MAX197MOVX A,DPTRMOV R7,AMOV up4,R7两次读取操作都被编译出来了。2 2 最好的方法告诉 Keil C51, 这个地址不是一般的扩展 RAM, 而是连接的设备 ,具有“挥发”特性 ,每次读取都是有意义的。可以修改变量定义 ,增加“ volatile ”关键字说明其特征:unsigned char volatile xdata MAX197 _at_ 0x8000 ; 序中修改变量 ,定义为直接地址:
6、#define MAX197 XBYTE0x8000也可以在程序中包含系统头文件;#include ”,然后在程这样,Keil C51的设置仍然可以保留高级优化,且编译结果中 ,同样两次读取并不会被优化跳过。2 3 硬件解决方法原文中将 MAX197 的数据直接连接到数据总线 ,而对地址总线并未使用 ,采用一根端口线选择操作高低字节。 很简单 的修改方法就是使用一根地址线选择操作高低字节即可。比 如:将P2.0(A8)连接到原来 P 1.0连接的HBEN脚(MAX197的 5 脚)在程序中分别定义高低字节的操作地址:unsigned char volatile xdata MAX197_L _
7、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 优化编洋的结果 非常
8、佩服 Keil C51 设计者的智慧 ,一些 C 程序编译产生的汇编代码 甚至比一般程序员直接用汇编编写的代码还要优秀和简练通过研读 KellC51 编译产生的汇编代码对提高汇编语言编写程序的水平 都是很有帮助的。由本文中的问题可以看出:在设计中遇到问题时一定不要被表面现象蒙蔽 ,不要急于解决,应该认真分析 ,找出问题的原因这样才能从根本上彻底解决问题。附表:Keil C51中的优化级别及优化作用级别说明 0常数合并: 编译器预先计算结果, 尽可能用常数代替表达式。包括运行地址计算。优化简单访问:编译器优化访问 8051 系统的内部数据和位 地址。跳转优化:编译器总是扩展跳转到最终目标,多级跳
9、转指令 被删除。 1死代码删除:没用的代码段被删除。拒绝跳转:严密的检查条件跳转,以确定是否可以倒置测试 逻辑来改进或删除。 2数据覆盖: 适合静态覆盖的数据和位段被确定, 并内部标识。BL51 连接 /定位器可以通过全局数据流分析,选择可被覆盖的段。 3窥孔优化:清除多余的 MOV 指令。这包括不必要的从存储 区加载和常数加载操作。当存储空间或执行时间可节省时, 用简单操作代替复杂操作。 4寄存器变量:如有可能,自动变量和函数参数分配到寄存器 上。为这些变量保留的存储区就省略了。优化扩展访问: IDATA 、XDATA 、 PDATA 和 CODE 的变量 直接包含在操作中。在多数时间没必要使用中间寄存器。局部公共子表达式删除:如果用一个表达式重复进行相同的 计算,则保存第一次计算结果,后面有可能就用这结果。多 余的计算就被删除。Case/Switch优化:包含 SWITCH和CASE的代码优化为跳转表或跳转队列。 5全局公共子表达式删除:一个函数内相同的子表达式有可能就只计算一次。中间结果保存在寄存器中,在一个新的计算中使用。简单循环优化:用一个常数填充存储区的循环程序被修改和 优化。 6循环优化:如果结果程序
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 湖南省湘潭市2026-2027学年高二上学期第一次月考语文自编卷(统编版必修一、必修二、选必一1-2单元)(解析版)
- 2026年09月27日 东莞市松山湖考试中心 爱德万测试 芯片测试工程师 24人
- 陕西省安康市2025-2026学年高一上学期期末化学试题(含答案)
- 口腔局部麻醉总结
- 常见皮肤病防治与护理
- 骨科疾病常见护理
- 白癜风健康管理
- 吉林榆树市八号镇中学2026-2027学年度第一学期学情测试考试八年级道德与法治试卷(含答案)
- 2025-2026年人体生理学测试题
- 2025-2026年执业药师资格证考试药学综合知识与技能模拟试卷
- 2026-2027学年岭南版(新版)初中美术七年级上册教学计划及进度表(第一学期)
- 2026年六安霍邱县沣源水务有限责任公司公开招聘工作人员10名考试备考试题及答案详解
- 10千伏环网柜(箱)标准化设计方案 (2023 版)
- 《国际资本流动理论》课件
- 《贴片工艺培训》课件
- 介入治疗前后注意事项
- 康熙字典-繁体字笔画五行1-30
- 山东省汽车维修工时定额(T-SDAMTIA 0001-2023)
- 水资源与流域经济协同发展
- 第一次数学危机
- 23J916-1:住宅排气道(一)
评论
0/150
提交评论