独闷闷网

 找回密码
 立即注册
搜索
查看: 2860|回复: 1
收起左侧

[资料] Keil uVision2 压缩编译后的程序大小

[复制链接]
发表于 2014-10-6 01:01:27 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
通过简单的设置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甚至重排代码以得到更大的循环序列。

乐于分享,勇于质疑!
发表于 2014-10-6 06:52:03 | 显示全部楼层
太好了。非常感谢楼主的整理。
乐于分享,勇于质疑!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|独闷闷网 ( 粤ICP备12007667号-2 )

GMT+8, 2021-4-22 11:14 , Processed in 0.159029 second(s), 17 queries .

快速回复 返回顶部 返回列表