keil-C减小代码编译大小的方法整理

方法一:(通过优化代码减小)

1.1少做乘除运算,使用左/右移位来实现乘除

Eg ,普通:a = 0x80*4;

优化:a = 0x80<<2;

1.2在不影响运算条件下,使用短类型代替长类型

Eg ,普通: int a;

优化: char a;

1.3尽量使用无符号类型数据

Eg ,普通:char a = 56;

优化:unsigned char a = 56;

1.4回避使用浮点类型数据做乘除运算,这样代码量很大

Eg ,普通:float a = 5.3*2.5;

优化:回避使用;

1.5同一种类似操作放在一起

Eg ,普通:同一类操作多次重复书写

优化:将它们定义一个子函数,每次使用时调用

1.6使用先定义后赋值的方法比在赋值时定义更省代码量

Eg ,普通:int a = 70;

优化:int a ;

          a = 70;

1.7使用自减优于自加,比如在做延时的时候

Eg ,普通:  void dely()

                     {

                            char a ;

                            for(a = 0; a < 70; a++);

}

优化: void dely()

                     {

                            char a ;

                            for(a = 70; a > 0; a--);

}

 
 

1.8全局变量定义放在main()外面,初始值放在main()里面

Eg ,普通:int a = 8;

                Main()

{

}

 
 

优化:    int a;

                Main()

{

   a =8;

}

 
 

方法二:(通过keil-C软件设置优化压缩级别)

 
 

步骤:点击 "Options for Target ***" -> 选择C51栏 -> 设置Code Optimization 下Level的级别

下面是对应级别编译器对应做的处理:

0 常数合并:编译器预先计算结果,尽可能用常数代替表达式。包括运行地址计算。 优化简单访问:编译器优化访问8051系统的内部数据和位地址。 跳转优化:编译器总是扩展跳转到最终目标,多级跳转指令被删除。

1     死代码删除:没用的代码段被删除。  拒绝跳转:严密的检查条件跳转,以确定是否可以倒置测试逻辑来改进或删除。

2     数据覆盖:适合静态覆盖的数据和位段被确定,并内部标识。BL51连接/定位器可以通过全局数据流分析,选择可被覆盖的段。

3      窥孔优化:清除多余的MOV指令。这包括不必要的从存储区加载和常数加载操作。当存储空间或执行时间可节省时,用简单操作代替复杂操作。

4      寄存器变量:如有可能,自动变量和函数参数分配到寄存器上。为这些变量保留的存储区就省略了。  优化扩展访问:IDATA、XDATA、PDATA和CODE的变量直接包含在操作中。在多数时间没必要使用中间寄存器。 局部公共子表达式删除:如果用一个表达式重复进行相同的计算,则保存第一次计算结果,后面有可能就用这结果。多余的计算就被删除。  Case/Switch优化:包含SWITCH和CASE的代码优化为跳转表或跳转队列。 

5      全局公共子表达式删除:一个函数内相同的子表达式有可能就只计算一次。中间结果保存在寄存器中,在一个新的计算中使用。  简单循环优化:用一个常数填充存储区的循环程序被修改和优化。

6      循环优化:如果结果程序代码更快和有效则程序对循环进行优化。 

7      扩展索引访问优化:适当时对寄存器变量用DPTR。对指针和数组访问进行执行速度和代码大小优化。

8     公共尾部合并:当一个函数有多个调用,一些设置代码可以复用,因此减少程序大小。 

9       公共块子程序:检测循环指令序列,并转换成子程序。Cx51甚至重排代码以得到更大的循环序列。

  

Keil C减小代码编译量大小的方法(gai)的更多相关文章

  1. 如果设置Keil从C代码编译出来的hex文件地址从0x8000开始

    和MON51的设置一样,这样作:1.把Startup.a51拷贝到工程目录加入工程,修改125行的      CSEG    AT      0  为   CSEG    AT      0X8000 ...

  2. KEIL MDK 查看代码量、RAM使用情况--RO-data、RW-data、ZI-data的解释(转)

    源:KEIL MDK 查看代码量.RAM使用情况--RO-data.RW-data.ZI-data的解释 KEIL RVMDK编译后的信息 Program Size: Code=86496 RO-da ...

  3. php代码编译的实现

    1.php是解析型的高级语言,zend内核使用c语言实现,有main函数,php脚本就是输入,内核处理后输出结果,内核将php脚本翻译成c程序可识别的opcode就是php的编译. c语言的编译将c代 ...

  4. Java 代码编译和执行的整个过程

    Java 代码编译是由 Java 源码编译器来完成,流程图如下所示: Java 字节码的执行是由 JVM 执行引擎来完成,流程图如下所示: Java 代码编译和执行的整个过程包含了以下三个重要的机制: ...

  5. JVM学习笔记(二)------Java代码编译和执行的整个过程【转】

    转自:http://blog.csdn.net/cutesource/article/details/5904542 版权声明:本文为博主原创文章,未经博主允许不得转载. Java代码编译是由Java ...

  6. JVM学习笔记(二)------Java代码编译和执行的整个过程

    Java代码编译是由Java源码编译器来完成,流程图如下所示: Java字节码的执行是由JVM执行引擎来完成,流程图如下所示: Java代码编译和执行的整个过程包含了以下三个重要的机制: Java源码 ...

  7. Java代码编译和执行的整个过程

    Java代码编译是由Java源码编译器来完成,流程图如下所示: Java字节码的执行是由JVM执行引擎来完成,流程图如下所示: Java代码编译和执行的整个过程包含了以下三个重要的机制: Java源码 ...

  8. JVM原理(Java代码编译和执行的整个过程+JVM内存管理及垃圾回收机制)

    转载注明出处: http://blog.csdn.net/cutesource/article/details/5904501 JVM工作原理和特点主要是指操作系统装入JVM是通过jdk中Java.e ...

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

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

随机推荐

  1. C++ Primer 5th 第4章 表达式

    表达式是运算对象及运算符组成的式子,表达式求值将得到一个结果,单独的变量或者字面值也算表达式,结果是其本身. 运算符分为:一元运算符.二元运算符.三元运算符.一元即一个作用对象,二元两个作用对象,以此 ...

  2. 乱七八糟 Nodejs 系列一:试水

    看Nodejs比较舒服的人,个人认为主要是: 以前是后端,转成前端的人: 前端巨牛的人: 后端巨牛的人: 巨牛的人... 当然还有我这种,脑抽不止的人~~ 不过学习的过程中发现,如果不是上来就用exp ...

  3. javascript学习教程之---如何从一个tab切换到banner幻灯片的转换

    一个简单的tab切换代码: <!doctype html> <html> <head> <meta charset="utf-8"> ...

  4. [转]NopCommerce MVC 插件机制分析

    原文地址:http://www.cnblogs.com/haoxinyue/archive/2013/06/06/3105541.html 基本原理 插件话的应用程序一般都是先定义插件接口,然后把插件 ...

  5. PyQt4环境搭建与使用

    初次使用python写图形界面的工具时,用了Tkinter.wxpython,都是需要手写界面布局的,看api看的头疼觉得这样写太费劲了,于是搜了下看看别人都是怎样写python图形界面的. 在论坛上 ...

  6. BZOJ 2115: [Wc2011] Xor

    2115: [Wc2011] Xor Time Limit: 10 Sec  Memory Limit: 259 MB Submit: 2794  Solved: 1184 [Submit][Stat ...

  7. 网站卡死,照惯例运行.bat批量处理文件进行重启不起作用

    网站卡死,照惯例运行.bat批量处理文件进行重启不起作用,进入虚拟机控制台进行虚拟机重启仍然不起作用,通过ping分析物理服务器能ping通,各个虚拟机之前也能ping通,但是不能ping通外部,分析 ...

  8. Effective Java Item4:Enforce noninstantiability with a private constructor

    Item4:Enforce noninstantiability with a private constructor 通过构造私有化,禁止对象被实例化. public class UtilClass ...

  9. Codeforces 527D Clique Problem

    http://codeforces.com/problemset/problem/527/D 题意:给出一些点的xi和wi,当|xi−xj|≥wi+wj的时候,两点间存在一条边,找出一个最大的集合,集 ...

  10. (转)PHP zval内存回收机制和refcount_gc和is_ref_gc

    出处 : http://blog.sina.com.cn/s/blog_75a2f94f0101gygh.html 对于PHP这种需要同时处理多个请求的程序来说,申请和释放内存的时候应该慎之又慎,一不 ...