问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

keil c51优化等级介绍

发布网友 发布时间:2022-04-24 12:43

我来回答

3个回答

热心网友 时间:2023-10-13 05:04

一般用优化等级8,其它的别用,容易出事。
编译完之后多留意data,xdata,看有没超出芯片的最大值,
特别是data,不能超过128,甚至太接近128有时也会出问题。
如果data 需要使用到256,则另外的128用idata定义

热心网友 时间:2023-10-13 05:05

用C语言的话把KEIL的优化等级调到9级,默认是8级,最好是编写和调试同步进行,这样确保程序的可*性吧,对后续代码维护有很大的帮助。

关于swith和指针语句,可以去看KEIL的英文版帮助,或者51bbs发布的KEIL中文帮助手册,比较全面的,理解了帮助文件后,再从KEIL中对C程序看相应的汇编代码,加深理解。

比较通用的办法,就是用不同的C语句实现相同的功能,再通过汇编窗口观察生成的汇编代码做对比,找到最少量的汇编代码生成方式,以后再用C写程序的时候就按你找到的这个方式写。

热心网友 时间:2023-10-13 05:05

Keil的代码优化产生的问题\
阅 读了《单片机与嵌入式系统应用》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 MAXl97_at_Ox8000;
也可以在程序中包含系统头文件:“#incIude”,然后在程序中修改变量,定义为直接地址:
#defme MAXl97 XBYTE[Ox8000]
这样,。Keil C51的设置仍然可以保留高级优化,且编译结果中,同样两次读取并不会被优化跳过。
2.3 硬件解决方法
原文中将MAXl97的数据直接连接到数据总线,而对地址总线并未使用,采用一根端口线选择操作高低字节。很简单的修改方法就是使用一根地址线选择操作高 低字节即可。比如:将P2.0(A8)连接到原来P1.O连接的HBEN脚(MAXl97的5脚),在程序中分别定义高低字节的操作地址:
unsigned char volatile xdata MAXl97_L_aI_Ox8000;
unsigned char volatile xdata MAXl97 H at 0.x8100;
将原来的程序:
MAXHBEN=O; //读取低8位
down8=MAXl97:
MAXHBEN=1; //读取高4位
up4=MAXl97:
改为以下两句即可:
down8=MAXl97_L; //读取低8位
up4=MAXl97_H; //读取高4位
3 小结
Keil C51经过长期考验和改进以及大量开发人员的实际使用,已经克服了绝大多数的问题,并且其编译效率也非常高。对于一般的使用,很难再发现什么问题。笔者曾 经粗略研究过一下Keil C51优化编译的结果,非常佩服Keil C51设计者的智慧,一些C程序编译产生的汇编代码,甚至比一般程序员直接用汇编编写的代码还要优秀和简练。通过研读KeilC51编译产生的汇编代码, 对提高汇编语言编写程序的水平都是很有帮助的。
由本文中的问题可以看出:在设计中遇到问题时,一定不要被表面现象蒙蔽,不要急于解决。应该认真分析,找出问题的原因,这样才能从根本上彻底解决问题。上不会出现不必要的干扰,防止了数据不一致的发生。

附表:Keil C51中的优化级别及优化作用
级别说明
0常数合并:编译器预先计算结果,尽可能用常数代替表达式。包括运行地址计算。
优化简单访问:编译器优化访问8051系统的内部数据和位地址。
跳转优化:编译器总是扩展跳转到最终目标,多级跳转指令被删除。
1死代码删除:没用的代码段被删除。
拒绝跳转:严密的检查条件跳转,以确定是否可以倒置测试逻辑来改进或删除。
2数据覆盖:适合静态覆盖的数据和位段被确定,并内部标识。BL51连接/定位器可以通过全局数据流分析,选择可被覆盖的段。
3窥孔优化:清除多余的MOV指令。这包括不必要的从存储区加载和常数加载操作。当存储空间或执行时间可节省时,用简单操作代替复杂操作。
4寄存器变量:如有可能,自动变量和函数参数分配到寄存器上。为这些变量保留的存储区就省略了。
优化扩展访问:IDATA、XDATA、PDATA和CODE的变量直接包含在操作中。在多数时间没必要使用中间寄存器。
局部公共子表达式删除:如果用一个表达式重复进行相同的计算,则保存第一次计算结果,后面有可能就用这结果。多余的计算就被删除。
Case/Switch优化:包含SWITCH和CASE的代码优化为跳转表或跳转队列。
5全局公共子表达式删除:一个函数内相同的子表达式有可能就只计算一次。中间结果保存在寄存器中,在一个新的计算中使用。
简单循环优化:用一个常数填充存储区的循环程序被修改和优化。
6循环优化:如果结果程序代码更快和有效则程序对循环进行优化。
7扩展索引访问优化:适当时对寄存器变量用DPTR。对指针和数组访问进行执行速度和代码大小优化。
8公共尾部合并:当一个函数有多个调用,一些设置代码可以复用,因此减少程序大小。
9公共块子程序:检测循环指令序列,并转换成子程序。Cx51甚至重排代码以得到更大的循环序列。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
LG棒棒糖GD580这么看书 lg gd580怎么用moto看小说 各种海鲜馅饺子大全 海鲜水饺都有什么馅儿的 用网上交易系统进行股票操作资金安全吗,我是在中信建投开的户 北京瀚正化妆学校包就业吗 通江车检在哪里,可以摩托车年审不? 摩托车年审在通江县哪里啊 我是四川省通江县人、我是摩托车驾驶证,以快到期,请问我在江苏无锡... 通江县哪里可以托运摩托车 keil 处理浮点数问题。 如何保证全部变量不被优化 keil 为什么keil 不加volatile也没问题 怎样在手机里的word 二手房使用公积金贷款最低首付比例是多少? 二手房首付比例是多少? 安卓手机里的word文档在哪个文件夹 二手房按揭贷款首付多少? 二手房的贷款首付一般需要多少 买二手房首付怎么算,比如买55万的房子,首付多少,税费一共要交多少?可以贷款多少? 二手房一般最低首付多少? 目前想买二手房,按揭贷款的话首付最低要付多少? 如何用柚子皮除臭? 柚子皮有什么作用?可以用来除臭吗? 梦见自己把车开到井口上面过不去了大家帮忙才倒出来! 梦到把自己的车开上绝路然后外力导致车开不下来 梦见自己把车停在乡村路中间挡着别人的车什么意思? 梦见我把车开到田里了什么意思? 梦见把车停在坟地里 梦见自己把车开走停不下来了,总能幸运不撞到人,最后花点小钱求助别人帮忙开回来的? keil中pdata是关键字吗 我要在keil中头文件声明和C文件定义头文件中的变量,可是我在头文件中声明后再到C文件中定义的时候 Keil uVision5为何编译时,不产生“变量在使用前未赋初值(is used before its value is set)”的警告? volatile到底有没有用? keil uvision4 用c语言编译没有错误,但是个别语句被忽略了没有编译成汇编语言。怎么回事啊? keil软件里面c语言包含哪些头文件?做什么用的?尽量多列举点 keil奇怪问题 keil C code区 数组定义问题 keil c51中如何在中断中改变全局变量的值? Keil C51下如何让编译器优先使用片内RAM keil主函数循环体可以单步调试吗?比如: keil里面为什么if条件满足了,但里面有一调语句执行不了? c语言*(volatile unsigned char xdata *) 0x2f5f,这个表示方法是什么意思? 单片机keil编程-流水灯-的问题 keil+proteus仿真arm,keil设置导致串口乱码问题 小米手机锁了怎么恢复出厂设置 小米手机忘记了锁屏密码怎样恢复出厂设置? 我的小米手机恢复出厂设置后就设备锁锁住了。小米帐号密码也忘记了。 小米手机设备锁锁了恢复出厂设置设备还是锁着吗? 我的苹果手机打电话听筒里面怎么有杂音?