реклама на сайте
подробности

 
 
3 страниц V   1 2 3 >  
Reply to this topicStart new topic
> WinAVR-20081205 и тенденции, С каждым релизом WinAVR размер кода растет :(
ARV
сообщение Feb 12 2009, 07:19
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581



Я знаю, что на этом форуме присутствуют люди, которые не только глубоко знают GCC и, в частности, WinAVR, но и участвуют в той или иной мере в совершенствовании этих продуктов. Поэтому в первую очередь мой вопрос к ним. Я понимаю, что мои вопросы почти риторические, но беспокойство от них у меня сильное...

Скачал WinAVR-20081205 (до этого был 20080610), провел тест на проекте для AT90CAN128. Было 18204 байт результрующего кода (WinAVR 20080610), стало 18350 байт. Исходник не менял, естественно, как и все параметры сборки проекта. Ранее при переходе с 20080411 так же было замечено увеличение итогового кода для проекта. То есть я делаю вывод, что от релиза к релизу GCC генерирует все менее и менее компактный код для AVR (про другие платформы не скажу, ибо не пользуюсь). Неоднократно были замечены всякие странные фокусы при сохранении регистров в прологе функций, некоторые "чудеса" оптимизации и "странности" в обработчиках прерываний (заглядываю на AVR Freaks)...

Что это? Целенаправленное стремление снизить качество GCC для AVR, косвенные следствия каких-то неведомых мне улучшений, непредвиденные последствия исправления багов или что-то еще? Казалось бы, добавилась поддержка новых микроконтроллкров - и на тебе: поддержка старых ухудшилась... Чего ждать в будущем? Единственный качественный бесплатный компилятор - неужели он обречен?!

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

P.S. Пожалуйста, не надо ответов типа "хотите бесплатно - жрите, что дают!"... Ведь смысл бесплатного продукта не в том, чтобы унизить и заставить жрать помои...


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Feb 12 2009, 07:54
Сообщение #2


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Когда я "находил 10 отличий", дело было в более агрессивном разворачивании функций и небольших циклов в инлайны. Кроме того, сохранение регистров при входе в main() и их восстановление при выходе (т.е. никогда) для моих приложений не нужно. Это все отключаемые вещи. Видимо, набор настроек по умолчанию пока еще не устоялся.
Go to the top of the page
 
+Quote Post
ARV
сообщение Feb 12 2009, 08:25
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581



Цитата(_Pasha @ Feb 12 2009, 10:54) *
Когда я "находил 10 отличий", дело было в более агрессивном разворачивании функций и небольших циклов в инлайны. Кроме того, сохранение регистров при входе в main() и их восстановление при выходе (т.е. никогда) для моих приложений не нужно. Это все отключаемые вещи. Видимо, набор настроек по умолчанию пока еще не устоялся.
с моей точки зрения, сохранение чего бы то ни было при входе в main() для AVR без ОС - это вообще никогда не нужно! логичнее было бы сделать опцию именно для включения сохранения контекста main() для всяких многозадачных ОС... все-таки для AVR это скорее исключение, чем правило. и, кстати, как пролог main() отключить?

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


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Feb 12 2009, 08:57
Сообщение #4


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(ARV @ Feb 12 2009, 12:25) *
 и, кстати, как пролог main() отключить?

Я делаю так, как делать нельзя  
Код
int main (void) __attribute__((naked));
только потому, что main() никогда не содержит локальных переменных в своем теле. В более общем случае надо указывать атрибут OS_main  http://gcc.gnu.org/ml/gcc-patches/2008-04/msg00283.html 
Цитата
какие именно опции следует включать-выключать, чтобы избавиться от излишней агрессивности оптимизатора?


Была тема недавно, сейчас не могу найти:
1.Поиграться со значением штрафа --param inline-call-cost
2. Не брезговать квалификатором static для местных локальных функций
3. В особо мистических случаях - явно указывать __attribute__((noinline)) до выяснения причин излишней инлайнизации. 

4. -fno-unroll-loops это запретить разворачивать циклы
Go to the top of the page
 
+Quote Post
ARV
сообщение Feb 12 2009, 09:33
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581



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

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

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


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
ReAl
сообщение Feb 12 2009, 09:45
Сообщение #6


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Вот что интересно - на небольшом проекте с scmRTOS (около 10килобайт) 20081205 выигрывает у 20071221, а этот выигрывает у более ранних - байт по 100-150. И при этом наблюдается небольшое уменьшение потребления стека.

А на старых добрых С-шных проектах - устойчивый рост.

Похоже, дело в изменениях в самом gcc - в процессоронезависимой части.

Кстати, avreal при компиляции 3.4.2 и 4.2.0 тоже растёт в объёме. Но там 100 килобайт или 110 - никого не волнует.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Feb 12 2009, 09:47
Сообщение #7


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(ARV @ Feb 12 2009, 10:19) *
Было 18204 байт результрующего кода (WinAVR 20080610), стало 18350 байт.

Итого:
(18350-18204)/18204 = 0,8%
Стоит ли паниковать?
Как говорится, тяжело менять, ничего не меняя, нельзя приготовить омлет, не разбив яйца, на всех не угодишь и т.д.
В конце концов, никто не запрещает Вам пользоваться старой версией или собрать новую под свои личные потребности.


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
ARV
сообщение Feb 12 2009, 09:49
Сообщение #8


Профессионал
*****

Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581



Цитата(ReAl @ Feb 12 2009, 12:45) *
Похоже, дело в изменениях в самом gcc - в процессоронезависимой части.
перенос основного акцента в сторону С++ ?


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Feb 12 2009, 09:52
Сообщение #9


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(ReAl @ Feb 12 2009, 12:45) *
Похоже, дело в изменениях в самом gcc - в процессоронезависимой части.

Кстати да, в отличие от MSPGCC, который навсегда остался в 3-й версии GCC, avr-gcc развивается синхронно с общим проектом. Что, по-моему, является большим плюсом.


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Feb 12 2009, 09:52
Сообщение #10


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Кстати, на младших контроллерах очень полезно включать такую вот опцию:
Код
CFLAGS += -mshort-calls


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
ARV
сообщение Feb 12 2009, 09:54
Сообщение #11


Профессионал
*****

Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581



Цитата(MrYuran @ Feb 12 2009, 12:47) *
Итого:
(18350-18204)/18204 = 0,8%
Стоит ли паниковать?
Как говорится, тяжело менять, ничего не меняя, нельзя приготовить омлет, не разбив яйца, на всех не угодишь и т.д.
В конце концов, никто не запрещает Вам пользоваться старой версией или собрать новую под свои личные потребности.

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

P.S. не надо про ассемблер для тини - я в курсе smile.gif


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Feb 12 2009, 09:56
Сообщение #12


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Я добавил последний AVR-libc  в 20071221. Держу на всякий случай, т.к. к нему вообще никаких претензий не было.



Цитата(demiurg_spb @ Feb 12 2009, 12:52) *
Кстати, на младших контроллерах очень полезно включать такую вот опцию:
Код
CFLAGS += -mshort-calls


СтоИт в аврстудии по умолчанию smile.gif
Go to the top of the page
 
+Quote Post
ARV
сообщение Feb 12 2009, 10:00
Сообщение #13


Профессионал
*****

Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581



Цитата(demiurg_spb @ Feb 12 2009, 12:52) *
Кстати, на младших контроллерах очень полезно включать такую вот опцию:
Код
CFLAGS += -mshort-calls
а в чем смысл? в младших контроллерах все вызовы и так короткие (rcall)... -Wl,-relax помогает не хуже smile.gif


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Feb 12 2009, 10:07
Сообщение #14


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(ARV @ Feb 12 2009, 13:00) *
а в чем смысл? в младших контроллерах все вызовы и так короткие (rcall)... -Wl,-relax помогает не хуже smile.gif
Хорошо. Перефразирую. На контроллерах где по-умолчанию не rcall бывает полезно и причём весьма. Вот только сейчас попробовал на мега16 размер программы уменьшился на 120 байт.
Прикол. А если одновременно и -mshort-calls и -Wl,-relax, то ld падает с сообщением "ld.exe application error"


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
ARV
сообщение Feb 12 2009, 10:24
Сообщение #15


Профессионал
*****

Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581



на моем проекте -mshort-calls вообще не сработала - кучу ошибок при линковке выдало... а вот -relax действует, причем более аккуратно: на маленьких МК не вредит, на больших - помогает, причем существенно (и по скорости тоже выигрыш будет!)


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post

3 страниц V   1 2 3 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 10:39
Рейтинг@Mail.ru


Страница сгенерированна за 0.01499 секунд с 7
ELECTRONIX ©2004-2016