|
avr-gcc и IAR, сравнение, но не холивар |
|
|
|
Feb 21 2011, 11:11
|

Знающий
   
Группа: Свой
Сообщений: 723
Регистрация: 29-08-05
Из: Березовский
Пользователь №: 8 065

|
(Предыстория. Можно пропустить.) Я чуть боле двух лет как перебрался на Линукс. Оставил в покое Венду и Вендовые компиляторы. Все хорошо, полет более чем нормальный. Не сочтите за рекламу! Сижу в Ubuntu (и Debian). Просто после Венды мне показалось, что Ubuntu легче освоить, чем другие Линуксы типа Gentoo и Slackware. Тем более столько народа в ней сидит. И тем более, что средства для разработки программ для AVR уже лежат готовые в репозиториях. В общем, живу и в ус не дую. Но меня давно подмывало произвести ревизию бинарного кода, который компилится avr-gcc, и сравнить его с IAR-овским кодом. Но все как-то не получалось сделать. То проект был не большой (типа "хелловорлд" в исполнении светодиодов), и поэтому полноценного сравнения не могло получиться. То проект наоборот был большой, и не хватало времени на его портацию в другую среду. А то проект коммерческий -- типа нельзя публиковать. В общем, все как-то не стыковалось с моими чаяниями. И вот, внезапно выпало счастье заняться небольшим "не засекреченным" проектом. Я его начинал создавать на Mega48. Но в какой-то момент, по мере его роста не хватило флеши, пришлось перебираться на Mega8. Бывает. Не проблема! Переписал. Все легко поднялось и заработало. И на второе счастье у меня оказались свободными выходные (уже прошедшие). Чем я и воспользовался. Откопал старый винт с установленной Вендой и IAR-ом, подцепил к компу.. и на до же! Оказывается я все еще помню, как в Венде тыкать мышкой! Короче, перенес проект под IAR, скомпилировал и поразился. (А вот теперь по делу.) Понятно, что поскольку компиляторы разные, они и должны создавать разный по объему код. Если размер кода (бинарник) чуть-чуть превышает 4КБ, то, как вы думаете, какая разница будет в объеме сгенерированных компиляторами кодов? Я ожидал получить разницу в размере кода ну 100, ну 200 байт. А получил аж 1200 байт. Солидный кусок! Так сильно gcc меня еще не опускал. Обидно, да-а? Конечно, на мое впечатление еще оказал воздействие тот факт, что если бы я изначально писал под IAR-ом, то мне бы не пришлось по ходу менять проц. Но ведь сам выбрал Линух и gcc! Но это все эмоции. Мне же интересно было разобраться с состоянием дел вообще. Сначала я засел за оптимизацию. Начал перебирать различные комбинации ключей в надежде как можно более сильно сократить код и под gcc, и под IAR-ом. Да. Мне это удалось сделать. Код немного ужался и там, и там, но все равно разница в килобайт с хвостиком сохранилась: один компайлер генерит код размером в 2596 байт, другой -- 3772 байта. Я оцениваю размер кода по hex-файлу, который непосредственно заливается во флешь. Т.е. здесь вообще без дураков, которых можно обмануть не посчитав, допустим, размер таблицы векторов. Или опустив размер вспомогательных (ну или как их правильно-то назвать?) функций, который компилятор сам может создавать, увидев повторяющиеся участки кода. (Вопрос.) Коллеги, не впадая в безумие священных войн, вы можете помочь установить истину в работе компиляторов -- почему они дают такой существенно разный результат? Возможно что-то я не правильно делаю. (А это обязательно так!) Но мне, да и многим из вас, хотелось бы знать -- в каком отношении по объему друг к другу эти компиляторы "готовят" код. Полный код проекта я могу предоставить. Единственная просьба -- по возможно соблюдать одинаковость исходных кодов в обоих версиях (для gcc и для IAR). Ну, например, в gcc я есть команда для запрета прерываний cli(), и в IAR-е она тоже есть -- __disable_inerrupt(). Это все легко соблюсти. Сложнее соблюсти, допустим, программные задержки. В библиотеке gcc есть функции _delay_us() и _delay_ms(), а в IAR-е таковых нет. Но по жизни очень часто бывает так, что эти в программе без задержек никак. Поэтому я допускаю, что в исходниках для IAR-а, будут использованы приемы типа Код #define FCLK (11059200) #define delay_ms(n) __delay_cycles((FCLK / 1000) * (n)); #define delay_us(n) __delay_cycles((FCLK / 1000000) * (n)); Есть еще одно замечание. Исходный текст написан не очень правильно с точки зрения профи. Пока его улучшать не надо! Я поясню. Дело в том, что этот проект не коммерческий, и этот девайс не предполагается кому-то продавать. Кроме того, передо мной стаояла задача: достаточно тупо слепить устройство и установить его в работу, не доводя его до витринного блеска. Поэтому, например, вместо того, чтобы работать с функциями строк из флеша (avr/pgmspace.h), я их тупо прописываю в printf() и не парюсь, что при этом в Оперативе создается их копия. Просто пока не до этого! В общем, давайте _пока_ не будем трогать исходники. Ибо я хочу посмотреть на возможности компиляторов для среднестатистического быдлокодера, который пишет проги вот на таком вот уровне. А когда мы совместными усилиями получим какие-то цифры, для сравнения компиляторов, вот тогда уже можно будет отрываться и пытаться уникальными для конкретного компилятора приемами уменьшить объем кода. Не думайте, что я пытаюсь вашими руками написать свой проект! Проект уже работает и приносит определенную пользу. Дальнейшее улучшение проекта пойдет не по направлению уменьшения кода или вылизыванию в нем ошибок, а по направлению увеличения функциональности (насыщенности). Но даже и это пока не нужно. У меня другая задача -- разобраться с компиляторами. Надеюсь, вы понимаете меня, и топик не съедет в бессмысленный срач. Пожалуйста, задавайте ваши вопросы.
--------------------
Хочешь рассмешить Бога -- расскажи ему о своих планах!
|
|
|
|
|
 |
Ответов
|
Feb 22 2011, 05:35
|
;
     
Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509

|
Цитата(zhevak @ Feb 21 2011, 18:18)  Как Вы считали? (87-23)+(86-25)=125 слов, имея ввиду только разницу между нормальными командами и этой, придурошной  Цитата(neiver @ Feb 21 2011, 18:30)  Думаю, что не на 250 байт, поменьше. А вообще, IAR более оптимально использует косвенную адресацию со смещением. AVR-GCC приходится явно намекать какую адресацию использовать, например работая с переменной через указатель. Ну, поменьше, это ж на глазок было. Гцц как ни намекай, он иногда в такую бяку сваливается  , жаждешь от него этих "со смещением", а их все нету. Это РТЛ деревья, видать, по мозгам сильно проехались. Не умеет он по-настоящему юзать три указателя. Еще Гцц не любит действия со старшим битом. Еще... да нафиг! Зато "на переднем крае" всегда.
|
|
|
|
|
Feb 22 2011, 11:57
|

Знающий
   
Группа: Свой
Сообщений: 723
Регистрация: 29-08-05
Из: Березовский
Пользователь №: 8 065

|
Ну вроде как стало соизмеримо (если не сказать сравнялось в ноль!): gcc: 2787(text) + 30(data) = 2817 байт флеши. IAR: 2596(text) + 221(data) = 2817 байт флеши Но что значит "без использования"? Цитата(klen @ Feb 22 2011, 14:08)  ''чистая культура" без использования библиотечных аля printf Вы вызовы просто закомментировали или сохранили функциональность, заменив их на strcpy() и itoa()? В исходниках для IAR-а вызовы printf() не удалены и не заменены. Т.е. как бы условия состязания нарушены. Вчера ночью попробовал postmessage(), которую вызывают оба прерывания, сделать inline -- ни какой реакции  , как было, так и осталось. А пока резюме такое (извините, оно получилось несколько персонифицированным конкретно ко мне) 1. Функции printf и их модификации в тулчейне для avr имеют большие размеры, чем в IAR. Поэтому, если стоит вопрос компактности кода, их использования следует избегать. 2. Не забывать, что функции printf имеют несколько реализаций, выбор которых через ключи линковщика -Wl, -u, ... Ну что, если других предложений нет, тогда переходим к фазе оптимизации два -- оптимизация кода. Тут я вижу сразу две точки приложения: 1. Заменить вызовы printf() на strcpy(), strcat() и itoa() 2. Сделать по уму, заменить функции работы с оперативой на функции работы с констатами во флеш, т.е. вместо strcat() использовать strcat_P() и т.д. Ну вот пожалуй это все, что я вижу, что можно сделать, чтобы легко выдавить из gcc. Давить наверняка можно еще, но это уже будет сродни национальным танцам народов севера с использованием ударных музыкальных инструментов. По крайней мере для себя я понял, почему в первом приближении на gcc не достигается компактность кода присущая IAR, и что следует делать, что бы хоть как-то уменьшить размер кода. ГОСПОДА, СПАСИБО ЗА КОЛЛАБОРАЦИЮ! Через какое-то время я сообщу, что у меня получилось после реализации фазы два.
--------------------
Хочешь рассмешить Бога -- расскажи ему о своих планах!
|
|
|
|
Сообщений в этой теме
zhevak avr-gcc и IAR Feb 21 2011, 11:11 _Pasha Может быть, может быть...
Код выложите-то? Feb 21 2011, 11:32 zhevak Цитата(_Pasha @ Feb 21 2011, 16:32) Может... Feb 21 2011, 11:46  MrYuran Цитата(zhevak @ Feb 21 2011, 14:46) Венду... Feb 21 2011, 12:08   demiurg_spb Глянул Ваш Makefile - там можно сказать для хороше... Feb 21 2011, 12:56    zhevak Цитата(demiurg_spb @ Feb 21 2011, 17:56) ... Feb 21 2011, 13:33 dimka76 Для корректного сравнения компиляторов не надо пол... Feb 21 2011, 11:44 zhevak Исходники проектов выложил. Движок форума файлы .t... Feb 21 2011, 12:02 MrYuran ЦитатаПонятно, что поскольку компиляторы разные, о... Feb 21 2011, 11:44 neiver IAR и GCC оба хорошие компиляторы, у каждого свои ... Feb 21 2011, 11:46 zhevak В проекте имеется файл hal.c (абстрагирование от а... Feb 21 2011, 13:13 neiver Да, да. Это феерическое растранжирование памяти в ... Feb 21 2011, 13:27 zhevak Цитата(neiver @ Feb 21 2011, 18:27) Решен... Feb 21 2011, 14:05 MrYuran Цитата20e: ff 91 pop r31
210: e... Feb 21 2011, 13:40 neiver Параметры линкера:
-Wl,-u,vfprintf -lprintf_min
дл... Feb 21 2011, 13:57 _Pasha По приведенным фрагментам.
push/pop ld/st - что в ... Feb 21 2011, 14:01 neiver При использовании близких по функциональности верс... Feb 21 2011, 14:14 zhevak в ответ на http://electronix.ru/forum/index.php?sh... Feb 21 2011, 14:40 _Pasha Цитата(zhevak @ Feb 21 2011, 17:40) и?
Н... Feb 21 2011, 14:45 zhevak Как Вы считали? У меня другие цифры.
(87 + 86) * ... Feb 21 2011, 15:18 neiver Думаю, что не на 250 байт, поменьше. Не всегда Lds... Feb 21 2011, 15:30 vitmeat Попробуйте заменить стандартный gcc'ый printf ... Feb 22 2011, 23:46 _Pasha Наткнулся на интересную бяку. Для начала, убрал вс... Feb 23 2011, 11:44 demiurg_spb Цитата(_Pasha @ Feb 23 2011, 14:44) С деф... Feb 26 2011, 17:02  zhevak Цитата(demiurg_spb @ Feb 26 2011, 22:02) ... Feb 26 2011, 21:14   zhevak Похоже что всё, приехали. Дальнейшая борьба за ужа... Mar 1 2011, 02:14    MrYuran Цитата(zhevak @ Mar 1 2011, 05:14) IAR по... Mar 1 2011, 07:27     zhevak Цитата(MrYuran @ Mar 1 2011, 12:27) Зато,... Mar 1 2011, 08:32      zltigo QUOTE (zhevak @ Mar 1 2011, 11:32) исполь... Mar 1 2011, 20:38       zhevak Цитата(zltigo @ Mar 2 2011, 01:38) Вы, на... Mar 1 2011, 22:46        IgorKossak Цитата(zhevak @ Mar 2 2011, 00:46) Э-э...... Mar 2 2011, 09:56         demiurg_spb Наверное можно подвести кое какие итоги.
Я бы хоте... Mar 2 2011, 10:31          zhevak Цитата(demiurg_spb @ Mar 2 2011, 15:31) Н... Mar 2 2011, 10:57           demiurg_spb Пинят и пинать - два разных слова:-)
Поэтому я и п... Mar 2 2011, 11:56            zhevak Цитата(demiurg_spb @ Mar 2 2011, 16:56) П... Mar 2 2011, 14:17             demiurg_spb Я готов потестить под различными версиями gcc.
Воп... Mar 2 2011, 14:50              klen Цитата(demiurg_spb @ Mar 2 2011, 17:50) Я... Mar 2 2011, 22:03               demiurg_spb FreeRTOS и чистый СИ - не понял как мы это сможем ... Mar 3 2011, 09:41                MrYuran Цитата(demiurg_spb @ Mar 3 2011, 12:41) F... Mar 4 2011, 06:42                 demiurg_spb Цитата(MrYuran @ Mar 4 2011, 09:42) Скоре... Mar 4 2011, 10:50                  MrYuran Цитата(demiurg_spb @ Mar 4 2011, 13:50) В... Mar 4 2011, 10:56           MrYuran Цитата(zhevak @ Mar 2 2011, 13:57) Я попы... Mar 2 2011, 11:57    Сергей Борщ Если я правильно помню принцип работы strcpy_P, то... Mar 1 2011, 09:53     Сергей Борщ Взял проект из первого сообщения. Скомпилил со сво... Mar 1 2011, 14:47      MrYuran Цитата(Сергей Борщ @ Mar 1 2011, 17:47) Е... Mar 1 2011, 15:01      zhevak Я не понял. Что, пьянка -- продолжается что ли? (Э... Mar 1 2011, 17:38  _Pasha Цитата(demiurg_spb @ Feb 26 2011, 20:02) ... Mar 1 2011, 06:54   demiurg_spb Цитата(_Pasha @ Mar 1 2011, 09:54) Это да... Mar 1 2011, 13:02 Nixon Возможно вы просто взяли не совсем удачный проект ... Mar 1 2011, 08:58 _Pasha Цитата(Nixon @ Mar 1 2011, 11:58) Возьмит... Mar 1 2011, 10:36 zhevak Цитата(Nixon @ Mar 1 2011, 13:58) Возможн... Mar 1 2011, 14:39 _Pasha Блин, забыли про такую сущность, как Pascal Stang Mar 4 2011, 11:18
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|