汇聚文库

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 80|回复: 0

keil Mdk 优化等级详细说明-及-如何设置某段代码不优化

[复制链接]

42

主题

43

帖子

178

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
178
发表于 2020-12-18 13:55:34 | 显示全部楼层 |阅读模式
Keil默认会对代码进行优化的
4555.png
一般情况缺省编译优化设置被设定为8级优化,实际最高可bai设定为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

        0级优化:

         、常数折叠:只要有可能,编译器就执行将表达式化为常数数字的计算,其中包括运行地址的计算。

         、简单访问优化:对8051系统的内部数据和位地址进行访问优化。

         、跳转优化:编译器总是将跳转延至最终目标上,因此跳转到跳转之间的命令被删除。

        1级优化:

        、死码消除:无用的代码段被消除。

        、跳转否决:根据一个测试回溯,条件跳转被仔细检查,以决定是否能够简化或删除。

        2级优化:

       、数据覆盖:适于静态覆盖的数据和位段被鉴别并标记出来。连接定位器BL51通过对全局数据流的分析,选择可静态覆盖的段。

        3级优化:

       、“窥孔”优化:将冗余的MOV命令去掉,包括不必要的从存储器装入对象及装入常数的操作。另外如果能节省存储空间或者程序执行时间,复杂操作将由简单操作所代替。

        4级优化:

         、寄存器变量:使自动变量和函数参数尽可能位于工作寄存器中,只要有可能,将不为这些变量保留数据存储器空间。

         、扩展访问优化:来自IDATA、XDATA、PDATA和CODE区域的变量直接包含在操作之中,因此大多数时候没有必要将其装入中间寄存器。

         、局部公共子式消除:如果表达式中有一个重复执行的计算,第一次计算的结果被保存,只要有可能,将被用作后续的计算,因此可从代码中消除繁杂的计算。

         、CASE/SWITCH语句优化:将CASE/SWITCH语句作为跳转表或跳转串优化。

        5级优化:

          、全局公共子式消除:只要有可能,函数内部相同的子表达式只计算一次。中间结果存入一个寄存器以代替新的计算。

          、简单循环优化:以常量占据一段内存的循环再运行时被优化。

        6级优化:

          、回路循环:如果程序代码能更快更有效地执行,程序回路将进行循环。

        7级优化:

           、扩展入口优化:在适合时对寄存器变量使用DPTR数据指针,指针和数组访问被优化以减小程序代码和提高执行速度。

        8级优化:

          、公共尾部合并:对同一个函数有多处调用时,一些设置代码可被重复使用,从而减小程序代码长度。

        9级优化:

          、公共子程序块:检测重复使用的指令序列,并将它们转换为子程序。C51甚至会重新安排代码以获得更多的重复使用指令序列。

         当然,优化级别并非越高越好,应该根据具体要求适当选择。




优化等级0
Minimum optimization. Turns off most optimizations.It gives the best possible debug view and the lowest level of optimization.
近乎不优化,用于调试代码。出现代码行不能设置断点可如此设置试试。
特点:最少的优化,可以最大程度上配合产生代码调试信息,可以在任何代码行打断点,特别是死代码处。
优化等级1
Restrictedoptimization. Removes unused inline functions and unused static functions.Turns off optimizations that seriously degrade the debug view. Ifused with --debug, this option gives a satisfactorydebug view with good code density.
部分优化。移除未调用的内联函数和静态函数,关闭debug窗口优化,此状态也能用于调试
特点:有限的优化,去除无用的inline和无用的static函数、死代码消除等,在影响到调试信息的地方均不进行优化。在适当的代码体积和充分的调试之间平衡,代码编写阶段最常用的优化等级。
优化等级2
Highoptimization. If used with --debug, the debug viewmight be less satisfactory because the mapping of object code tosource code is not always clear.This is the default optimization level.
默认优化等级。如果处于debug状态,部分代码行将不能被调试,具体做了什么优化好像没说
特点:高度优化,调试信息不友好,有可能会修改代码和函数调用执行流程,自动对函数进行内联等。

优化等级3
Maximumoptimization. -O3 performs the same optimizationsas -O2 however the balance between space and timeoptimizations in the generated code is more heavily weighted towardsspace or time compared with -O2.
等级3和等级2除了执行相同的优化,还有在空间和时间之间的平衡优化在生成的代码中比等级2更重的空间或时间。
特点:最大程度优化,产生极少量的调试信息。会进行更多代码优化,例如循环展开,更激进的函数内联等。
另外,可以通过单独设置 --loop_optimization_level=option 来控制循环展开的优化等级。





如何设定不优化或改变某个文件的优化设置
1、针对某个文件
(1) 右键->Option for File XXXX

(2) 切换到【C51】选项卡
default表示与工程设置一致

2、针对某段代码(局部优化)
#pragma OPTIMIZE(x) x就是你希望的优化级别
举例如下:
#pragma OPTIMIZE(6)
void FunA()
{
}
......
......
#pragma OPTIMIZE(9)
void FunB()
{
}
上面的意思就是说,在void FunA()到void FunB()之前的所有函数,包括FunA在内,都采用6级的优化,而从FunB开始直到之后,只要没碰上#pragma OPTIMIZE,都采用9级优化了。
OPTIMIZE还可以多一个参数,就是speed和size,
用法: #pragma OPTIMIZE(9,speed)或#pragma OPTIMIZE(5,size)
对应的就是9级优化,以速度为主,或5级优化,以空间最小为主。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|汇聚文库

GMT+8, 2021-1-28 12:41 , Processed in 0.105000 second(s), 23 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表