Keil uVision2 压缩编译后的程序大小
通过简单的设置Keil uVision2 可以将目标程序的大小进行最大限度的压缩,通常情况下可以把 目标文件例如 bin文件压缩10K左右。
第1步 打开工程属性,鼠标右键点击Target1,选择 “Options for Target 'Target 1'”
第2步 选中C51选项卡
在Code Optimization组中,选择 Level,把级别选中9,第9级“Common Block Subroutines”
点击确定后,重新编译你的程序,你会发现程序的目标文件已经大大的减小。
下面给出几个实验数据供参考:
(1) 选择Level 0:Constant folding 时的编译结果
(2)选择Level 5:Common subexpression elimination时的编译结果
(3)选择Level 9 :Common Block Subroutines时的编译结果
从以上数据我们可以发现,不同的级别,Keil的优化方式是不一样的。
Progarm Size: data=62.1 xdata=901 code=26046
Progarm Size: data=57.1 xdata=780 code=16352
Progarm Size: data=57.1 xdata=780 code=12997
随着优化级别的深入,Keil的编译速度也会变的越来越慢。如果某些时候你的程序太大无法下载进入单片机时,你不妨试试这个方法。
附表: Keil C51中的优化级别及优化作用
第0级
常数合并:编译器预先计算结果,尽可能用常数代替表达式。包括运行地址计算。
第1级
死代码删除:没用的代码段被删除。
第2级
数据覆盖:适合静态覆盖的数据和位段被确定,并内部标识。BL51连接/定位器可以通过全局数据流分析,选择可被覆盖的段。
第3级
窥孔优化:清除多余的MOV指令。这包括不必要的从存储区加载和常数加载操作。当存储空间或执行时间可节省时,用简单操作代替复杂操作。
第4级
寄存器变量:如有可能,自动变量和函数参数分配到寄存器上。为这些变量保留的存储区就省略了。
优化扩展访问:IDATA、XDATA、PDATA和CODE的变量直接包含在操作中。在多数时间没必要使用中间寄存器。
局部公共子表达式删除:如果用一个表达式重复进行相同的计算,则保存第一次计算结果,后面有可能就用这结果。多余的计算就被删除。
Case/Switch优化:包含SWITCH和CASE的代码优化为跳转表或跳转队列。
第5级
全局公共子表达式删除:一个函数内相同的子表达式有可能就只计算一次。中间结果保存在寄存器中,在一个新的计算中使用。
第6级
循环优化:如果结果程序代码更快和有效则程序对循环进行优化。
第7级
扩展索引访问优化:适当时对寄存器变量用DPTR。对指针和数组访问进行执行速度和代码大小优化。
第8级
公共尾部合并:当一个函数有多个调用,一些设置代码可以复用,因此减少程序大小。
第9级
公共块子程序:检测循环指令序列,并转换成子程序。Cx51甚至重排代码以得到更大的循环序列。
用微信扫描二维码
为博主 打个赏
金额随意 快来“打”我呀 要买枸杞当归补补~~
不过当你选择了相应的优化级别后,有可能会导致你的程序无法再单片机上准确运行。(因此要注意)
更多推荐
所有评论(0)