Перейти к содержанию
    

интересно сравнить с 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

интересно сравнить с avr-gcc и avr-iar по объему и тактам

В данном случае gcc лучше код будет, потому что IAR использует Y под стек.

Но в общем для AVR - IAR вне конкуренции!!

 

Но это все :bb-offtopic:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Посмотрел я как компилируется моя функция разбора данных.

Лучше всего повел себя космик! Для иллюстрации выдрал кусочек в отдельную функцию

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 полечат от артефактов код у него будет хороший!

 

Райзонанс тоже использует виртуальные регистры, А космик стек.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да уж... ;) Сильно улучшает...

if (!--Len) вообще можно реализовать одной инструкцией

        dec    S:b8
        jrne   ??b3
.....

Или нет?

PS: Видно первая версия еще очень сырая.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

PS: Видно первая версия еще очень сырая.

Это очевидно. Большинство ошибок эффективно выявляются и устраняются только в процессе интенсивной эксплуатации большим количеством пользователей, как бы тщательно не тестировали продукт сами производители. А раз эта версия первая из вышедших на рынок, то погрешностей в ней можно ожидать много. Один номер версии о многом говорит - EWSTM8-1100 - нолик в миноре обычно не бывает, т.к. букве A соответствует единичка.

Вскорости ждем следующую версию EWSTM8 за номером 1.20. Она уже объявлена к выпуску в ближайшие 2-3 месяца на японском сайте IAR -

http://www.iar.com/website1/1.0.1.0/495/3/

На английском такого упоминания нет. А здесь еще кое-что разобрать можно, даже не владея японским языком, или перевести с помощью электронного переводчика.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это очевидно. Большинство ошибок эффективно выявляются и устраняются только в процессе интенсивной эксплуатации большим количеством пользователей, как бы тщательно не тестировали продукт сами производители. А раз эта версия первая из вышедших на рынок, то погрешностей в ней можно ожидать много. Один номер версии о многом говорит - EWSTM8-1100 - нолик в миноре обычно не бывает, т.к. букве A соответствует единичка.

Вскорости ждем следующую версию EWSTM8 за номером 1.20. Она уже объявлена к выпуску в ближайшие 2-3 месяца на японском сайте IAR -

http://www.iar.com/website1/1.0.1.0/495/3/

На английском такого упоминания нет. Там кое-что разобрать можно, даже не владея японским языком или перевести с помощью электронного переводчика.

Спасибо!!! Будем ждать. Хотя я на сегодняшний день остановился на комплексе SVDT-Cosmic. Поскольку я пишу программы на ассемблере, то ассемблер у Cosmic мне понравился больше остальных.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Хотя я на сегодняшний день остановился на комплексе 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 операции!

Ну а условие окончания цикла - как всегда!

 

 

Да, кстати с инкрементом такие же проблемы!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Хотя я на сегодняшний день остановился на комплексе SVDT-Cosmic. Поскольку я пишу программы на ассемблере, то ассемблер у Cosmic мне понравился больше остальных.

А разве есть разница на каком ассемблере писать? :) Я понимаю, если это компилятор языка более высокого уровня - тут действительно эффективность кода во многом зависит от компилятора. Но ассемблер! Растолкуйте мне, пожалуйста, разницу. Может быть там просто редактор более удобный или встроенные макросы?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А разве есть разница на каком ассемблере писать? :)

Разница большая! Вот возьмите хотя бы IARовский ассемблер - там возможно использовать С препроцессор

#ifdef

#include

и т.д.

Возможности насписания макросов отличаются.

Да и линкер все равно нужен.

Если писать на асме - я бы выбрал IAR - хороший линкер, С препроцессор, мароксы обынчые для разных архитектур...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Разница большая! Вот возьмите хотя бы IARовский ассемблер - там возможно использовать С препроцессор

'С' препроцесср, на то он и препроцессор, что вещь совершенно независимая и способен обрабатывать любые тексты, включая не только любой ASM, но вообще литературные тексты. Другое дело, что у макроассемблеров бывает наворотов и много поболее, только едва-ли более одного из сотни асмописателей знают о них :( :( :(.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А разве есть разница на каком ассемблере писать? :) Я понимаю, если это компилятор языка более высокого уровня - тут действительно эффективность кода во многом зависит от компилятора. Но ассемблер! Растолкуйте мне, пожалуйста, разницу. Может быть там просто редактор более удобный или встроенные макросы?

Все трансляторы с ассемблера различаются прежде всего своим синтаксисом. Поэтому программа, написанная для одного ассемблера, скорее всего не сможет быть оттранслирована другим. А в общем, дело не только в одном ассемблере, но и во всей системе в целом. На данный момент для меня более удобной оказалась среда Cosmic в оболочке STDV.

 

 

А родной ST хуже?

вместо 1 операции dec (x) - 3 операции!

Ну а условие окончания цикла - как всегда!

Да, кстати с инкрементом такие же проблемы!

Хм .... Если бы только 3 операции, то это еще куда ни шло. При декременте и сравнении их получается 5, и это вместо одной. :)

Изменено пользователем zltigo
Бездумное цитирование. Повтроно. Впредь такие цитаты будут удаляться вместе с постом.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ассемблеры по возможностям примерно одинаковые!

Но вообще у cosmic есть плюс - дистрибутив занимает всего 10 метров. В развернутом виде 30 метров.

А райзонанс - 116 метров, плюс еще без RIDE не ставится это еще 18 метров. В развернутом виде у меня 261 метр.

 

Но IMHO т.к. IAR уже появился лучше его использовать, там покрайней мере уже все .h файлы для чипов есть!

(кстати развернутый IAR пока занимает 126 метров, что там навернуто в RIDE7?)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Только что (файл датируется 5 мая) IAR выложила сервис-пак №1 к своей версии компилятора для STM8.

http://supp.iar.com/Updates/?product=EWSTM8

Модифицирует версию 1.10.0 до 1.10.1. Выложила на FTP в ту же папку, где лежал инсталлятор.

Странное название патча - никогда прежде сервис-паками IAR свои апдейты не называла. И ставится он тоже не типично - не добавляется в директорий, а запускается как экзешник (хотя патчи такого типа раньше бывали). И размерчик тоже великоват - 33 Мб при размере всего инсталлятора 89 Мб. Что-то слишком тяжело для драйверов и файлов конфигурации. Может быть там гораздо больше исправлений, чем описано?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Только что (файл датируется 5 мая) IAR выложила сервис-пак №1 к своей версии компилятора для STM8.

в bin заменились dll для отладчика - симулятор, драйвера stlink и т.д.

компилер старый остался.

 

Тут обратил внимание что у STM8 свой линкер - ilinkstm8, и на выходе компилера elf, а конфигурация линкера icf.

Что меня удивило - я думал жто только к АРМу они сделали из-за EABI.

Поддержка elf (покарйней мере в ARM) у них какая то убогая! Даже размер секции нельзя записать, надо счиать.

 

Теперь что IAR будет отказываться от UBROF и xlink для всех семейств?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Поддержка elf (покарйней мере в ARM) у них какая то убогая! Даже размер секции нельзя записать, надо счиать.

Если что-то не устраивает, то объектники созданные PRO версией, по крайней мере ARM, не имеют защиты и жуются родными binutils.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...