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

 
 
> WinAVR - как оно?, Эффективность компилятора
Evgeny_CD
сообщение Jul 29 2005, 10:47
Сообщение #1


Гуру
******

Группа: СуперМодераторы
Сообщений: 2 065
Регистрация: 11-01-05
Из: Москва
Пользователь №: 1 892



Задумал я тут тулзы унифицировать окончательно. И понял, что альтернативы GNU / GCC нет - ибо, например, покупку IAR, считаю бессмысленной. Я просто понял, что оптимизация кода головой программера (и инвестирование денег в этого программера, и стимулирование оного (сделал хорошо - получи премию), разумеется, вздрачивание - куда же без него) дает больший эффект, чем выигрыш самого лучшего компилятора.

Что касается среды - http://www.eclipse.org/ ок.

С Армами все понятно. Там GCC рулит. Сами проверяли, инфы есть много на эту тему.

Но вот для AVR (иногда надо делать "контроллеры светодиодов" за 1.5$) никогда не пробовал subj. Каково мнение народа?

http://winavr.sourceforge.net/
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
sff
сообщение May 29 2006, 15:22
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 172
Регистрация: 23-04-06
Пользователь №: 16 404



Я WinAVR использую года 2 и за это время сложилось достаточно положительное впечатление, но не без причуд. Похоже на уровне оптимизации WinAVR "не знает" что регистры 8 разрядные (разработчики портировали с другой архитектуры без существенной переработки, это моё личное мнение)

Например возьмём убогий пример, и откоипилируем с опцией -O2, компилятор последний офиц WinAVR (а по сути здесь и не важно)
Код
uint8_t get_small_val()
{
    return 0x8;
}
uint32_t test(uint32_t val)
{
    uint8_t tmp = get_small_val();
    val += (uint16_t)tmp << 8;
    return val;
}


то получим
Код
00000284 <get_small_val>:
     284:    88 e0           ldi    r24, 0x08; 8
     286:    90 e0           ldi    r25, 0x00; 0
     288:    08 95           ret

0000028a <test>:
     28a:    ef 92           push    r14
     28c:    ff 92           push    r15
     28e:    0f 93           push    r16
     290:    1f 93           push    r17
     292:    7b 01           movw    r14, r22
     294:    8c 01           movw    r16, r24
     296:    f6 df           rcall    .-20     ; 0x284 <get_small_val>
     298:    99 27           eor    r25, r25
     29a:    98 2f           mov    r25, r24
     29c:    88 27           eor    r24, r24
     29e:    aa 27           eor    r26, r26
     2a0:    bb 27           eor    r27, r27
     2a2:    8e 0d           add    r24, r14
     2a4:    9f 1d           adc    r25, r15
     2a6:    a0 1f           adc    r26, r16
     2a8:    b1 1f           adc    r27, r17
     2aa:    bc 01           movw    r22, r24
     2ac:    cd 01           movw    r24, r26
     2ae:    1f 91           pop    r17
     2b0:    0f 91           pop    r16
     2b2:    ff 90           pop    r15
     2b4:    ef 90           pop    r14
     2b6:    08 95           ret


Во-первых функции которые возвращают uint8_t расширяются до int (строчка 286), причём как я смотрел совершенно не зависит от опций оптимизаций, конечно есть волшеьная опция -mint8 которая заставляет int принимать 8 бит, но при этом разработчики не гарантируют что все проекты откомпилируются с данной опцией.

Во-вторых по согласованию распределения регистров с переменными, есть 3 типа, в стандартном, бедет всегда такая картина при передаче и возврашение 32 битного числа (292-294, 2aa-2ac). Причем если активно использовать 32 битные типы (да понимаю AVR не затачивался под 32) то таких констукций будет много. Причем нам явно младший байт после сдвига tmp прибавлять не надо, это очевидно. Но GCC этого "не прнимает". Причем если не написать (uint16_t) перед опеорацией сдвига, то компилятор расширит uint8_t до int, а int знаковое, и после сдвига явно сбросит 7 бит, чтобы расширение произошло "корректно".

Есть ещё моного тонкостей на которые я наткнулся...
Но вот если в проекте на так много 32битных вычисление то GCC может очень изащренно оптимизировать код, бывало когда я смотрел дамп аж сам биву давался как он налавкачел.. =)

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

Код
    __asm__ __volatile__ (    
        "ldd %0, Z+14"            "\r\n"
        "andi %0, 0x8C"            "\r\n"
        "lsr %0"                "\r\n"        
        "mov __tmp_reg__, %0"    "\r\n"
        "lsr %0"                "\r\n"
        "swap __tmp_reg__"        "\r\n"
        "or %0, __tmp_reg__"    "\r\n"        
    : "=r" (resp)
    : "z" (data)
    );

Вместо %0, в котором размещается resp, компилятор сам подставит необхолимые регистр, далее указываем компилятору чтобы в Z было data. Если бы в констукции использовался явно какой-то регистр (например после mul) то его нужно было бы включить в список экранируемых регистров ( : "r1" , после : "z" (data) ). При это генерируемы код, если правильно составить макрос булет 100% безопасным.
Тема написания вставок вообще очень интересная, думаю общий обзор дал..

Я использую WinAVR на всех проектах с AVR, а где код сильно тормозил, использовую вставочку =)
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Evgeny_CD   WinAVR - как оно?   Jul 29 2005, 10:47
- - pulsar-17   Мнение хорошее. Компилятор делает хороший код, но ...   Jul 29 2005, 13:56
- - ReAl   Цитата(Evgeny_CD @ Jul 29 2005, 13:47)Задумал...   Jul 29 2005, 19:54
- - impatt   avr-gcc штука классная, причём не надо тырить у IA...   Aug 16 2005, 07:51
- - sensor_ua   Вот пробую под eclipse AVR-GCC4.0.2 сборки klen.or...   Jan 11 2006, 09:38
- - misyachniy   impatt В GCC есть SIGNAL () и INTERRUPT(). Разниц...   Jan 13 2006, 15:12
|- - impatt   Цитата(misyachniy @ Jan 13 2006, 18:12) i...   May 17 2006, 05:02
- - m16   Цитата([banned] @ May 17 2006, 10...   May 17 2006, 06:31
- - beer_warrior   Пользуюсь с 2003 года.Жалоб нет. Надо немножко при...   May 17 2006, 14:55
- - halfdoom   Цитата(Evgeny_CD @ Jul 29 2005, 13:47) И ...   May 18 2006, 09:40
|- - SasaVitebsk   Цитата(halfdoom @ May 18 2006, 12:40) Цит...   May 27 2006, 13:59
|- - halfdoom   Цитата(SasaVitebsk @ May 27 2006, 16:59) ...   Jun 2 2006, 06:51
- - Laksus   Цитатаmisyachniy Jan 13 2006, 18:12 impatt В GCC е...   May 26 2006, 22:52
|- - msn   Пользуюсь больше 4-х лет. Особых замечаний не было...   May 26 2006, 23:10
|- - msn   Пользуюсь больше 4-х лет. Особых замечаний не было...   May 26 2006, 23:10
|- - aesok   Цитата(msn @ May 27 2006, 02:10) .... до ...   May 27 2006, 18:33
- - SpiritDance   А собственнно в чем вопрос у автора, если альтерна...   May 27 2006, 15:14
- - klen   Вставлю вой пятачек с двумя дырачками как выразил...   May 27 2006, 17:29
- - _4afc_   Я тоже пользуюсь только им, но раньше ( а скорее в...   May 29 2006, 12:54
|- - msn   Цитата(_4afc_ @ May 29 2006, 15:54) Я тож...   May 29 2006, 13:51
- - beer_warrior   ЦитатаПричём в принципе заставить хранить там данн...   May 29 2006, 13:52
- - defunct   Цитата(_4afc_ @ May 29 2006, 15:54) Ну и ...   May 29 2006, 14:10
|- - _4afc_   Цитата(defunct @ May 29 2006, 18:10) Цита...   Jun 2 2006, 09:45
- - beer_warrior   ЦитатаСкорее всего это произошло из за того, что в...   May 29 2006, 14:42
- - pitt   "Но вот для AVR (иногда надо делать "кон...   Jun 2 2006, 00:22
- - GetSmart   Неужто лучше ImageCraft ?   Jun 2 2006, 00:51
|- - klen   Цитата(GetSmart @ Jun 2 2006, 04:51) Неуж...   Jun 2 2006, 05:38
- - pitt   Самый сер'езный нрдостаток AVRGCC, с моей точк...   Jun 2 2006, 10:53
- - beer_warrior   Цитатаотсутствие прагмы управления оптимизацией. А...   Jun 2 2006, 12:10
|- - pitt   Цитата(beer_warrior @ Jun 2 2006, 08:10) ...   Jun 2 2006, 12:54
- - WHALE   Цитата(_4afc_ @ Jun 2 2006, 13:45) Больше...   Jun 2 2006, 12:32
- - beer_warrior   ЦитатаТеперь представем себе, что она нам необходи...   Jun 2 2006, 13:07
|- - pitt   Цитата(beer_warrior @ Jun 2 2006, 09:07) ...   Jun 2 2006, 13:59
- - pitt   avrfreaks   Jun 2 2006, 16:56
- - Igor_U   Помогите разобраться. Не собирается проект. Линков...   Jun 8 2006, 07:11


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

 


RSS Текстовая версия Сейчас: 5th August 2025 - 08:25
Рейтинг@Mail.ru


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