WinAvr в вопросах и ответах

Обсуждаем контроллеры компании Atmel.
pcb
Опытный кот
Сообщения: 833
Зарегистрирован: Пт авг 12, 2011 09:14:27
Откуда: Млечный путь/Земля/РФ/Екатеринбург

Re: WinAvr в вопросах и ответах

Сообщение pcb »

ARV писал(а): что касается вашей задачи, то я бы рекомендовал включить -Os
-O2 всегда генерирует рабочий код :)
-Os не всегда.

Потому 2 стоит почти всегда, ещё и отладочная информация есть, иногда нужно.
Код привык под 2 писать. Всегда получается рабочий код, почти как ассемблер )
ARV писал(а): P.S. кстати, у вас много модулей в программе или один? если один - все ли функции у вас объявлены static?
У меня линейный код,
одна функция маин, и вечный цикл вхиле; другие процедуры, функции не вызываются.

Видимо на старом Гцц придётся дальше сидеть :kill:

Вы какой пользуетесь версией?
Разработал:
-BLDC
-ФУОЗ/МПСЗ
-SMART BMS
-ECU/EDC на STM32F4(43%)+CPLD(57%)
-Моноинжектор на ATSAMD20G16
-контроллер эффектов для RGB LED ленты
-умные часы/обратный счет/секундомер
-устройство измерения емкости АКБ
Реклама
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18546
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: WinAvr в вопросах и ответах

Сообщение ARV »

1. если у вас с оптимизацией -Os генерируется нерабочий код - это ваша вина, а не компилятора. в моей практике такого не было ни разу!
2. последние несколько лет я пользовался WinAVR 20100110, но самый последний свой проект сделал на скачанном с сайта Atmel тулчейне avr8-gnu-toolchain-3.4.5.1522 - меня привлекла поддержка __flash
3. отладочная информация с оптимизацией не связана и включается опциями -g. обычно использую -g2 -gdwarf-2 так как с ними можно вести отладку в протеусе и студии
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Реклама
pcb
Опытный кот
Сообщения: 833
Зарегистрирован: Пт авг 12, 2011 09:14:27
Откуда: Млечный путь/Земля/РФ/Екатеринбург

Re: WinAvr в вопросах и ответах

Сообщение pcb »

ARV писал(а):в моей практике такого не было ни разу!
все зависит от кол-ва практики и от задач, если светодиодиками мыргать, то навряд ли столкнётесь когда либо
ARV писал(а):отладочная информация с оптимизацией не связана и включается опциями -g. обычно использую -g2 -gdwarf-2 так как с ними можно вести отладку в протеусе и студии
Конечно не связана, компилятор переменные пооптимизировал, в итоге половины в отладчике не видать.

Если мой конфиг видели, там варф2 как раз стоит.

Ещё раз скажу, от количества практики зависит, способность творить работоспособный код в зависимости от.

В том числе моё подтверждение что с оптимизацие -Оs, код хуже и по скорости и по объему, чем по -О2, т.е. имея опыт можно изначально на менее агрессивной оптимизации иметь лучший код. :tea:

А кому то требуется и -Оs что бы код побыстрее был, но не мне. ))
Разработал:
-BLDC
-ФУОЗ/МПСЗ
-SMART BMS
-ECU/EDC на STM32F4(43%)+CPLD(57%)
-Моноинжектор на ATSAMD20G16
-контроллер эффектов для RGB LED ленты
-умные часы/обратный счет/секундомер
-устройство измерения емкости АКБ
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

Re: WinAvr в вопросах и ответах

Сообщение WiseLord »

2 pcb: Заинтересовал Ваш анализ размера кода, потому что у меня получались результаты совсем другие. Решил проверить ещё раз.

Проверял на своём проекте. Там и математики хватает, да и вообще он довольно крупный. Можете для сравнения своими версиями gcc тоже пройтись, было бы интересно на одном и том же коде сделать анализ разных компиляторов.

Итак, мои результаты.

1. Мой основной вариант - Linux, самосборный avr-gcc версии 4.8.3:
Спойлер

Код: Выделить всё

wiselord@wiselord src $ avr-gcc -v
Используются внутренние спецификации.
COLLECT_GCC=/usr/x86_64-pc-linux-gnu/avr/gcc-bin/4.8.3/avr-gcc
COLLECT_LTO_WRAPPER=/usr/libexec/gcc/avr/4.8.3/lto-wrapper
Целевая архитектура: avr
Параметры конфигурации: /var/tmp/portage/cross-avr/gcc-4.8.3/work/gcc-4.8.3/configure --host=x86_64-pc-linux-gnu --target=avr --build=x86_64-pc-linux-gnu --prefix=/usr --bindir=/usr/x86_64-pc-linux-gnu/avr/gcc-bin/4.8.3 --includedir=/usr/lib/gcc/avr/4.8.3/include --datadir=/usr/share/gcc-data/avr/4.8.3 --mandir=/usr/share/gcc-data/avr/4.8.3/man --infodir=/usr/share/gcc-data/avr/4.8.3/info --with-gxx-include-dir=/usr/lib/gcc/avr/4.8.3/include/g++-v4 --with-python-dir=/share/gcc-data/avr/4.8.3/python --enable-languages=c,c++ --enable-obsolete --enable-secureplt --disable-werror --with-system-zlib --enable-nls --without-included-gettext --enable-checking=release --with-bugurl=https://bugs.gentoo.org/ --with-pkgversion='Gentoo 4.8.3 p1.1, pie-0.5.9' --enable-libstdcxx-time --enable-poison-system-directories --enable-shared --disable-threads --disable-bootstrap --enable-multilib --disable-altivec --disable-fixed-point --disable-libgcj --disable-libgomp --disable-libmudflap --disable-libssp --disable-libquadmath --enable-lto --without-cloog --disable-libsanitizer
Модель многопоточности: single
gcc версия 4.8.3 (Gentoo 4.8.3 p1.1, pie-0.5.9) 
wiselord@wiselord src $ make
mkdir -p flash obj/audio obj/display obj/tuner
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/actions.o actions.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/ds18x20.o ds18x20.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/display.o display.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/main.o main.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/rc5.o rc5.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/temp.o temp.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/fft.o fft.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/ds1307.o ds1307.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/input.o input.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/i2c.o i2c.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/adc.o adc.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/audio/tda731x.o audio/tda731x.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/audio/tda7439.o audio/tda7439.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/audio/audioproc.o audio/audioproc.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/tuner/tea5767.o tuner/tea5767.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/tuner/tuner.o tuner/tuner.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/tuner/tux032.o tuner/tux032.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/tuner/rda5807.o tuner/rda5807.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/display/font-ks0066-ru-24.o display/font-ks0066-ru-24.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/display/font-digits-32.o display/font-digits-32.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/display/font-ks0066-ru-08.o display/font-ks0066-ru-08.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/display/icons-24.o display/icons-24.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/display/icons-32.o display/icons-32.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/display/gdfb.o display/gdfb.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/display/st7920.o display/st7920.c
avr-gcc -g -Wall -Werror -mmcu=atmega32 -o obj/ampcontrol_m32fb_st7920.elf obj/actions.o obj/ds18x20.o obj/display.o obj/main.o obj/rc5.o obj/temp.o obj/fft.o obj/ds1307.o obj/input.o obj/i2c.o obj/adc.o obj/audio/tda731x.o obj/audio/tda7439.o obj/audio/audioproc.o obj/tuner/tea5767.o obj/tuner/tuner.o obj/tuner/tux032.o obj/tuner/rda5807.o obj/display/font-ks0066-ru-24.o obj/display/font-digits-32.o obj/display/font-ks0066-ru-08.o obj/display/icons-24.o obj/display/icons-32.o obj/display/gdfb.o obj/display/st7920.o -lm
avr-objcopy -O ihex -R .eeprom -R .nwram obj/ampcontrol_m32fb_st7920.elf flash/ampcontrol_m32fb_st7920.hex
./size.sh obj/ampcontrol_m32fb_st7920.elf

AVR Memory Usage:

Program:  27126 bytes (.text + .data)
Data:     1850 bytes (.data + .bss)
2. Windows (XP в VirtualBox), WinAVR 20100110:
Спойлер

Код: Выделить всё

E:\Проекты\ampcontrol\src>avr-gcc -v
Using built-in specs.
Target: avr
Configured with: ../gcc-4.3.3/configure --enable-win32-registry=WinAVR-20100110 --with-gmp=/usr/local --with-mpfr=/usr/local --prefix=/c/WinAVR --target=avr --enable-languages=c,c++,objc --with-dwarf2 --enable-doc --disable-shared --disable-libada --disable-libssp --disable-nls --with-pkgversion='WinAVR 20100110' --with-bugurl='URL:http://sourceforge.net/tracker/?atid=520074&group_id=68108&func=browse'
Thread model: single
gcc version 4.3.3 (WinAVR 20100110)

E:\Проекты\ampcontrol\src>make
mkdir -p flash obj/audio obj/display obj/tuner
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/actions.o actions.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/adc.o adc.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/display.o display.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/ds1307.o ds1307.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/ds18x20.o ds18x20.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/fft.o fft.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/i2c.o i2c.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/input.o input.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/main.o main.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/rc5.o rc5.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/temp.o temp.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/audio/audioproc.o audio/audioproc.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/audio/tda731x.o audio/tda731x.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/audio/tda7439.o audio/tda7439.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/tuner/rda5807.o tuner/rda5807.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/tuner/tea5767.o tuner/tea5767.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/tuner/tuner.o tuner/tuner.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/tuner/tux032.o tuner/tux032.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/display/font-digits-32.o display/font-digits-32.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/display/font-ks0066-ru-08.o display/font-ks0066-ru-08.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/display/font-ks0066-ru-24.o display/font-ks0066-ru-24.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/display/icons-24.o display/icons-24.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/display/icons-32.o display/icons-32.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/display/gdfb.o display/gdfb.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/display/st7920.o display/st7920.c
avr-gcc -g -Wall -Werror -mmcu=atmega32 -o obj/ampcontrol_m32fb_st7920.elf obj/actions.o obj/adc.o obj/display.o obj/ds1307.o obj/ds18x20.o obj/fft.o obj/i2c.o obj/input.o obj/main.o obj/rc5.o obj/temp.o obj/audio/audioproc.o obj/audio/tda731x.o obj/audio/tda7439.o obj/tuner/rda5807.o obj/tuner/tea5767.o obj/tuner/tuner.o obj/tuner/tux032.o obj/display/font-digits-32.o obj/display/font-ks0066-ru-08.o obj/display/font-ks0066-ru-24.o obj/display/icons-24.o obj/display/icons-32.o obj/display/gdfb.o obj/display/st7920.o -lm
avr-objcopy -O ihex -R .eeprom -R .nwram obj/ampcontrol_m32fb_st7920.elf flash/ampcontrol_m32fb_st7920.hex
./size.sh obj/ampcontrol_m32fb_st7920.elf

AVR Memory Usage:

Program:  28194 bytes (.text + .data)
Data:     1860 bytes (.data + .bss)
3. Windows (XP в VirtualBox), WinAVR 20100110, но уже gcc посвежее:
Спойлер

Код: Выделить всё

E:\Проекты\ampcontrol\src>avr-gcc -v
Using built-in specs.
COLLECT_GCC=avr-gcc
COLLECT_LTO_WRAPPER=c:/avr-gcc-4.8_2013-03-06_mingw32/bin/../libexec/gcc/avr/4.8.0/lto-wrapper.exe
Target: avr
Configured with: ../../gcc.gnu.org/trunk/configure --target=avr --prefix=/local/gnu/install/gcc-4.8-mingw32 --host=i386-mingw32 --build=i686-linux-gnu --enable-languages=c,c++ --disable-nls --disable-shared --with-dwarf2
Thread model: single
gcc version 4.8.0 20130306 (experimental) (GCC)

E:\Проекты\ampcontrol\src>make
mkdir -p flash obj/audio obj/display obj/tuner
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/actions.o actions.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/adc.o adc.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/display.o display.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/ds1307.o ds1307.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/ds18x20.o ds18x20.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/fft.o fft.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/i2c.o i2c.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/input.o input.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/main.o main.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/rc5.o rc5.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/temp.o temp.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/audio/audioproc.o audio/audioproc.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/audio/tda731x.o audio/tda731x.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/audio/tda7439.o audio/tda7439.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/tuner/rda5807.o tuner/rda5807.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/tuner/tea5767.o tuner/tea5767.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/tuner/tuner.o tuner/tuner.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/tuner/tux032.o tuner/tux032.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/display/font-digits-32.o display/font-digits-32.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/display/font-ks0066-ru-08.o display/font-ks0066-ru-08.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/display/font-ks0066-ru-24.o display/font-ks0066-ru-24.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/display/icons-24.o display/icons-24.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/display/icons-32.o display/icons-32.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/display/gdfb.o display/gdfb.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/display/st7920.o display/st7920.c
avr-gcc -g -Wall -Werror -mmcu=atmega32 -o obj/ampcontrol_m32fb_st7920.elf obj/actions.o obj/adc.o obj/display.o obj/ds1307.o obj/ds18x20.o obj/fft.o obj/i2c.o obj/input.o obj/main.o obj/rc5.o obj/temp.o obj/audio/audioproc.o obj/audio/tda731x.o obj/audio/tda7439.o obj/tuner/rda5807.o obj/tuner/tea5767.o obj/tuner/tuner.o obj/tuner/tux032.o obj/display/font-digits-32.o obj/display/font-ks0066-ru-08.o obj/display/font-ks0066-ru-24.o obj/display/icons-24.o obj/display/icons-32.o obj/display/gdfb.o obj/display/st7920.o -lm
avr-objcopy -O ihex -R .eeprom -R .nwram obj/ampcontrol_m32fb_st7920.elf flash/ampcontrol_m32fb_st7920.hex
./size.sh obj/ampcontrol_m32fb_st7920.elf

AVR Memory Usage:

Program:  27116 bytes (.text + .data)
Data:     1850 bytes (.data + .bss)
Невооружённым взглядом видно, что 4.8 генерирует код более компактный, чем хотя бы 4.3. В своё время, когда проект был ещё на ATmega16, и перестал влезать в контроллер, переход с gcc-4.7 на gcc-4.8 дал очень неплохой результат.

Также проверил некоторые опции, подсказанные уважаемым ARV.
Исходный вариант:

Код: Выделить всё

Program:  27126 bytes (.text + .data)
Data:     1850 bytes (.data + .bss)
После добавления -ffunction-sections компилятору и -Wl,-gc-sections линкеру

Код: Выделить всё

Program:  26590 bytes (.text + .data)
Data:     1850 bytes (.data + .bss)
Добавление -fno-split-wide-types увеличило на 10 байт размер кода

Параметр inline-call-cost у меня не поддерживается вообще - нагуглил, что это не стандартная в gcc вещь, добавляется каким-то сторонним патчем.

Опция -fno-unroll-loops эффекта на размер кода не оказала.

В общем, для себя нахожу полезным только связку -ffunction-sections / -Wl,-gc-sections. Ну и -fdata-sections аналогично. Раньше запустить этот параметр (насколько я понимаю, что что-то вроде strip неиспользуемых в коде функций) у меня не получалось, так как пробовал либо первую, либо вторую половины, но не в связке вместе. За подсказку спасибо ARV. Библиотеки я страюсь писать достаточно универсальные, чтобы использовались не только в одном проекте, и часто получается так, что часть функций компилируется, но не используется. И подобного strip-а не хватало.
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18546
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: WinAvr в вопросах и ответах

Сообщение ARV »

pcb писал(а):все зависит от кол-ва практики и от задач, если светодиодиками мыргать, то навряд ли столкнётесь когда либо

Ещё раз скажу, от количества практики зависит, способность творить работоспособный код в зависимости от.
я совершенно согласен с тем, что способность творить неработоспособный код зависит от практики. :)))
поэтому я очень-очень хотел бы лично увидеть код, работоспособность которого зависит от настроек оптимизации! надо же и мне как-то приобщиться к таинству знаний...

WiseLord, вы попробуйте inline-call-cost на WinAVR 20100110 - я все эти опции использовал только на этой версии.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Реклама
pcb
Опытный кот
Сообщения: 833
Зарегистрирован: Пт авг 12, 2011 09:14:27
Откуда: Млечный путь/Земля/РФ/Екатеринбург

Re: WinAvr в вопросах и ответах

Сообщение pcb »

WiseLord писал(а):2 pcb: Заинтересовал Ваш анализ размера кода, потому что у меня получались результаты совсем другие. Решил проверить ещё раз.
Благодарю за прогоны :beer:

Видимо, с малофлешовыми проектами оптимизации не очень хорошо работают.

4.7.2 - другой проект:

Код: Выделить всё

AVR Memory Usage
----------------
Device: atmega48p

Program:    1736 bytes (42.4% Full)
(.text + .data + .bootloader)

Data:         43 bytes (8.4% Full)
(.data + .bss + .noinit)


Build succeeded with 0 Warnings...
4.3.3:

Код: Выделить всё

AVR Memory Usage
----------------
Device: atmega48p

Program:    1680 bytes (41.0% Full)
(.text + .data + .bootloader)

Data:         43 bytes (8.4% Full)
(.data + .bss + .noinit)


Build succeeded with 0 Warnings...
К предыдущему проекту:
без -mcall-prologues = 1928 байт
с -mcall-prologues = 1960
Оно и понятно, ибо больше предназначенно для мк с большим кол-вом флеша..
Последний раз редактировалось pcb Чт мар 19, 2015 10:59:59, всего редактировалось 1 раз.
Разработал:
-BLDC
-ФУОЗ/МПСЗ
-SMART BMS
-ECU/EDC на STM32F4(43%)+CPLD(57%)
-Моноинжектор на ATSAMD20G16
-контроллер эффектов для RGB LED ленты
-умные часы/обратный счет/секундомер
-устройство измерения емкости АКБ
Реклама
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18546
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: WinAvr в вопросах и ответах

Сообщение ARV »

уважаемый pcb, поделитесь кодом, который не работает с оптимизацией -Os, но работает без нее или с другими режимами - очень интересуюсь. можно в личку, если у вас коммерческие проекты - гарантирую неразглашение :)))
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
pcb
Опытный кот
Сообщения: 833
Зарегистрирован: Пт авг 12, 2011 09:14:27
Откуда: Млечный путь/Земля/РФ/Екатеринбург

Re: WinAvr в вопросах и ответах

Сообщение pcb »

ARV писал(а):уважаемый pcb, поделитесь кодом, который не работает с оптимизацией -Os, но работает без нее или с другими режимами - очень интересуюсь.
К сожалению, я не могу так поступить по ряду причин.

Могу лишь сказать, что оно спотыкается на математических функциях, где требуется последовательно выполнить много умножений, делений, сложений. При этом компилятор часть математического выражения выкидывает, код, соответственно, не рабочий.
Так же в некоторых случаях пришлось вывернуть условие на противоположное
типа так:
было - if(cond&&cond&&cond)
стало - if(!(cond&&cond&&cond)) <-кондишены пришлось "вывернуть"
В этом случае я бы долго мучился, если бы не опыт с MVC там такая же проблема была.
Разработал:
-BLDC
-ФУОЗ/МПСЗ
-SMART BMS
-ECU/EDC на STM32F4(43%)+CPLD(57%)
-Моноинжектор на ATSAMD20G16
-контроллер эффектов для RGB LED ленты
-умные часы/обратный счет/секундомер
-устройство измерения емкости АКБ
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18546
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: WinAvr в вопросах и ответах

Сообщение ARV »

интересно, что именно может вам помешать продемонстрировать баг компилятора всем, в частности, мне лично? это ведь весьма важный аспект - знание о багах компилятора...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

Re: WinAvr в вопросах и ответах

Сообщение WiseLord »

Да, хотелось бы ещё добавить одну мелочь.

Когда вышел gcc-4.9, я и его из исходников собрал для кросскомпиляции avr. Но он генерировал код уже значительно больший по размеру, чем 4.8.x.

Так что на текущий момент у меня основное предпочтение всё же 4.8.3 версии, как генерирующей наиболее компактный код по сравнению с 4.7 и особенно с 4.9.
pcb
Опытный кот
Сообщения: 833
Зарегистрирован: Пт авг 12, 2011 09:14:27
Откуда: Млечный путь/Земля/РФ/Екатеринбург

Re: WinAvr в вопросах и ответах

Сообщение pcb »

WiseLord писал(а):Так что на текущий момент у меня основное предпочтение всё же 4.8.3 версии, как генерирующей наиболее компактный код по сравнению с 4.7 и особенно с 4.9.
Какие процессоры?

у меня к сожалению нет сборки вин 4.8.3
ARV писал(а):что именно может вам помешать продемонстрировать баг компилятора всем, в частности, мне лично
Без комментариев :tea:
Разработал:
-BLDC
-ФУОЗ/МПСЗ
-SMART BMS
-ECU/EDC на STM32F4(43%)+CPLD(57%)
-Моноинжектор на ATSAMD20G16
-контроллер эффектов для RGB LED ленты
-умные часы/обратный счет/секундомер
-устройство измерения емкости АКБ
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18546
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: WinAvr в вопросах и ответах

Сообщение ARV »

pcb писал(а):
ARV писал(а):что именно может вам помешать продемонстрировать баг компилятора всем, в частности, мне лично
Без комментариев :tea:
жаль. очень жаль. меня всегда огорчает ситуация, когда в споре истина не рождается, а умирает.

я делал проекты на attiny13 - согласитесь, что сложно придумать более малофлешевые проекты. с помощью вышеозвученных опций выжимал все, что мог. когда доходил до пределов - занимался ассемблерными вставками, регистровыми переменными и т.п.

и вот тут словил пару глюков компилятора (как я думаю), связанную с регистровыми переменными - иной раз регистровые переменные портились, хотя все необходимые меры для "фиксации" регистров я делал. закономерности я не уловил, к сожалению, помню только, что 3 или 4 регистровых переменных компилятор прожевывает нормально, а если больше - как повезет...

однако я никогда не сталкивался с двумя широкораспространенными мифами:
- что из-за оптимизации можно получить нерабочий код
- что то, что работает в протеусе, может не работать в реальности

точнее, я сталкивался с ситуациями, которые стали источником этих мифов, но в результате тщательнейшего изучения проблемы всегда оказывалось, что это была моя ошибка. я вообще ни одного проекта не реализовал, чтобы оптимизация была отличной от -Os
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
pcb
Опытный кот
Сообщения: 833
Зарегистрирован: Пт авг 12, 2011 09:14:27
Откуда: Млечный путь/Земля/РФ/Екатеринбург

Re: WinAvr в вопросах и ответах

Сообщение pcb »

ARV писал(а):однако я никогда не сталкивался с двумя широкораспространенными мифами:
- что из-за оптимизации можно получить нерабочий код
Я же не против вашего опыта :beer:
ARV писал(а):меня всегда огорчает ситуация, когда в споре истина не рождается, а умирает.

И в тоже время, разработка электроники у меня поставлена на поток, кусочно проверять у вас не получиться, а целиком проекты дать не представляется возможным.

Особого смысла вас обманывать нет, себя не обманешь.
Разработал:
-BLDC
-ФУОЗ/МПСЗ
-SMART BMS
-ECU/EDC на STM32F4(43%)+CPLD(57%)
-Моноинжектор на ATSAMD20G16
-контроллер эффектов для RGB LED ленты
-умные часы/обратный счет/секундомер
-устройство измерения емкости АКБ
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18546
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: WinAvr в вопросах и ответах

Сообщение ARV »

pcb писал(а):Особого смысла вас обманывать нет, себя не обманешь.
я не собираюсь уличать вас во лжи, я хочу понять чего нужно опасаться, а где нужно поднимать собственный уровень. напустили тут туману, я теперь буду лишнее время тратить на перепроверки, хотя до сего дня был уверен в корректности оптимизатора :)))
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
dartfan
Родился
Сообщения: 2
Зарегистрирован: Чт мар 26, 2015 07:55:33

Re: WinAvr в вопросах и ответах

Сообщение dartfan »

Объясните, пожалуйста, в чем сходство и различие между такими понятиями как WinAvr, gcc и avr-libc
Знаю, что что-то общего между ними есть, но что именно не понятно.

Какой компилятор применяется в среде Atmel Studio 6.2 и можно ли его сменить?
Насколько я знаю, в этой среде применяется компилятор gcc, то есть свободный компилятор.
Возникает вопрос: а что, такая крупная корпорация, как Atmel не смогла создать свой компилятор? Среду программирования Atmel Studio 6.2 они ведь создали?

И почему раньше, в эпоху популярности AVR Studio 4 необходимо было отдельно ставить WinAvr? Ведь WinAvr - это отдельная среда программирования? Или я что-то путаю?

И еще, какой компилятор применяется в среде CodeVisionAVR? Насколько мне известно, в CVAVR компилятор отступает от стандартов языка СИ. К примеру, там можно прописать вот так PORTB.3 = 1; И никакой другой компилятор Си не поддерживает такую конструкцию.
Получается, по факту, что в CVAVR применяется какой-то свой язык, просто похожий на СИ?
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18546
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: WinAvr в вопросах и ответах

Сообщение ARV »

1. WinAVR - это ныне уже не поддерживаемая сборка AVR GCC.
2. Сборка AVR GCC - это набор из компиляторов Си и С++, линкера, ассемблера AVR-AS и кучи других утилит различного назначения, вплоть до программатора AVRDUDE.
3. Таким образом, никакой принципиальной разницы между WinAVR и AVR-GCC нет (кроме версии)
4. Atmel Studio ориентирована на Atmel AVR Toolchain - это поддерживаемая командой разработчиков WinAVR (по сути Атмел купила команду разработчиков) версия AVR-GCC. Следует понимать, что версий компилятора GCC для микроконтроллеров AVR существует больше, чем 1 - как принято у GCC-шных разработчиков, каждая команда или даже любой знающий одиночка может (и часто - делает) свой вариант сборки этого компилятора. Просто наиболее популярные получают собственное имя: WinAVR или Atmel AVR Toolchain
5. Сменить компилятор в студии очевидно возможно, но лично я не знаю как, ибо не пользуюсь этой средой.
6. Атмел создали ассемблер и IDE под названием AVR Studio. Компилятор Си и С++ для своих МК они не сделали, как не сделали и Atmel Studio - это всего лишь лицензированная IDE от Microsoft Visual Studio
7. CodeVision реализует собственный Си-подобный язык программирования, который очень похож на Си, но имеет много отклонений от стандарта этого языка. Кроме того, этот компилятор в принципе не поддерживает С++.

вроде на все вопросы ответил :)))
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
dartfan
Родился
Сообщения: 2
Зарегистрирован: Чт мар 26, 2015 07:55:33

Re: WinAvr в вопросах и ответах

Сообщение dartfan »

ARV, вот спасибо, внесли хоть какую-то ясность!

А я правильно понимаю, что сборка AVR GCC предназначена исключительно для AVR микроконтроллеров?
И имеет ли сборка AVR GCC графическую оболочку или это просто набор консольных программ?
А WinAVR - это получается урезанная версия AVR GCC, откуда выкинули все ненужное?
И правда ли, что в сборке WinAVR есть графическая оболочка?
dartfan писал(а):но лично я не знаю как, ибо не пользуюсь этой средой.
Кстати, а вы чем пользуетесь, если не Atmel Studio? Или AVR микроконтроллеры вы вообще не программируете?

И кто-нибудь знает, какой стандарт языка Си используется в Atmel Studio 6.2 ?
Если я не ошибаюсь, то используется стандарт языка С99, так как в Atmel Studio 6.2 можно определять переменную прямо в цикле for(uin8_t i=0, i<10, i++){} Поправьте, если не так.
dartfan писал(а):вроде на все вопросы ответил
Еще забыли про avr-libc рассказать. Это вроде бы набор библиотек для AVR GCC ?
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18546
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: WinAvr в вопросах и ответах

Сообщение ARV »

1. да, AVR-GCC предназначается только для AVR. ну кажется есть еще поддержка частичная xMega
2. WinAVR содержит в комплекте Programmers Notepad и утилиту генерации makefile, которые с некоторой натяжкой можно назвать "оболочкой"... но вообще-то это комплект консольных программ
3. WinAVR это не урезанная версия GCC, а вполне завершенная самостоятельная сборка компилятора. я бы не сказал, что в ней чего-то не хватает... а вот гуляющие по сети toolchain-ы разные - вот это как раз усеченные варианты сборки, т.к. чаще всего не содержат многих утилит, документации и т.п.
4. про "графическую оболочку" я вам уже ответил в п.2
5. лично я пользуюсь Eclipse в качестве IDE, AVR Studo 4.18 и Proteus VSM для отладки.
6. стандарт задается в опциях командной строки. да, в последнее время по умолчанию задается С99, однако вы легко можете это изменить - ковыряйте настройки проекта в студии
7. avr-libc это действительно комплект "стандартных" библиотек Си для AVR. в основном базовые функции ввода-выворда, символьных и строковых преобразований, математики и кое-каких сугубо AVR-специфичных вещей вроде "спящих режимов", watchdog-а и работы с EEPROM. Более подробно обо всем этом вы можете почитать мои публикации: http://www.simple-devices.ru/articles/7 ... avr-studio
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
codenamehawk
Вымогатель припоя
Сообщения: 528
Зарегистрирован: Вт фев 09, 2010 17:52:26

Re: WinAvr в вопросах и ответах

Сообщение codenamehawk »

Удалось ли кому запустить WINAVR под Windows8.1 ?
Проблема отказ в доступе при запуске sh.
TICLIR
Встал на лапы
Сообщения: 134
Зарегистрирован: Вс авг 01, 2010 16:05:25

Re: WinAvr в вопросах и ответах

Сообщение TICLIR »

Добрый вечер, помогите разобраться. Из 32 бит пытаюсь собрать что нибудь, вот массив складывается из 4 байт, пытаюсь собрать собрать 32
битное слово, получается ерунда. Где я не прав?

Код: Выделить всё

volatile uint32_t sostr=0;
 unsigned char cod_slow[4]={0,0,0,0};
 
 void sost32b(volatile unsigned char nbt){
volatile unsigned char nn=0,bb=0;
 nn=nbt/8;
 bb=nbt%8;
 cod_slow[nn]|=(1<<bb); //здесь складывается
 sostr|=(1<<nbt);           //здесь нет

 }
Ответить

Вернуться в «AVR»