|
|
  |
WinAVR-20070122 еще сырой?, ошибки оптимизации |
|
|
|
Feb 24 2007, 00:43
|
Знающий
   
Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484

|
Цитата(gormih @ Feb 24 2007, 00:34)  Цитата(aesok @ Feb 23 2007, 23:58)  Уважаемый gormih, этот топик о проблеммах в WinAVR. Если Вы хотите пообсуждать какой компилятор лучше, пожалуйста начните новую тему. Анатолий. Уважаемый Анатолий! Я понимаю Вашу озабоченность по поводу того, что здесь может начаться дискуссия по поводу сравнения характеристик того или иного компилятора, однако смею Вас уверить, что мой пост имеет прямое отношение к проблеме оптимизации, как ни крути. Однако, если Вам не нравится перспектива обсуждать данную тему - то по моему ее можно просто закрыть - было сказано, что проблема будет решена в следующих версиях... возможно лет через 10... Патчи для решения проблеммы с размером main() уже подготовленны. Анатолий.
|
|
|
|
|
Feb 24 2007, 12:38
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(gormih @ Feb 23 2007, 23:51)  WinAVR еще долго будет сырым по определению. Все таки продукт не коммерческий... Хотите получить оптимизаию - пользуйте IAR или на худой конец CodeVision Цитата(gormih @ Feb 24 2007, 00:34)  Уважаемый Анатолий!
Я понимаю Вашу озабоченность по поводу того, что здесь может начаться дискуссия по поводу сравнения характеристик того или иного компилятора, однако смею Вас уверить, что мой пост имеет прямое отношение к проблеме оптимизации, как ни крути. Однако, если Вам не нравится перспектива обсуждать данную тему - то по моему ее можно просто закрыть - было сказано, что проблема будет решена в следующих версиях... возможно лет через 10... Хотите поговорить про оптимизацию ... Давайте поговорим... Вот вам небольшой тестик: Нужно скопировать один массив на 255 байт в два других. Вот код: Код unsigned char sr[255]; unsigned char ds1[255]; unsigned char ds2[255];
int main( void ) { unsigned char i=255; unsigned char *ps=sr; unsigned char *pd1=ds1; unsigned char *pd2=ds2;
do { *pd1++=*ps; *pd2++=*ps++; } while (--i);
return 0; } Предлагаю поступить так, Вы компилируете этот код под IAR а я под WinAVR-20060421 при любом уровне оптимизации Ну и дальше каждый выкладывает сюда результат - количество тактов на выполнение цикла. Готовы ? P.S. WinAVR-20070122 действительно очень сырой, я попробовал поставить его в надежде что исчезнут некоторые глюки предыдущей версии, но оказалось что при компиляции куска проги которая раньше занимала ~2200байт в новой версии у меня получилось 2600+ байт. Честно говоря я даже разбираться не стал в чем дело и просто его стер.
|
|
|
|
|
Feb 24 2007, 13:12
|
Участник

Группа: Участник
Сообщений: 44
Регистрация: 22-06-06
Из: Kharkiv, UA
Пользователь №: 18 284

|
Цитата(aesok @ Feb 23 2007, 23:43)  Патчи для решения проблеммы с размером main() уже подготовленны. Когда эти патчи будут доступны? (и где?) И, как вы считаете, все-таки какую версию WinAVR стоит сейчас использовать? Спасибо за Ваши ответы!
|
|
|
|
|
Feb 24 2007, 13:32
|
Знающий
   
Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484

|
Цитата(ahulap @ Feb 24 2007, 13:12)  Цитата(aesok @ Feb 23 2007, 23:43)  Патчи для решения проблеммы с размером main() уже подготовленны.
Когда эти патчи будут доступны? (и где?) И, как вы считаете, все-таки какую версию WinAVR стоит сейчас использовать? Спасибо за Ваши ответы! В WinAVR-20070122 есть два существенных изменения: 1. Добавленна поддержка 256КВ-ных мег. 2. WinAVR-2006... + AVRStudio 4.12 позволяет коректно отлаживать не более 64КВ кода. В WinAVR-20070122 + AVRStudio 4.13 эта проблема решена. Если вы используете 128-е или 256-е меги и ваш проект больше 64КВ то лучше WinAVR-20070122 + AVRStudio 4.13, если нет то на ваш выбор. Анатолий.
Сообщение отредактировал aesok - Feb 24 2007, 13:33
|
|
|
|
|
Feb 26 2007, 22:55
|

nofb
  
Группа: Свой
Сообщений: 430
Регистрация: 18-05-06
Из: Москва, Зеленоград
Пользователь №: 17 218

|
Цитата(singlskv @ Feb 24 2007, 12:38)  Хотите поговорить про оптимизацию ... Давайте поговорим... Вот вам небольшой тестик: Нужно скопировать один массив на 255 байт в два других. Вот код: Код unsigned char sr[255]; unsigned char ds1[255]; unsigned char ds2[255];
int main( void ) { unsigned char i=255; unsigned char *ps=sr; unsigned char *pd1=ds1; unsigned char *pd2=ds2;
do { *pd1++=*ps; *pd2++=*ps++; } while (--i);
return 0; } Предлагаю поступить так, Вы компилируете этот код под IAR а я под WinAVR-20060421 при любом уровне оптимизации Ну и дальше каждый выкладывает сюда результат - количество тактов на выполнение цикла. Готовы ? P.S. WinAVR-20070122 действительно очень сырой, я попробовал поставить его в надежде что исчезнут некоторые глюки предыдущей версии, но оказалось что при компиляции куска проги которая раньше занимала ~2200байт в новой версии у меня получилось 2600+ байт. Честно говоря я даже разбираться не стал в чем дело и просто его стер. Не собираюсь этого делать по двум причинам: 1) Не собираюсь пользовать WinAVR просто потому, что уже неоднократно сравнивал для своих задач уровни оптимальности кода в разных компиляторах. Пользуюсь исключительно codevision как самый простой в понимании, вмеру навороченный компилятор с оптимальным уровнем качества генерируемого кода. Ваша задача явно заточена под winavr, не спорю что именно она будет скомпилироваа в нем самым оптимальным способом. 2) Вообще редко пишу на си, а когда это делаю WinAVR напрягает сложностью вставки ассемблерных вставок. Ни для кого не секрет, что оптимальней связки си+асм нет. WinAVR упорно игнорирует данное обстоятельство, делать ассемблерные вставки по меньшей мере неудобно. P.S: Вашу задачу я бы вообще написал на асме :-) Си использую только при необходимости сложных вычислений.
Сообщение отредактировал gormih - Feb 26 2007, 22:59
--------------------
Это не то что вы подумали ...
|
|
|
|
|
Feb 26 2007, 23:28
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(gormih @ Feb 26 2007, 22:55)  Не собираюсь этого делать по двум причинам:
1) Не собираюсь пользовать WinAVR просто потому, что уже неоднократно сравнивал для своих задач уровни оптимальности кода в разных компиляторах. Пользуюсь исключительно codevision как самый простой в понимании, вмеру навороченный компилятор с оптимальным уровнем качества генерируемого кода. Ваша задача явно заточена под winavr, не спорю что именно она будет скомпилироваа в нем самым оптимальным способом. ну я так понимаю что Вы все-таки попробовали скомпилировать мою задачку под CV(IAR) и посмотрев на код отказались от попыток сравнивать ? Кстати, задачка НЕ написана под конкретный компилятор! Это просто вариант когда есть 3 источника/приемника длинных данных Выдернуто из реальной программы (с большими упрощениями) Да и написано на чистом C как в учебниках учат... А насчет неоптимальности получаемого Вами кода, так на C нужно тоже не абы как писать или Вы рассчитываете что за Вас все компилятор сделает ? Цитата 2) Вообще редко пишу на си, а когда это делаю WinAVR напрягает сложностью вставки ассемблерных вставок. Ни для кого не секрет, что оптимальней связки си+асм нет. WinAVR упорно игнорирует данное обстоятельство, делать ассемблерные вставки по меньшей мере неудобно. ну это дело привычки Цитата P.S: Вашу задачу я бы вообще написал на асме :-) Си использую только при необходимости сложных вычислений. попробуйте написать лучше чем сгенерит WinAVR...(в данной конкретной задаче)
|
|
|
|
|
Feb 27 2007, 12:52
|

nofb
  
Группа: Свой
Сообщений: 430
Регистрация: 18-05-06
Из: Москва, Зеленоград
Пользователь №: 17 218

|
Цитата(singlskv @ Feb 26 2007, 23:28)  А насчет неоптимальности получаемого Вами кода, так на C нужно тоже не абы как писать или Вы рассчитываете что за Вас все компилятор сделает ? Не надеюсь. Да и не собираюсь думать, чего он там сделает. Просто возьму и напишу на асме - благо, что для меня это не проблема. У всех компиляторов свои методы компиляции тех или иных выражений на си, и думать, выяснять как скомпилирует выражение си конкретный компилятор не всегда есть время, согласитесь. Проще взять компилятор, который в большинстве случаев не давит на мозг своими наворотами и оптимально компилирует, либо просто написать на асме. Писать на асме вообще полезно - становишся ближе к железке, код становится чище и светлее :-) Спорить можно бесконечно, таких тем на форуме и других форумах великое множество. Но, в коенчном счете спорить на эту тему бесполезно - для большинства приложений нет никакой разницы на чем написана программа, главное чтобы она работала и программист понимал, как она работает (что бывает далеко не всегда)
--------------------
Это не то что вы подумали ...
|
|
|
|
|
Feb 27 2007, 14:57
|

nofb
  
Группа: Свой
Сообщений: 430
Регистрация: 18-05-06
Из: Москва, Зеленоград
Пользователь №: 17 218

|
Цитата(beer_warrior @ Feb 27 2007, 14:52)  Цитата Да и не собираюсь думать, чего он там сделает. Просто возьму и напишу на асме - благо, что для меня это не проблема. Это говорит об одном - предметом вы не владеете, да и углублятся не собираетесь. Зато апломба поучать других у вас выше крыши. А Ваше высказывания кроме того, что Вы хам - уж точно ничего не говорит. Я программированием микропроцессоров занялся еще в 9 классе средней школы. Вам уж точно меня не учить.
--------------------
Это не то что вы подумали ...
|
|
|
|
|
Feb 27 2007, 15:08
|

Профессионал
    
Группа: Свой
Сообщений: 1 065
Регистрация: 8-10-05
Из: Kiev, UA
Пользователь №: 9 380

|
Цитата А Ваше высказывания кроме того, что Вы хам - уж точно ничего не говорит. Я программированием микропроцессоров занялся еще в 9 классе средней школы. Вам уж точно меня не учить. Судя по горячности сейчас вы в десятом. Вам было предложено провести технический тест. Вы съехали. Зато легко перешли на личности. Это легче, чем разбираться в тонкостях оптимизации. Впрочем диагноз ясен, продолжать не не буду.
--------------------
Вони шукають те, чого нема, Щоб довести, що його не існує.
|
|
|
|
|
Feb 27 2007, 16:03
|

nofb
  
Группа: Свой
Сообщений: 430
Регистрация: 18-05-06
Из: Москва, Зеленоград
Пользователь №: 17 218

|
Цитата(beer_warrior @ Feb 27 2007, 15:08)  Цитата А Ваше высказывания кроме того, что Вы хам - уж точно ничего не говорит. Я программированием микропроцессоров занялся еще в 9 классе средней школы. Вам уж точно меня не учить. Судя по горячности сейчас вы в десятом. Вам было предложено провести технический тест. Вы съехали. Зато легко перешли на личности. Это легче, чем разбираться в тонкостях оптимизации. Впрочем диагноз ясен, продолжать не не буду. Тонкости оптимизации я изучал на дургом уровне. Сейчас дам Вам кусок кода, в котором будет не 3 строчки, а 200... Перекомпилируем в разных компиляторе. Вот тогда посмотрим. А то, что приведенный пример заточен под конкретный компилятор - и без того ясно. Говорить об оптимизации, беря за основу 3 строки на си - по меньшей мере не адекватно. Да мне это и не особо интересно. Я всего лишь высказал свое СУБЪЕКТИВНОЕ мнение, подкрепленное некоторыми практическими знаниями, а Вы сразу обвинили меня в некомпетентности, уклонении от темы итд. GNU GPL проекты никогда не отличались качеством выше, чем у всех коммерческих проектов, утверждать обратное опрометчиво, и Вам это должно быть хорошо известно. Основная причина придумана не мной - серьезный зрелый профессионал всегда найдет, как использовать свой талант во благо своего материального благополучия. На GNU GPL же тренируются молодые перспективные программисты, которые в основной своей массе через несколько лет перестают трудится во благо всего мира, и переходят в серьезные коммерческие проекты. Так кто по Вашему лучше напишет код - молодой перспективный, или зрелый зубр? Ответ сам собой напрашивается.
--------------------
Это не то что вы подумали ...
|
|
|
|
|
Feb 27 2007, 16:42
|

nofb
  
Группа: Свой
Сообщений: 430
Регистрация: 18-05-06
Из: Москва, Зеленоград
Пользователь №: 17 218

|
Цитата(beer_warrior @ Feb 27 2007, 16:32)  Читайте внимательнее. Никто не оспаривает уникальности личностей пары десятков зубров линуксостроения, однако эта пара десятков далеко не все те, кто является основным двигателем по развитию GNU GPL. Именно поэтому я написал ОСНОВНАЯ МАССА. Цитата(beer_warrior @ Feb 27 2007, 16:32)  Впрочем не увидел обещанного кода. Или он специальный невидимый? Только пожалуйста на чистом платформонезависимом С. Под рукой не нашел примера, который можно было бы так легко выложить. А по памяти - возьмите любой универсальный драйвер под индикатор на основе hd44780, и потренеруйтесь :-) Например вот это:
Сообщение отредактировал gormih - Feb 27 2007, 16:51
--------------------
Это не то что вы подумали ...
|
|
|
|
|
Mar 5 2007, 16:19
|
Участник

Группа: Участник
Сообщений: 44
Регистрация: 22-06-06
Из: Kharkiv, UA
Пользователь №: 18 284

|
Вот еще что обнаружил:
есть маленнькая функция static void putc(unsigned char c) { while ( !(UCSRA & _BV(UDRE)) ) ; UDR = c; } и вызывается из очень многих мест. Но компиллятор ее везде делает инлайном, что съедает довольно много кода: 3fba: 5d 9b sbis 0x0b, 5 ; 11 3fbc: fe cf rjmp .-4 ; 0x3fba <main+0x6cc> 3fbe: 9c b9 out 0x0c, r25 ; 12
PS: оптимизация -Os. Стоит в нее добавить хотя бы один NOP - реализуется как функция и call'ы.
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|