其中

0级(Constan folding)的优化包括:

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

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

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

特点:最少的优化,可以最大程度上配合产生代码调试信息,可以在任何代码行打断点,特别是死代码处。

1级(Dead code elimination)的优化包括:

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

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

特点:有限的优化,去除无用的inline和无用的static函数、死代码消除等,在影响到调试信息的地方均不进行优化。在适当的代码体积和充分的调试之间平衡,代码编写阶段最常用的优化等级。

2级(Data overlaying)的优化包括:

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

特点:高度优化,调试信息不友好,有可能会修改代码和函数调用执行流程,自动对函数进行内联等。

3级(Peephole optimization)的优化包括:

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

特点:最大程度优化,产生极少量的调试信息。会进行更多代码优化,例如循环展开,更激进的函数内联等。

另外,可以通过单独设置 --loop_optimization_level=option 来控制循环展开的优化等级。

4级(Register variables)的优化包括:

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

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

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

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

5级(Common subexpression elimination)的优化包括:

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

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

6级(Loop rotation)的优化包括:

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

7级(Extended Index Access optimizing)的优化包括:

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

8级(Reuse Common Entry Code)的优化包括:

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

9级(Common Block Subroutines)的优化包括:

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

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

在debug时尽量保证优化等级在0,在出货时尽量保证等级在1,既不会出现问题,生成的代码也小。
尽量不要用最高优先级。

keil优化等级说明 keil code optimization的更多相关文章

  1. keil优化等级设置

    附表:Keil C51中的优化级别及优化作用 级别说明 0 常数合并:编译器预先计算结果,尽可能用常数代替表达式.包括运行地址计算. 优化简单访问:编译器优化访问8051系统的内部数据和位地址. 跳转 ...

  2. keil优化论

    谈到优化,其实很多人都哭笑不得,因为在一个C51软件工程师的生涯中,总要被KEIL的优化耍那么一次到几次.我被耍过,想必看着文章的你也被耍过,如果你回答说不,那只能说你写的C51程序不多! 看看KEI ...

  3. KEIL5中C/C++优化等级问题

    知乎上有篇详解   https://zhuanlan.zhihu.com/p/24402180 强烈推荐 C/C++的优化等级会对程序产生 不定性的影响,至于选择哪种优化等级必须从 现有的程序分析才行 ...

  4. 股票投资组合-前进优化方法(Walk forward optimization)

    code{white-space: pre;} pre:not([class]) { background-color: white; }if (window.hljs && docu ...

  5. 痞子衡嵌入式:MCUXpresso IDE下设置代码编译优化等级的几种方法

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是MCUXpresso IDE下设置代码编译优化等级的几种方法. 最近公司芯片设计团队正在开发一款全新的基于 Cortex-M33 内核的 ...

  6. 从Keil 4升级到Keil 5的工程,想返回来用Keil 4打开

    情景描述: 笔者电脑程序Keil 4升级到Keil 5,相应地,原来项目上的工程也在第一次用Keil 5打开的时候进行了升级.之后,由于客户需要开发资料,其版本为Keil 4,我尝试着用Keil 4打 ...

  7. Code optimization and organization in Javascript / jQuery

    This article is a combined effort of Innofied Javascript developers Puja Deora and Subhajit Ghosh) W ...

  8. CC2541工程优化等级的问题

    1. 调试工程的时候发现,优化等级稍微调高一级,就容易出问题,只能用None,其他等级会出现数据丢失的现象.

  9. Keil共存的方法 - Keil MDK兼容Keil C51,实操可行

    记录一下成功使Keil MDK和Keil C51共存的过程! 之前一直用Keil C51开发,最近需要用到ARM9内核的IC,就需要Keil C51和Keil MDK共存.看了一下网上几个教程,方法大 ...

  10. C51 Keil 优化

    对程序进行优化,通常是指优化程序代码或程序执行速度.优化代码和优化速度实际上是一个予盾的统一,一般是优化了代码的尺寸,就会带来执行时间的增加,如果优化了程序的执行速度,通常会带来代码增加的副作用,很难 ...

随机推荐

  1. 下列哪个选项是对MTU的正确计算方式?

    A.   IP数据包头部 + TCP数据报头部 + 数据 B.   MAC头 + IP头 + TCP头 + 数据 C.   MAC头 + IP头 + TCP头 + 数据 + FCS D.   前同步码 ...

  2. 鸿蒙UI开发快速入门 —— part10: PersistentStorage与Environment

    1.前言 我们在鸿蒙UI开发快速入门 -- part09: 应用级状态管理LocalStorage & AppStorage中已经学习了LocalStorage与AppStorage,但他们都 ...

  3. openEuler-怎么看服务器操作系统是不是欧拉系统?

    ​[root@localhost ~]# cat /etc/os-release NAME="openEuler" VERSION="22.03 (LTS-SP2)&qu ...

  4. 使用OpenSSL创建生成CA证书、服务器、客户端证书及密钥

    说明: 对于SSL单向认证:服务器需要CA证书.server证书.server私钥,客户端需要CA证. 对于SSL双向认证:服务器需要CA证书.server证书.server私钥,客户端需要CA证书, ...

  5. Spring boot 配置文件位置

    Spring boot 的Application.properties 配置文件可以是以下几个地方:classpath:/,classpath:/config/,file:./,file:./conf ...

  6. Qt/C++离线地图的加载和交互/可以离线使用/百度和天地图离线/支持手机上运行

    一.前言说明 在地图应用中,有很多时候是需要断网环境中离线使用的,一般会采用两种做法,一种是只下载好离线瓦片地图,然后根据不同的缩放和经纬度坐标绘制瓦片.这种方式优点是任何地图都支持,只需要拿到瓦片即 ...

  7. C#HTTP网络请求时GetResponseAsync()方法抛出“远程服务器返回错误: (411) 所需的长度”异常

    在请求HttpWebRequest的报了如下的错误"远程服务器返回错误: (411) 所需的长度",结果网上 百度了一下说,再请求POST的时候,若没有参数的情况下,需要将进行如下 ...

  8. python SQLAlchemy ORM——从零开始学习03 如何针对数据库信息进行排序

    03 如何进行排序 3-1准备工作: 因为要排序,所以需要随机多谢数据,model见后文.也需要random进行随机 from model import User, Engine from sqlal ...

  9. Linux 运维必备 150 个命令汇总

    地址:https://www.linuxcool.com 线上查询及帮助命令 man:全拼manual,用来查看系统中自带的各种参考手册. help:用于显示shell内部命令的帮助信息. 文件和目录 ...

  10. SpringBoot 集成腾讯云(对象存储、短信)

    https://developer.aliyun.com/article/831473 https://blog.csdn.net/weixin_45626288/article/details/11 ...