Цитата(ZiB @ Nov 14 2007, 06:22)

проекта последний мой проект в IAR-е компилится с максимальной оптимизацией по скорости в 18 кб, а вот в AVR-GCC минимум удалось добится только 29 кб, но это "прямой" перенос кода, сейчас буду сидеть смотреть что за код генерит AVR-GCC, да пытаться оптимизировать как-то...
Разница слишком большая. Что-то не то.
Во-первых "максимальная оптимизация" -O3 - это вообще не для однокристалок, он (gcc "вообще", его "архитектуро-независимая часть") при этом инлайнит всё, что может, разворачивает тела циклов - ради максимального быстродействия. Код пухнет невообразимо.
-O2 в большинстве случаев тоже не нужен, код больше, чем для -Os, иногда быстрее, а иногда и нет.
Итого ставить -Os
Если очень хочется ужать ещё - можно ещё дать ключ -mcall-prologues
При этом он прологи/эпилоги функций (создание кадра для переменных на стеке) не генерирует по месту, а подшивает общие подпрограммы. Код уменьшается, но скорость падает. Но на "толстых" функциях это не очень заметно.
Для avr-gcc версий 4.x (WinAVR-20070525 и новее, сборки с сайта www.klen.org) полезны ещё такие ключи
gcc:
-ffunction-section (поместить каждую функцию в отдельную секцию)
-data-section (аналогично для переменных)
линкер:
--gc-sections (выбросить секции, на которые нет ссылок - убираются функции, которые есть в тексте "про запас", особо полезно для С++ программ)
--relax (по мере возможности заменять call/jump на rcall/rjmp, заменять комбинацию call+ret на jump)
В makefile у меня это выглядит так:
Код
CFLAGS += -ffunction-sections -fdata-sections
LDFLAGS += -Wl,--gc-sections
LDFLAGS += -Wl,--relax