• Keil C减小代码编译量大小的方法(gai)


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

      

  • 相关阅读:
    Spring AOP应用场景你还不知道?这篇一定要看!
    解决 Failed to start LSB: Bring up/down networking 问题
    查出undefined symbol项命令
    将当前目录加入库环境变量
    Fortran代码生成so库
    Java调用Fortran生成so库报“libifport.so.5: 无法打开共享对象文件”错误解决方法
    HBase过滤器(转载)
    HBase设计规范(转载)
    spark(2.1.0) 操作hbase(1.0.2)
    zookeeper搭建
  • 原文地址:https://www.cnblogs.com/fx427103/p/4010434.html
Copyright © 2020-2023  润新知