Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: avr-gcc 4.9.2
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > GNU/OpenSource средства разработки
Genadi Zawidowski
Взято тут: http://netcologne.dl.sourceforge.net/proje...-12_mingw32.zip

gcc version 4.9.2 20140912 (prerelease) (GCC):

Цитата
AVR Memory Usage
----------------
Device: atmega644pa

Program: 32754 bytes (50.0% Full)
(.text + .data + .bootloader)

Data: 936 bytes (22.9% Full)
(.data + .bss + .noinit)



gcc version 4.7.2 (AVR_8_bit_GNU_Toolchain_3.4.2_939):

Цитата
AVR Memory Usage
----------------
Device: atmega644pa

Program: 32942 bytes (50.3% Full)
(.text + .data + .bootloader)

Data: 936 bytes (22.9% Full)
(.data + .bss + .noinit)


smalcom
включите lto, ещё меньше размер может быть.
Genadi Zawidowski
Давно -flto -Os включено. Это уже крохи подбираются.
demiurg_spb
Цитата(Genadi Zawidowski @ Sep 13 2014, 21:02) *
О! Попробую, а то я уже стал думать, что всё, что новее 4.7.2 хуже в плане размера выходного файла...
Чуда не произошло: +100 с лишним байт на прошивке размером 14К со следующими опциями оптимизации компилятора и линкера.
Код
    CFLAGS += -funsigned-char
    CFLAGS += -funsigned-bitfields
    CFLAGS += -fpack-struct
    CFLAGS += -fshort-enums
    CFLAGS += -fno-move-loop-invariants
    CFLAGS += -fno-optimize-sibling-calls
    CFLAGS += -fno-split-wide-types
    CFLAGS += -fno-tree-loop-optimize
    CFLAGS += -fno-tree-scev-cprop
    CFLAGS += -fno-tree-switch-conversion
    CFLAGS += -mcall-prologues
    CFLAGS += -mstrict-X
    CFLAGS += -maccumulate-args
    CFLAGS += -mbranch-cost=0
    CFLAGS += -flto
    CFLAGS += -ffunction-sections
    CFLAGS += -fdata-sections
    CFLAGS += -mrelax

    LDFLAGS += -Wl,--gc-section -nodefaultlibs -lm -lgcc -lc
Может я чего-то не то творю?
Genadi Zawidowski
Ну честно скажу, такую "простыню" я пробовал крайне давно засовывать в проект. Сейчас мои флаги выглядят так:

Цитата
avr-gcc -mmcu=atmega644pa -Wall -gdwarf-2 -std=gnu99 -flto -DF_CPU=10000000UL -Os -fsigned-char -MD -MP -MT st7735.o -MF dep/st7735.o.d -c ../st7735.c


И не забыть -Os -flto линкеру сказать.
demiurg_spb
Цитата(Genadi Zawidowski @ Sep 15 2014, 19:30) *
Ну честно скажу, такую "простыню" я пробовал крайне давно засовывать в проект. Сейчас мои флаги выглядят так:

Это вы зря.
Там есть воистину убойные ключи:
Цитата
CFLAGS += -mcall-prologues
CFLAGS += -mstrict-X
CFLAGS += -maccumulate-args
CFLAGS += -flto
CFLAGS += -ffunction-sections
CFLAGS += -fdata-sections
CFLAGS += -mrelax
Первый из них, конечно снижает производительность прошивки в целом, но когда надо впихнуть невпихуемое без него никак...
Вторые два ключика появились в gcc-4.7.0 и тоже работают волшебно.
Собственно как и остальные.

У вас просто нет задачи уложить весьма функциональную прошивку в 8 или 16 килобайт для снижения себестоимости серийного изделия.
Поэтому вы и не используете всевозможные оптимизации.

Цитата
И не забыть -Os -flto линкеру сказать.
Ну это разумеется:
Код
%.elf: $(OBJ)
    @echo $(MSG_LINKING) $@
    $(CC) $(ALL_CFLAGS) $^ --output $@ $(LDFLAGS)


PS: Я считаю, что имеет смысл сравнивать разные версии компиляторов на максимально возможной оптимизации (по скорости или объёму - кому что нужно).
Genadi Zawidowski
Добавил -mstrict-X и -maccumulate-args - раздувает...
Цитата
Device: atmega32

Program: 32842 bytes (100.2% Full)
(.text + .data + .bootloader)

Data: 880 bytes (43.0% Full)
(.data + .bss + .noinit)

Только -mstrict-X:
Цитата
Device: atmega32

Program: 32466 bytes (99.1% Full)
(.text + .data + .bootloader)

Data: 880 bytes (43.0% Full)
(.data + .bss + .noinit)

Мой оригинальный вариант, что я приводил ранее:
Цитата
Device: atmega32

Program: 32476 bytes (99.1% Full)
(.text + .data + .bootloader)

Data: 880 bytes (43.0% Full)
(.data + .bss + .noinit)


Насчет задач... В промышленных вариантах я бы не подставлялся под ограничение ПЗУ, так как развитие функциональности всегда возникает... и заполняет всю предоставленную память. Способ снижения себестоимости за счет процессора - на мой взгляд спорно. Тут можно и с каждой функцией индивидуально заняться, хотя это вопрос к взаимодействию с заказчиком. К примеру выяснилось, что использование резисторных сборок вместо отдельных деталей снижает стоимость сборки на станке. Общеизвестно, что трухольные компоненты тоже удорожают.
Цитата
У вас просто нет задачи уложить весьма функциональную прошивку в 8 или 16 килобайт

Есть одна конструкция - радиолюбительское связное устройство SW2011..SW2013 в разных модификациях. Его автор собирает и рассылает с Украины. В трансивере стоит ATMEGA32. И всякие доработки программы должны оставить возможность перешить прошивку на новую не заменяя процессор. Программу для этого устройства делал я, вот и стараюсь утрамбовать. Косвенно, хорошая оптимизация -OS положительно и на производительности сказывается, разумеется за исключением таких способов как -mcall-prologues.
demiurg_spb
Цитата(Genadi Zawidowski @ Sep 16 2014, 13:22) *
Ещё раз перепробовал различные варианты комбинаций ключей, avr-gcc-4.7.2 остался не побеждён.
Genadi Zawidowski
Понятно, что всё от проекта зависит... А пробовали без набора ключей? Только тот минимум, что и я использую? Как он на Вашем проекте?
den_po
Цитата(demiurg_spb @ Sep 16 2014, 14:27) *
Ещё раз перепробовал различные варианты комбинаций ключей, avr-gcc-4.7.2 остался не побеждён.

Вы ключи сборки вашего проекта меняли, а newlib (или что там в gcc) в вашем проекте не используется?
demiurg_spb
Цитата(Genadi Zawidowski @ Sep 16 2014, 16:32) *
А пробовали без набора ключей? Только тот минимум, что и я использую? Как он на Вашем проекте?
Пробовал конечно. Результат хуже чем с ключами (пробовал на нескольких проектах). Сравнивать просто так 4.7.2 vs 4.9.2 не вижу смысла.
Мне интересен минимальный размер прошивки. Я уверен что любой проект смогу собрать компактнее на 4.7.2, чем на всех последующих и предыдущих версиях компилятора 4.х.


Цитата(den_po @ Sep 16 2014, 17:04) *
Вы ключи сборки вашего проекта меняли, а newlib (или что там в gcc) в вашем проекте не используется?
Используется: avrlibc libm libgcc. ИМХО, начиная с avr-gcc-4.7 он собирается с интеграцией в него части avrlibc, так что подменить без пересборки не выйдет.
Самосборкой компилятора пока не увлекаюсь...
Genadi Zawidowski
Вспомнил одну "вкусность", которая кроме удобства ещё и компактности кода добавила, в 4.7 её кажется ещё не ввели - атрибуты для разных пространств памяти, при этом работа с памятью программ стала возможной без pgm_read_byte и других. В моих проектах это дало уменьшение кода.
demiurg_spb
Цитата(Genadi Zawidowski @ Sep 20 2014, 15:08) *
Эта фишка появилась именно в 4.7.
Пользуюсь.
В своё время сам прикладывал руки к avr-libc и закоммитил интерфейс pgm_ххх_float в pgmspace.h ну ещё по мелочи.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.