|
|
  |
Разница CodeVision и WinAVR |
|
|
|
Jul 24 2006, 22:42
|
Местный
  
Группа: Участник
Сообщений: 328
Регистрация: 1-06-06
Из: USA
Пользователь №: 17 672

|
Цитата(Woodoo @ Jul 24 2006, 15:31)  Если речь идет только о портах с адресом 0...0x1F (0x20...0x3F) то это так, но не забудем что к другим портам, с адресом 0x20...0x3F (0x40...0x5F) это не применимо, и компилятор всегда скомпилет чтото типа in r16, abc andi r16, ~(1<<bit_name) out abc, r16 Не совсем правда: для портов, которые не имеют команды SBI будет сгенерировано обращение к памяти. WinAVR команду OUT давно не использует.
--------------------
|
|
|
|
|
Jul 24 2006, 23:06
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата(Serg79 @ Jul 24 2006, 14:55)  А CodeVisionAVR C Compiler пройденный этап. И Я к ниму уже врядли когда вернусь после WinAVR. И правильно. Хотя: А IAR еще лучше, но по 5. А WinAvr хуже, но бесплатно A CodeVision еще хуже, но по 3.  Цитата(Serg79 @ Jul 24 2006, 14:55)  А CodeVisionAVR C Compiler пройденный этап. И Я к ниму уже врядли когда вернусь после WinAVR. И правильно. Хотя: А IAR еще лучше, но по 5. А WinAvr хуже, но бесплатно A CodeVision еще хуже, но по 3.
|
|
|
|
Guest_Serg79_*
|
Jul 25 2006, 09:04
|
Guests

|
Цитата WinAVR не хуже, он просто сложнее в освоении и лишен всяких вкусностей коммерческого продукта. Полностью согласен. А на мой взгляд, он самый "равный" среди "равных". WinAVR
|
|
|
|
|
Jul 25 2006, 10:59
|

Частый гость
 
Группа: Свой
Сообщений: 175
Регистрация: 26-01-06
Из: Sevastopol
Пользователь №: 13 664

|
Цитата(beer_warrior @ Jul 25 2006, 09:44)  WinAVR не хуже, он просто сложнее в освоении и лишен всяких вкусностей коммерческого продукта. Насколько слышал, у него есть проблемы с адресацией данных, размещенных в памяти программ. Отсюда и появляются куча макро наподобие Код #define PRG_RDB(addr) (*(PROGMEM char *)(addr)) Макрос из AVR-USB для совместимости с IAR (правое - это IAR'овское выражение). У IAR же нет таких заморочек, используется обычный синтаксис при условии, что указатель описан правильно. Либо, как вариант, можно использовать generic тип указателя, адресующего любой тип памяти.
|
|
|
|
|
Jul 25 2006, 11:09
|

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

|
Цитата Насколько слышал, у него есть проблемы с адресацией данных, размещенных в памяти программ. Есть такая, буква, но это единственный серьезный недостаток. На практике однородные типы данных типа строк обрабатываються нормально, проблемы имеються только со структурами. Тут уже приходится мириться. По части оптимизации кода и гибкости настроек ИАРу не уступает.
--------------------
Вони шукають те, чого нема, Щоб довести, що його не існує.
|
|
|
|
|
Jul 25 2006, 11:22
|

Частый гость
 
Группа: Свой
Сообщений: 175
Регистрация: 26-01-06
Из: Sevastopol
Пользователь №: 13 664

|
Цитата(beer_warrior @ Jul 25 2006, 14:09)  По части оптимизации кода и гибкости настроек ИАРу не уступает. Если писать со знанием особенностей конкретного компилятора, то охотно верю. USB драйвер под WinAVR (gcc) компилируется компактнее, чем IAR'ом, поскольку специально оптимизирован под gcc (но не содержит непереносимых между этими компиляторами вещей). Однако, попытка скомпилировать сторонний код, а именно - реализацию AES декриптора от Atmel, - показала, что для такого кода gcc существенно менее эффективен по сравнению с IAR (1.5 и 1 килобайт кода соответственно). Впрочем, не утверждаю, что тот код не оптимизировался под IAR (хотя по виду не похоже) и не имею желания устраивать войну компиляторов. Просто попробовал на конкретном примере и понял, что в конкретной ситуации IAR эффективнее (и позволил решить задачу втискивания кода в boot область, что не удалось с gcc, хотя код драйвера USB под ним компилировался компактнее на 200 байтов).
|
|
|
|
|
Jul 25 2006, 11:31
|

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

|
Цитата Если писать со знанием особенностей конкретного компилятора, то охотно верю. USB драйвер под WinAVR (gcc) компилируется компактнее, чем IAR'ом, поскольку специально оптимизирован под gcc (но не содержит непереносимых между этими компиляторами вещей). Истинную правду говорите. Очень многое зависит от того как писать. Цитата Однако, попытка скомпилировать сторонний код, а именно - реализацию AES декриптора от Atmel, - показала, что для такого кода gcc существенно менее эффективен по сравнению с IAR (1.5 и 1 килобайт кода соответственно). Это стандартная Атмеловская аппликуха? Надо будет попробовать. Давно хотел поиметь для теста реальную задачу, чтобы как следует проанализировать оптимизацию IAR и WinAVR.
--------------------
Вони шукають те, чого нема, Щоб довести, що його не існує.
|
|
|
|
|
Jul 25 2006, 15:31
|
Местный
  
Группа: Участник
Сообщений: 328
Регистрация: 1-06-06
Из: USA
Пользователь №: 17 672

|
Цитата(beer_warrior @ Jul 25 2006, 07:09)  По части оптимизации кода и гибкости настроек ИАРу не уступает. Увы, уступает... Чего стоит хотя бы отсутствие прагмы управления оптимизацией. Но $3000 за одно рабочее место, это, конечно, не стоит. Да здравствует WinAVR!
--------------------
|
|
|
|
|
Jul 25 2006, 17:35
|

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

|
Цитата его стоит хотя бы отсутствие прагмы управления оптимизацией. Что вы вцепились в эту прагму? Это же очень частный случай. Кроме того если нужен разный уровень оптимизации, разделите код пофайлово и будет вам щастие. BTW, перечитывал давеча gcc manual: Цитата GCC supports several types of pragmas, primarily in order to compile code originally written for other compilers. Note that in general we do not recommend the use of pragmas SeeSection 5.24 [Function Attributes], page 229, for further explanation. А уж атрибутами там можно такого накрутить
--------------------
Вони шукають те, чого нема, Щоб довести, що його не існує.
|
|
|
|
|
Jul 25 2006, 17:37
|

Частый гость
 
Группа: Свой
Сообщений: 175
Регистрация: 26-01-06
Из: Sevastopol
Пользователь №: 13 664

|
Цитата(beer_warrior @ Jul 25 2006, 14:31)  Это стандартная Атмеловская аппликуха? Надо будет попробовать. Давно хотел поиметь для теста реальную задачу, чтобы как следует проанализировать оптимизацию IAR и WinAVR. Это Appnote по реализации AES boot loader'а от атмела. Проект сделан под IAR, но я в попытках переделать этот проект под USB уперся в размер кода, чтобы впихнуть его с кучкой дополнительных функций и USB HID интерфейсом в 4 килобайта меги32. Потому проводил разные эксперименты по поводу того, как уменьшить размер кода, и пробовал компилировать разными компиляторами (а драйвером avr-usb поддержаны сегодня только gcc и IAR). Вышло, что сказал: сам драйвер компактнее транслируется gcc (но он под него оптимизирован, как и написано в его описании). А вот на коде AES я проиграл полкилобайта. Остался на IAR.
|
|
|
|
|
Jul 25 2006, 18:50
|
Местный
  
Группа: Участник
Сообщений: 328
Регистрация: 1-06-06
Из: USA
Пользователь №: 17 672

|
Цитата(beer_warrior @ Jul 25 2006, 13:35)  Цитата чего стоит хотя бы отсутствие прагмы управления оптимизацией. Что вы вцепились в эту прагму? Это же очень частный случай. Кроме того если нужен разный уровень оптимизации, разделите код пофайлово и будет вам щастие. Я уверен, что Вам хорошо знакомы принципы инкапсуляции, так вот, если "разделить код пофайлово", то о них придеться забыть и никакого "щастия" не будет! А так хочется управлять оптимизацией локально.
Сообщение отредактировал pitt - Jul 25 2006, 18:51
--------------------
|
|
|
|
|
Jul 25 2006, 22:16
|
Участник

Группа: Новичок
Сообщений: 17
Регистрация: 24-05-06
Пользователь №: 17 392

|
AVRGCC 4.1.1При любой оптимизации: Код PORTD |= ( 1 << 1 ); d2: 91 9a sbi 0x12, 1 ; 18 При отключеной оптимизации: Код PORTD |= ( 1 << 1 ); de: a2 e3 ldi r26, 0x32; 50 e0: b0 e0 ldi r27, 0x00; 0 e2: e2 e3 ldi r30, 0x32; 50 e4: f0 e0 ldi r31, 0x00; 0 e6: 80 81 ld r24, Z e8: 82 60 ori r24, 0x02; 2 ea: 8c 93 st X, r24 CodeVisionПри любой оптимизации: Код ;PORTD |= ( 1 << 1 ); 00007e 9a91 SBI 0x12,1 А также: Код ;PORTD.1 = 1; 00007f 9a91 SBI 0x12,1 Как видно тут разницы нет никакой. Однако для следующего кода CodeVision обходится всего одним регистром в отличии от AVRGCC 4.1.1: Код PORTD = ( 1 << 0 ); PORTD = ( 1 << 1 ); PORTD = ( 1 << 2 ); PORTD = ( 1 << 3 ); PORTD = ( 1 << 4 ); PORTD = ( 1 << 5 ); PORTD = ( 1 << 6 ); PORTD = ( 1 << 7 ); AVRGCC 4.1.1: Код int main(void) { ce: 71 e0 ldi r23, 0x01; 1 d0: 62 e0 ldi r22, 0x02; 2 d2: 54 e0 ldi r21, 0x04; 4 d4: 48 e0 ldi r20, 0x08; 8 d6: 30 e1 ldi r19, 0x10; 16 d8: 20 e2 ldi r18, 0x20; 32 da: 90 e4 ldi r25, 0x40; 64 dc: 80 e8 ldi r24, 0x80; 128
while(1) { PORTD = ( 1 << 0 ); de: 72 bb out 0x12, r23; 18 PORTD = ( 1 << 1 ); e0: 62 bb out 0x12, r22; 18 PORTD = ( 1 << 2 ); e2: 52 bb out 0x12, r21; 18 PORTD = ( 1 << 3 ); e4: 42 bb out 0x12, r20; 18 PORTD = ( 1 << 4 ); e6: 32 bb out 0x12, r19; 18 PORTD = ( 1 << 5 ); e8: 22 bb out 0x12, r18; 18 PORTD = ( 1 << 6 ); ea: 92 bb out 0x12, r25; 18 PORTD = ( 1 << 7 ); ec: 82 bb out 0x12, r24; 18 CodeVision: Код ; 34 PORTD = ( 1 << 0 ); 00007a e0e1 LDI R30,LOW(1) 00007b bbe2 OUT 0x12,R30 ; 35 PORTD = ( 1 << 1 ); 00007c e0e2 LDI R30,LOW(2) 00007d bbe2 OUT 0x12,R30 ; 36 PORTD = ( 1 << 2 ); 00007e e0e4 LDI R30,LOW(4) 00007f bbe2 OUT 0x12,R30 ; 37 PORTD = ( 1 << 3 ); 000080 e0e8 LDI R30,LOW(8) 000081 bbe2 OUT 0x12,R30 ; 38 PORTD = ( 1 << 4 ); 000082 e1e0 LDI R30,LOW(16) 000083 bbe2 OUT 0x12,R30 ; 39 PORTD = ( 1 << 5 ); 000084 e2e0 LDI R30,LOW(32) 000085 bbe2 OUT 0x12,R30 ; 40 PORTD = ( 1 << 6 ); 000086 e4e0 LDI R30,LOW(64) 000087 bbe2 OUT 0x12,R30 ; 41 PORTD = ( 1 << 7 ); 000088 e8e0 LDI R30,LOW(128) 000089 bbe2 OUT 0x12,R30
|
|
|
|
|
Jul 26 2006, 01:04
|
Местный
  
Группа: Участник
Сообщений: 328
Регистрация: 1-06-06
Из: USA
Пользователь №: 17 672

|
WinAVR size: Код PORTD = ( 1 << 0 ); fc: 81 e0 ldi r24, 0x01; 1 fe: 8b b9 out 0x0b, r24; 11 PORTD = ( 1 << 1 ); 100: 82 e0 ldi r24, 0x02; 2 102: 8b b9 out 0x0b, r24; 11 PORTD = ( 1 << 2 ); 104: 84 e0 ldi r24, 0x04; 4 106: 8b b9 out 0x0b, r24; 11 PORTD = ( 1 << 3 ); 108: 88 e0 ldi r24, 0x08; 8 10a: 8b b9 out 0x0b, r24; 11 PORTD = ( 1 << 4 ); 10c: 80 e1 ldi r24, 0x10; 16 10e: 8b b9 out 0x0b, r24; 11 PORTD = ( 1 << 5 ); 110: 80 e2 ldi r24, 0x20; 32 112: 8b b9 out 0x0b, r24; 11 PORTD = ( 1 << 6 ); 114: 80 e4 ldi r24, 0x40; 64 116: 8b b9 out 0x0b, r24; 11 PORTD = ( 1 << 7 ); 118: 80 e8 ldi r24, 0x80; 128 11a: 8b b9 out 0x0b, r24; 11 PORTD |= ( 1 << 0 ); 11c: 58 9a sbi 0x0b, 0; 11 PORTD |= ( 1 << 1 ); 11e: 59 9a sbi 0x0b, 1; 11 PORTD |= ( 1 << 2 ); 120: 5a 9a sbi 0x0b, 2; 11 PORTD |= ( 1 << 3 ); 122: 5b 9a sbi 0x0b, 3; 11 PORTD |= ( 1 << 4 ); 124: 5c 9a sbi 0x0b, 4; 11 PORTD |= ( 1 << 5 ); 126: 5d 9a sbi 0x0b, 5; 11 PORTD |= ( 1 << 6 ); 128: 5e 9a sbi 0x0b, 6; 11 PORTD |= ( 1 << 7 );
--------------------
|
|
|
|
|
Jul 26 2006, 01:43
|
Участник

Группа: Новичок
Сообщений: 17
Регистрация: 24-05-06
Пользователь №: 17 392

|
pitt, а какая у Вас версия?
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|