|
|
  |
STM8, кто нибудь использует? |
|
|
|
May 1 2010, 17:24
|
Профессионал
    
Группа: Участник
Сообщений: 1 264
Регистрация: 17-06-08
Из: бандустан
Пользователь №: 38 347

|
интересно сравнить с 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
|
|
|
|
|
May 1 2010, 23:00
|

Профессионал
    
Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555

|
Посмотрел я как компилируется моя функция разбора данных. Лучше всего повел себя космик! Для иллюстрации выдрал кусочек в отдельную функцию Код 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 полечат от артефактов код у него будет хороший! Райзонанс тоже использует виртуальные регистры, А космик стек.
|
|
|
|
|
May 3 2010, 07:48
|
Местный
  
Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219

|
Да уж...  Сильно улучшает... if (!--Len) вообще можно реализовать одной инструкцией Код dec S:b8 jrne ??b3 ..... Или нет? PS: Видно первая версия еще очень сырая.
Причина редактирования: Совершенно бездумное цитирование!
|
|
|
|
|
May 3 2010, 14:58
|
Местный
  
Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219

|
Цитата(Xenia @ May 3 2010, 15:48)  Это очевидно. Большинство ошибок эффективно выявляются и устраняются только в процессе интенсивной эксплуатации большим количеством пользователей, как бы тщательно не тестировали продукт сами производители. А раз эта версия первая из вышедших на рынок, то погрешностей в ней можно ожидать много. Один номер версии о многом говорит - EWSTM8-1100 - нолик в миноре обычно не бывает, т.к. букве A соответствует единичка. Вскорости ждем следующую версию EWSTM8 за номером 1.20. Она уже объявлена к выпуску в ближайшие 2-3 месяца на японском сайте IAR - http://www.iar.com/website1/1.0.1.0/495/3/На английском такого упоминания нет. Там кое-что разобрать можно, даже не владея японским языком или перевести с помощью электронного переводчика. Спасибо!!! Будем ждать. Хотя я на сегодняшний день остановился на комплексе SVDT-Cosmic. Поскольку я пишу программы на ассемблере, то ассемблер у Cosmic мне понравился больше остальных.
|
|
|
|
|
May 3 2010, 15:27
|

Профессионал
    
Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555

|
Цитата(_Bill @ May 3 2010, 18:58)  Хотя я на сегодняшний день остановился на комплексе 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 операции! Ну а условие окончания цикла - как всегда! Да, кстати с инкрементом такие же проблемы!
|
|
|
|
|
May 3 2010, 16:29
|

Профессионал
    
Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555

|
Цитата(Xenia @ May 3 2010, 20:01)  А разве есть разница на каком ассемблере писать?  Разница большая! Вот возьмите хотя бы IARовский ассемблер - там возможно использовать С препроцессор #ifdef #include и т.д. Возможности насписания макросов отличаются. Да и линкер все равно нужен. Если писать на асме - я бы выбрал IAR - хороший линкер, С препроцессор, мароксы обынчые для разных архитектур...
|
|
|
|
|
May 3 2010, 16:57
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(KRS @ May 3 2010, 19:29)  Разница большая! Вот возьмите хотя бы IARовский ассемблер - там возможно использовать С препроцессор 'С' препроцесср, на то он и препроцессор, что вещь совершенно независимая и способен обрабатывать любые тексты, включая не только любой ASM, но вообще литературные тексты. Другое дело, что у макроассемблеров бывает наворотов и много поболее, только едва-ли более одного из сотни асмописателей знают о них  .
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
May 3 2010, 18:28
|
Местный
  
Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219

|
Цитата(Xenia @ May 3 2010, 20:01)  А разве есть разница на каком ассемблере писать?  Я понимаю, если это компилятор языка более высокого уровня - тут действительно эффективность кода во многом зависит от компилятора. Но ассемблер! Растолкуйте мне, пожалуйста, разницу. Может быть там просто редактор более удобный или встроенные макросы? Все трансляторы с ассемблера различаются прежде всего своим синтаксисом. Поэтому программа, написанная для одного ассемблера, скорее всего не сможет быть оттранслирована другим. А в общем, дело не только в одном ассемблере, но и во всей системе в целом. На данный момент для меня более удобной оказалась среда Cosmic в оболочке STDV. Цитата(KRS @ May 3 2010, 19:27)  А родной ST хуже? вместо 1 операции dec (x) - 3 операции! Ну а условие окончания цикла - как всегда! Да, кстати с инкрементом такие же проблемы! Хм .... Если бы только 3 операции, то это еще куда ни шло. При декременте и сравнении их получается 5, и это вместо одной.
Сообщение отредактировал zltigo - May 3 2010, 18:33
Причина редактирования: Бездумное цитирование. Повтроно. Впредь такие цитаты будут удаляться вместе с постом.
|
|
|
|
|
May 8 2010, 20:45
|

Профессионал
    
Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555

|
Цитата(Xenia @ May 8 2010, 13:24)  Только что (файл датируется 5 мая) IAR выложила сервис-пак №1 к своей версии компилятора для STM8. в bin заменились dll для отладчика - симулятор, драйвера stlink и т.д. компилер старый остался. Тут обратил внимание что у STM8 свой линкер - ilinkstm8, и на выходе компилера elf, а конфигурация линкера icf. Что меня удивило - я думал жто только к АРМу они сделали из-за EABI. Поддержка elf (покарйней мере в ARM) у них какая то убогая! Даже размер секции нельзя записать, надо счиать. Теперь что IAR будет отказываться от UBROF и xlink для всех семейств?
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|