注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

碧空雄鹰的博客

人和人相遇,靠的是一种缘;人和人相处,靠的是一份诚;人和人相爱,靠的是一份真

 
 
 

日志

 
 
关于我

人生有三样东西是无法隐瞒的:咳嗽、贫穷和爱,你想隐瞒,却欲盖弥彰。 人生有三样东西是不该挥霍的:身体、金钱和爱,你想挥霍,却得不偿失。 人生有三样东西是无法挽留的:生命、时间和爱,你想挽留,却渐行渐远。 人生五靠: 命运不是靠时间,而是靠勤奋,时间不是靠虚度,而是靠使用,感情不是靠缘分,而是靠珍惜,金钱不是靠使用,而是靠投资,事业不是靠满足,而是靠踏实。 人生三大遗憾 : 不会选择,不坚持选择,不断地选择。

网易考拉推荐

Keil ARM 编译的代码大小问题  

2013-05-07 16:38:22|  分类: KEIL |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

Keil ARM 编译的代码大小问题

最近,惊奇的发现对于一个ARM工程,使用Keil编译。连续编译几次,居然编译出的代码大小不一样。这是怎么回事呢?

首先,在targetoption选项中的output选项页勾选“Create Batch File”,产生一个用于编译的批处理。

里面首先是设置环境变量,然后就是一行行的编译语句:

...........

"C:\Keil\ARM\BIN40\ArmCC" --Via ".\thc80f08d\opt\main.__i"

.........

打开这个__i文件

--feedback ".\THC80F08D\opt\JC.fed" --thumb -c --cpu ARM7TDMI -O3 --apcs=interwork --asm --interleave -I..\..\SRC\HAL\include -I..\..\SRC\JCAPI\include -I..\..\SRC\JCAPI\JNI -I..\..\SRC\JCSYS\SYSMM\include -I..\..\SRC\JCSYS\SYSCM\include -I..\..\SRC\JCSYS\SYSAM\include -I..\..\SRC\JCVM\include -I..\..\SRC\SYS\include -I..\..\SRC\HAL\THC80F08D\include -I..\..\SRC\JCSYS\SYSTF\include -I..\..\SRC\JCSYS\SYSGP\include -I..\..\SRC\JCSYS\SYSRM\include -I "C:\Keil\ARM\INC" -I "C:\Keil\ARM\INC\Atmel" -D__CHIP_ARM__ -D__SCP_02_SUPPORT__ -D__THC80F08D__ -o ".\THC80F08D\opt\main.o" --depend ".\THC80F08D\opt\main.d" "..\..\SRC\SYS\main.c"

可以看到就是ArmCC的命令参数。突然发现有个参数俺不太熟悉哦,--feedback是干嘛的?

打开Keil的帮助文档,找到这么一段:

--feedback=filename

RealView Compilation Tools for ?Vision Compiler Reference Guide

Version 4.0

Home > Compiler Command-line Options > Command-line options > --feedback=filename

2.1.53--feedback=filename

This option enables the efficient elimination of unused functions, and on ARMv4T architectures, enables reduction of compilation required for interworking.

Syntax

--feedback=filename

Where:

filename

is the feedback file created by a previous execution of the ARM linker.

Usage

You can perform multiple compilations using the same feedback file. The compiler places each unused function identified in the feedback file into its own ELF section in the corresponding object file.

The feedback file contains information about a previous build. Because of this:

  • The feedback file might be out of date. That is, a function previously identified as being unused might be used in the current source code. The linker removes the code for an unused function only if it is not used in the current source code.

Note

    • For this reason, eliminating unused functions using linker feedback is a safe optimization, but there might be a small impact on code size.
    • The usage requirements for reducing compilation required for interworking are more strict than for eliminating unused functions. If you are reducing interworking compilation, it is critical that you keep your feedback file up to date with the source code that it was generated from.
  •  

You have to do a full compile and link at least twice to get the maximum benefit from linker feedback. However, a single compile and link using feedback from a previous build is usually sufficient.

 

哈哈,还真是有新发现。编译器在编译过程中会回写一部分编译信息到feedback文件中,而这部分信息会正面作用于下一次的编译。

换而言之,对ARM工程,连续多编译几次,会有容量上的优化啊。像我一样对代码容量比较在意的同学一定要记住了~~~~

 

 

  评论这张
 
阅读(521)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018