ukpyr 0 1 мая, 2010 Опубликовано 1 мая, 2010 · Жалоба интересно сравнить с avr-gcc и avr-iar по объему и тактам avr-gcc -O2 42 0000 CF93 push r28 43 0002 DF93 push r29 44 /* prologue: function */ 45 /* frame size = 0 */ 46 0004 EC01 movw r28,r24 47 0006 DB01 movw r26,r22 48 0008 FA01 movw r30,r20 49 .L2: 3:test.c **** do { 4:test.c **** *c++ = *a++ + *b++; 51 .LM1: 52 000a 8D91 ld r24,X+ 53 000c 9991 ld r25,Y+ 54 000e 890F add r24,r25 55 0010 8193 st Z+,r24 5:test.c **** } while(--len); 57 .LM2: 58 0012 2150 subi r18,lo8(-(-1)) 59 0014 01F4 brne .L2 60 /* epilogue start */ 6:test.c **** } 62 .LM3: 63 0016 DF91 pop r29 64 0018 CF91 pop r28 65 001a 0895 ret Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KRS 1 1 мая, 2010 Опубликовано 1 мая, 2010 · Жалоба интересно сравнить с avr-gcc и avr-iar по объему и тактам В данном случае gcc лучше код будет, потому что IAR использует Y под стек. Но в общем для AVR - IAR вне конкуренции!! Но это все :bb-offtopic: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KRS 1 1 мая, 2010 Опубликовано 1 мая, 2010 · Жалоба Посмотрел я как компилируется моя функция разбора данных. Лучше всего повел себя космик! Для иллюстрации выдрал кусочек в отдельную функцию void Set12(u8_t id, u16_t v); void test_1(u8_t *ptr) { u8_t id, ext; ext = ptr[0]; id = ptr[1]; Set12((id >> 4) + ext*8, ptr[2] | ((id & 0x0F)<<8) ); } IAR что то перемудрил со сдвигами, даже разбираться в лом! \ test_1: \ 000000 9093 LDW Y, X 119 u8_t id, ext; 120 ext = ptr[0]; 121 id = ptr[1]; \ 000002 5C INCW X \ 000003 F6 LD A, (X) \ 000004 B700 LD S:?b0, A 122 Set12((id >> 4) + ext*8, ptr[2] | ((id & 0x0F)<<8) ); \ 000006 5F CLRW X \ 000007 41 EXG A, XL \ 000008 B600 LD A, S:?b0 \ 00000A 01 RRWA X, A \ 00000B A40F AND A, #0xf \ 00000D 02 RLWA X, A \ 00000E 58 SLLW X \ 00000F 58 SLLW X \ 000010 58 SLLW X \ 000011 58 SLLW X \ 000012 58 SLLW X \ 000013 58 SLLW X \ 000014 58 SLLW X \ 000015 58 SLLW X \ 000016 BF00 LDW S:?w1, X \ 000018 93 LDW X, Y \ 000019 1C0002 ADDW X, #0x2 \ 00001C F6 LD A, (X) \ 00001D 5F CLRW X \ 00001E 97 LD XL, A \ 00001F 01 RRWA X, A \ 000020 BA00 OR A, S:?b3 \ 000022 01 RRWA X, A \ 000023 BA00 OR A, S:?b2 \ 000025 01 RRWA X, A \ 000026 90F6 LD A, (Y) \ 000028 48 SLL A \ 000029 48 SLL A \ 00002A 48 SLL A \ 00002B B700 LD S:?b1, A \ 00002D B600 LD A, S:?b0 \ 00002F 4E SWAP A \ 000030 A40F AND A, #0xf \ 000032 BB00 ADD A, S:?b1 \ 000034 CC0000 JP L:Set12 123 } Райзонанс, много лишних пересылок. ; FUNCTION ?test_1 (BEGIN) ; Register-parameter ptr (XW) is relocated (auto) ; SOURCE LINE # 122 0000 89 PUSHW X 0001 89 PUSHW X ; SOURCE LINE # 125 0002 F6 LD A,(X) 0003 6B02 F LD (002H,SP),A ; [ ext ] ; SOURCE LINE # 126 0005 1E03 F LDW X,(003H,SP) ; [ ptr ] 0007 E601 LD A,(001H,X) 0009 6B01 F LD (001H,SP),A ; [ id ] ; SOURCE LINE # 127 000B A60F LD A,#00FH 000D 1401 F AND A,(001H,SP) ; [ id ] 000F 5F CLRW X 0010 95 LD XH,A 0011 BF03 F LDW ?CH.w,X 0013 1E03 F LDW X,(003H,SP) ; [ ptr ] 0015 B605 F LD A,?CH 0017 B703 F LD ?BH,A 0019 E602 LD A,(002H,X) 001B B704 F LD ?BL,A 001D BE02 F LDW X,?BH.w 001F 7B02 F LD A,(002H,SP) ; [ ext ] 0021 48 SLL A 0022 48 SLL A 0023 48 SLL A 0024 B703 F LD ?BH,A 0026 7B01 F LD A,(001H,SP) ; [ id ] 0028 4E SWAP A 0029 A40F AND A,#00FH 002B BB03 F ADD A,?BH 002D CD0000 F CALL ?Set12 0030 5B04 ADD SP,#004H 0032 81 RET Космик - лучший код. 477 021b _test_1: 478 021b 89 pushw x 479 021c 5203 subw sp,#3 480 00000003 OFST: set 3 482 ; 124 ext = ptr[0]; 483 021e f6 ld a,(x) 484 021f 6b02 ld (OFST-1,sp),a 485 ; 125 id = ptr[1]; 486 0221 e601 ld a,(1,x) 487 0223 6b03 ld (OFST+0,sp),a 488 ; 126 Set12((id >> 4) + ext*8, ptr[2] | ((id & 0x0F)<<8) ); 489 0225 a40f and a,#15 490 0227 1604 ldw y,(OFST+1,sp) 491 0229 97 ld xl,a 492 022a 90e602 ld a,(2,y) 493 022d 02 rlwa x,a 494 022e 89 pushw x 495 022f 7b04 ld a,(OFST+1,sp) 496 0231 48 sll a 497 0232 48 sll a 498 0233 48 sll a 499 0234 6b03 ld (OFST+0,sp),a 500 0236 7b05 ld a,(OFST+2,sp) 501 0238 4e swap a 502 0239 a40f and a,#15 503 023b 1b03 add a,(OFST+0,sp) 504 023d cd0000 call _Set12 506 0240 85 popw x 507 ; 127 } 508 0241 5b05 addw sp,#5 509 0243 81 ret Это только маленький кусочек. В общем на сейчас Космик выигрывает при функциях посложнее. Например в кусочке Set8((Id & 0x1F)+Ext*32,*ptr++); стал вызывать билиотечную функцию сдвига, космик и IAR обошлись без нее! У IAR возникают каие то артефакты!!! Про dec он вообще похоже не подозревает :) Еще и такой код if (!--Len) return; скомпилировал как \ 0000A1 B600 LD A, S:?b8 \ 0000A3 ABFF ADD A, #0xff \ 0000A5 B700 LD S:?b8, A \ 0000A7 4F CLR A \ 0000A8 B100 CP A, S:?b8 \ 0000AA 2600 JRNE ??lb_3 \ 0000AC CC0000 JP L:??parser_3 К тому же IAR не использует стек, а использует виртуальные регистры. Что IMHO для этого ядра криво! Здесь я был не прав! Это здорово улучшаед код - особенно при использовании специфической адресации Indirect и Indexed Inderec - получаются аппаратные указатели.Так что когда IAR полечат от артефактов код у него будет хороший! Райзонанс тоже использует виртуальные регистры, А космик стек. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Bill 0 3 мая, 2010 Опубликовано 3 мая, 2010 · Жалоба Да уж... ;) Сильно улучшает... if (!--Len) вообще можно реализовать одной инструкцией dec S:b8 jrne ??b3 ..... Или нет? PS: Видно первая версия еще очень сырая. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Xenia 44 3 мая, 2010 Опубликовано 3 мая, 2010 · Жалоба PS: Видно первая версия еще очень сырая. Это очевидно. Большинство ошибок эффективно выявляются и устраняются только в процессе интенсивной эксплуатации большим количеством пользователей, как бы тщательно не тестировали продукт сами производители. А раз эта версия первая из вышедших на рынок, то погрешностей в ней можно ожидать много. Один номер версии о многом говорит - EWSTM8-1100 - нолик в миноре обычно не бывает, т.к. букве A соответствует единичка. Вскорости ждем следующую версию EWSTM8 за номером 1.20. Она уже объявлена к выпуску в ближайшие 2-3 месяца на японском сайте IAR - http://www.iar.com/website1/1.0.1.0/495/3/ На английском такого упоминания нет. А здесь еще кое-что разобрать можно, даже не владея японским языком, или перевести с помощью электронного переводчика. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Bill 0 3 мая, 2010 Опубликовано 3 мая, 2010 · Жалоба Это очевидно. Большинство ошибок эффективно выявляются и устраняются только в процессе интенсивной эксплуатации большим количеством пользователей, как бы тщательно не тестировали продукт сами производители. А раз эта версия первая из вышедших на рынок, то погрешностей в ней можно ожидать много. Один номер версии о многом говорит - EWSTM8-1100 - нолик в миноре обычно не бывает, т.к. букве A соответствует единичка. Вскорости ждем следующую версию EWSTM8 за номером 1.20. Она уже объявлена к выпуску в ближайшие 2-3 месяца на японском сайте IAR - http://www.iar.com/website1/1.0.1.0/495/3/ На английском такого упоминания нет. Там кое-что разобрать можно, даже не владея японским языком или перевести с помощью электронного переводчика. Спасибо!!! Будем ждать. Хотя я на сегодняшний день остановился на комплексе SVDT-Cosmic. Поскольку я пишу программы на ассемблере, то ассемблер у Cosmic мне понравился больше остальных. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KRS 1 3 мая, 2010 Опубликовано 3 мая, 2010 · Жалоба Хотя я на сегодняшний день остановился на комплексе SVDT-Cosmic. Поскольку я пишу программы на ассемблере, то ассемблер у Cosmic мне понравился больше остальных. А родной ST хуже? Кстати у IAR есть все шансы стать лучшим компилером! Оптимизатор там хорошо работает, например, такой цикл void test_3(u8_t *ptr, u8_t len) { u8_t i; for(i=0; i < len; i++) { ptr[i]--; } } он соптимизоровал в if (!len) return; do { ptr[0]--; ++ptr; } while(--len); Но с декрементом у IAR явные проблемы! \ test_3: \ 000000 B700 LD S:?b0, A 139 u8_t i; 140 for(i=0; i < len; i++) { \ 000002 4F CLR A \ 000003 B100 CP A, S:?b0 \ 000005 2700 JREQ L:??test_3_0 141 ptr[i]--; \ ??test_3_1: \ 000007 A6FF LD A, #0xff \ 000009 FB ADD A, (X) \ 00000A F7 LD (X), A 142 } \ 00000B 5C INCW X \ 00000C B600 LD A, S:?b0 \ 00000E ABFF ADD A, #0xff \ 000010 B700 LD S:?b0, A \ 000012 4F CLR A \ 000013 B100 CP A, S:?b0 \ 000015 2600 JRNE L:??test_3_1 143 } \ ??test_3_0: \ 000017 81 RET вместо 1 операции dec (x) - 3 операции! Ну а условие окончания цикла - как всегда! Да, кстати с инкрементом такие же проблемы! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Xenia 44 3 мая, 2010 Опубликовано 3 мая, 2010 · Жалоба Хотя я на сегодняшний день остановился на комплексе SVDT-Cosmic. Поскольку я пишу программы на ассемблере, то ассемблер у Cosmic мне понравился больше остальных. А разве есть разница на каком ассемблере писать? :) Я понимаю, если это компилятор языка более высокого уровня - тут действительно эффективность кода во многом зависит от компилятора. Но ассемблер! Растолкуйте мне, пожалуйста, разницу. Может быть там просто редактор более удобный или встроенные макросы? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KRS 1 3 мая, 2010 Опубликовано 3 мая, 2010 · Жалоба А разве есть разница на каком ассемблере писать? :) Разница большая! Вот возьмите хотя бы IARовский ассемблер - там возможно использовать С препроцессор #ifdef #include и т.д. Возможности насписания макросов отличаются. Да и линкер все равно нужен. Если писать на асме - я бы выбрал IAR - хороший линкер, С препроцессор, мароксы обынчые для разных архитектур... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 2 3 мая, 2010 Опубликовано 3 мая, 2010 · Жалоба Разница большая! Вот возьмите хотя бы IARовский ассемблер - там возможно использовать С препроцессор 'С' препроцесср, на то он и препроцессор, что вещь совершенно независимая и способен обрабатывать любые тексты, включая не только любой ASM, но вообще литературные тексты. Другое дело, что у макроассемблеров бывает наворотов и много поболее, только едва-ли более одного из сотни асмописателей знают о них :( :( :(. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Bill 0 3 мая, 2010 Опубликовано 3 мая, 2010 (изменено) · Жалоба А разве есть разница на каком ассемблере писать? :) Я понимаю, если это компилятор языка более высокого уровня - тут действительно эффективность кода во многом зависит от компилятора. Но ассемблер! Растолкуйте мне, пожалуйста, разницу. Может быть там просто редактор более удобный или встроенные макросы? Все трансляторы с ассемблера различаются прежде всего своим синтаксисом. Поэтому программа, написанная для одного ассемблера, скорее всего не сможет быть оттранслирована другим. А в общем, дело не только в одном ассемблере, но и во всей системе в целом. На данный момент для меня более удобной оказалась среда Cosmic в оболочке STDV. А родной ST хуже? вместо 1 операции dec (x) - 3 операции! Ну а условие окончания цикла - как всегда! Да, кстати с инкрементом такие же проблемы! Хм .... Если бы только 3 операции, то это еще куда ни шло. При декременте и сравнении их получается 5, и это вместо одной. :) Изменено 3 мая, 2010 пользователем zltigo Бездумное цитирование. Повтроно. Впредь такие цитаты будут удаляться вместе с постом. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KRS 1 3 мая, 2010 Опубликовано 3 мая, 2010 · Жалоба ассемблеры по возможностям примерно одинаковые! Но вообще у cosmic есть плюс - дистрибутив занимает всего 10 метров. В развернутом виде 30 метров. А райзонанс - 116 метров, плюс еще без RIDE не ставится это еще 18 метров. В развернутом виде у меня 261 метр. Но IMHO т.к. IAR уже появился лучше его использовать, там покрайней мере уже все .h файлы для чипов есть! (кстати развернутый IAR пока занимает 126 метров, что там навернуто в RIDE7?) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Xenia 44 8 мая, 2010 Опубликовано 8 мая, 2010 · Жалоба Только что (файл датируется 5 мая) IAR выложила сервис-пак №1 к своей версии компилятора для STM8. http://supp.iar.com/Updates/?product=EWSTM8 Модифицирует версию 1.10.0 до 1.10.1. Выложила на FTP в ту же папку, где лежал инсталлятор. Странное название патча - никогда прежде сервис-паками IAR свои апдейты не называла. И ставится он тоже не типично - не добавляется в директорий, а запускается как экзешник (хотя патчи такого типа раньше бывали). И размерчик тоже великоват - 33 Мб при размере всего инсталлятора 89 Мб. Что-то слишком тяжело для драйверов и файлов конфигурации. Может быть там гораздо больше исправлений, чем описано? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KRS 1 8 мая, 2010 Опубликовано 8 мая, 2010 · Жалоба Только что (файл датируется 5 мая) IAR выложила сервис-пак №1 к своей версии компилятора для STM8. в bin заменились dll для отладчика - симулятор, драйвера stlink и т.д. компилер старый остался. Тут обратил внимание что у STM8 свой линкер - ilinkstm8, и на выходе компилера elf, а конфигурация линкера icf. Что меня удивило - я думал жто только к АРМу они сделали из-за EABI. Поддержка elf (покарйней мере в ARM) у них какая то убогая! Даже размер секции нельзя записать, надо счиать. Теперь что IAR будет отказываться от UBROF и xlink для всех семейств? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 2 8 мая, 2010 Опубликовано 8 мая, 2010 · Жалоба Поддержка elf (покарйней мере в ARM) у них какая то убогая! Даже размер секции нельзя записать, надо счиать. Если что-то не устраивает, то объектники созданные PRO версией, по крайней мере ARM, не имеют защиты и жуются родными binutils. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться