Keil C减小代码编译量大小的方法

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甚至重排代码以得到更大的循环序列。

时间: 2024-10-26 08:28:53

Keil C减小代码编译量大小的方法的相关文章

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-data=9064 RW-data=1452 ZI-data=16116 Code是代码占用的空间; RO-data是 Read Only 只读常量的大小,如const型; RW-data是(Read Write) 初始化了的可读写变量的大小; ZI-data是(Zero Initialize) 没有初

减小App包的大小

检查.ipa文件 首先获得app的ipa文件. 将ipa文件的后缀改为.zip,解压得到包内容. 查看资源文件哪个最大.然后试着对最大的文件就行处理 图片 尽量使用8-bit图片 使用8-bit的PNG图片,比32-bit的图片能减少4倍的压缩率.由于8-bit的图片支持最多256种不同的颜色,所以8-bit的图片一般只应该用于一小部分的颜色图片.例如灰度图片最好使用8-bit. 针对32-bit的图片尽量使用高压缩的比率 利用Adobe Photoshop的Save For Web可以减小JP

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

Java代码编译是由Java源码编译器来完成,流程图如下所示: Java字节码的执行是由JVM执行引擎来完成,流程图如下所示: Java代码编译和执行的整个过程包含了以下三个重要的机制: Java源码编译机制 类加载机制 类执行机制 Java源码编译机制 Java 源码编译由以下三个过程组成: 分析和输入到符号表 注解处理 语义分析和生成class文件 流程图如下所示: 最后生成的class文件由以下部分组成: 结构信息.包括class文件格式版本号及各部分的数量与大小的信息 元数据.对应于Ja

Ceph,Red Hat在代码贡量献上一骑绝尘的开源项目

前言: 笔者在之前的<从PowerVM,KVM到Docker:存储池的配置与调优-第一篇>中,分享了PowerVM下存储池的配置和调优的方法.在X86虚拟化和云时代,Ceph具有天生的优势,因此本文着重介绍Ceph的原理和架构.同时,本文也作为<从PowerVM,KVM到Docker:存储池的配置与调优-第二篇>而存在. Ceph的前世 2014年,红帽收购Inktank(Inktank主要提供基于Ceph的企业级产品),此次收购后,红帽成为最大的开源存储产品提供商,包括对象存储.

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

转自:http://blog.csdn.net/cutesource/article/details/5904542 版权声明:本文为博主原创文章,未经博主允许不得转载. Java代码编译是由Java源码编译器来完成,流程图如下所示: Java字节码的执行是由JVM执行引擎来完成,流程图如下所示: Java代码编译和执行的整个过程包含了以下三个重要的机制: Java源码编译机制 类加载机制 类执行机制 Java源码编译机制 Java 源码编译由以下三个过程组成: 分析和输入到符号表 注解处理 语

joomla代码编译入门(创世纪新篇0

            采用版本Joomla1.5. 第一步,在administrator/components/下建立com_reviews文件夹,然后创建toolbar.reviews.html.php 代码如下: <?php defined('_JEXEC' )or die('Restricted access' ); class TOOLBAR_reviews{ function _NEW(){ JToolBarHelper::save(); JToolBarHelper::apply(

如何把iOS代码编译为Android应用

新闻 <iPhone 6/6 Plus中国销量曝光:单月销量650万>:据iSuppli Corp.中国研究总监王阳爆料,iPhone 6和iPhone 6 Plus在国内受欢迎的情况大大超过预期,苹果在中国的单月销量在11月超过了650万台,全年在中国的销量将超过4000万台. 教程 < Date parsing performance on iOS>:文章介绍了一个关于格式化时间的”黑科技“,作者使用 sqlite 替换 NSDateFormatter,提高了16倍的转换效率.

Linux - Unix环境高级编程(第三版) 代码编译

Unix环境高级编程(第三版) 代码编译 本文地址:http://blog.csdn.net/caroline_wendy 时间:2014.10.2 1. 下载代码:http://www.apuebook.com/code3e.html 2. 安装依赖库:sudo apt-get install libbsd-dev  3. 进入下载目录make 4. 复制头文件和动态链接库 sudo cp ./include/apue.h /usr/include/ sudo cp ./lib/libapue

利用Roslyn把C#代码编译到内存中并进行执行

Tugberk Ugurlu在其博文<Compiling C# Code Into Memory and Executing It with Roslyn>中给大家介绍了一种使用.NET下一代编译器(或称编译服务)--Roslyn的小技巧.即把C#代码编译到内存中(而非保存到文件中),并执行这些代码. 简单说来,就是先安装Microsoft.CodeAnalysis.CSharp这个Nuget包,然后在代码中调用Roslyn的API,然后把代码编译输出到一个MemoryStream中,再从内存