Оптимизация кода на C компилятором для студии atmel

Я использую Atmel Studio 7, и уровень оптимизации составляет -O1. Могу ли я проверить, какая часть кода оптимизируется самим компилятором? Если я отключаю оптимизацию, мой размер двоичного файла составляет 12 КБ, и при использовании уровня оптимизации -O1, размер двоичного файла составляет 5,5 КБ.

0 ответов

Могу ли я проверить, какая часть кода оптимизируется самим компилятором?

Весь код оптимизирован компилятором, т.е. зависит от флагов оптимизации, кроме

  1. Это код, который вытащили из библиотек (libgcc.a, libc.a, libm.a, lib<device>.a).

  2. Код запуска (crt<device>.o), который также включает векторную таблицу или код из других объектов, которые уже существуют и не (повторно) компилируются в текущей компиляции. Последнее может произойти с Makefile, когда вы измените в нем флаги: если модули не зависят от самого Makefile,make не буду их восстанавливать.

  3. Код из сборочных модулей (*.S, *.sx, *.s) при условии, что предварительно обработанный ассемблерный код не использует условную сборку с помощью #ifdef __OPTIMIZE__ или похожие.

  4. Код на встроенной сборке, при условии, что встроенный asm не оптимизирован.

Чтобы определить, действует ли что-либо из этого, вы можете соответственно:

  1. Связать с -Wl,-Map,file.mapи проверьте этот файл карты (текстовый файл). Он будет перечислять, какие объекты были перетащены, откуда и из-за какого неопределенного символа.

  2. Код запуска привязан, кроме вас -nostartfiles. Добавить-Wl,-v на этапе ссылки, вы увидите crt<device>.o связаны.

  3. Вы знаете свои единицы компиляции, модули сборки, не так ли?

  4. Добавить -save-tempsк сборнику. Встроенный asm будет отображаться в промежуточном*.s файл как

    /* #APP */
    ;  <line> "<compilation-unit>"
        <inline-asm-code>
    /* #NOAPP */
    
Другие вопросы по тегам