C代码优化编译器为atmel工作室

时间:2018-04-14 07:02:19

标签: gcc avr avr-gcc avr-studio7

我正在使用Atmel Studio 7,其中,优化级别为-O1。 我可以检查编译器本身正在优化的代码部分吗? 如果我禁用优化,我的二进制文件大小为12KB,使用优化级别-O1,二进制文件大小为5.5KB。

1 个答案:

答案 0 :(得分:0)

我可以检查编译器本身正在优化的代码部分吗?

所有代码由编译器优化,即受优化标志的影响,除了

  1. 是从库(libgcc.alibc.alibm.alib<device>.a)中拖动的代码。

  2. 启动代码(crt<device>.o)也包括向量表,或者是来自其他对象的代码,这些对象已经存在并且当前编译中没有(重新)编译。当您更改Makefile中的标记时,后者可能会发生:如果模块不依赖Makefile本身,则make将不会重建它们。

  3. 来自汇编模块(*.S*.sx*.s)的代码,前提是预处理的汇编代码不通过#ifdef __OPTIMIZE__或类似方式使用条件汇编。 / p>

  4. 内联汇编中的代码,前提是尚未优化内联asm。

为了确定这是否有效,您可以分别:

  1. -Wl,-Map,file.map链接并检查该映射文件(文本文件)。它将列出由于哪些未定义符号而已将哪些对象从何处拖动。

  2. 除了您-nostartfiles以外,启动代码都已链接。将-Wl,-v添加到链接阶段,您将看到crt<device>.o被链接。

  3. 您知道您的编译单元,汇编模块吗?

  4. -save-temps添加到编辑中。内联汇编将在中间*.s文件中显示为

    /* #APP */
    ;  <line> "<compilation-unit>"
        <inline-asm-code>
    /* #NOAPP */