IARSTM8并不是一无是处,简单循环比较iar,cosmic效率

xgl_1982   2010-5-1 21:40 楼主


简单指针+循环测试,基本上都是iar胜过cosmic。
iar在寄存器和循环优化比cosmic好。
iar劣势在不会stm8复杂的寻址,不会操作ram,就只会用寄存器。
如果iar加上针对stm8的指令优化,相信效率超过cosmic不是难事。

void test1(uint8 *p)
{
   uint8 i;
   for(i=0;i<100;i++)
    {
p=i;
     }
}

IAR:
        SECTION `.far_func.text`:CODE:NOROOT(0)
        CODE
test1:
        CLR       A
??test1_0:
        LD        (X), A
        ADD       A, #0x1
        INCW      X
        CP        A, #0x64
        JRC       L:??test1_0
        RETF


COSMIC:
  54                     ; 16 void test1(uint8 *p)
  54                     ; 17 {
  56                      switch .text
  57  0000               _test1:
  59  0000 89             pushw x
  60  0001 88             push a
  61       00000001      OFST: set 1
  64                     ; 19    for(i=0;i<100;i++)
  66  0002 0f01           clr (OFST+0,sp)
  67  0004               L33:
  68                     ; 21   p=i;
  70  0004 7b02           ld a,(OFST+1,sp)
  71  0006 97             ld xl,a
  72  0007 7b03           ld a,(OFST+2,sp)
  73  0009 1b01           add a,(OFST+0,sp)
  74  000b 2401           jrnc L6
  75  000d 5c             incw x
  76  000e               L6:
  77  000e 02             rlwa x,a
  78  000f 7b01           ld a,(OFST+0,sp)
  79  0011 f7             ld (x),a
  80                     ; 19    for(i=0;i<100;i++)
  82  0012 0c01           inc (OFST+0,sp)
  85  0014 7b01           ld a,(OFST+0,sp)
  86  0016 a164           cp a,#100
  87  0018 25ea           jrult L33
  88                     ; 23 }
  91  001a 5b03           addw sp,#3
  92  001c 81             ret



void test2(uint16 *p)
{
   uint8 i;
   for(i=0;i<100;i++)
{
p=i;
}
}

IAR:
        SECTION `.far_func.text`:CODE:NOROOT(0)
        CODE
test2:
        CLR       A
??test2_0:
        CLRW      Y
        LD        YL, A
        LDW       (X), Y
        ADD       A, #0x1
        ADDW      X, #0x2
        CP        A, #0x64
        JRC       L:??test2_0
        RETF//   37
//   38


COSMIC:
                     ; 26 void test2(uint16 *p)
136                     ; 27 {
137                      switch .text
138  001d               _test2:
140  001d 89             pushw x
141  001e 88             push a
142       00000001      OFST: set 1
145                     ; 29    for(i=0;i<100;i++)
147  001f 4f             clr a
148  0020 6b01           ld (OFST+0,sp),a
149  0022               L36:
150                     ; 31   p=i;
152  0022 5f             clrw x
153  0023 97             ld xl,a
154  0024 905f           clrw y
155  0026 9097           ld yl,a
156  0028 9058           sllw y
157  002a 72f902         addw y,(OFST+1,sp)
158  002d 90ff           ldw (y),x
159                     ; 29    for(i=0;i<100;i++)
161  002f 0c01           inc (OFST+0,sp)
164  0031 7b01           ld a,(OFST+0,sp)
165  0033 a164           cp a,#100
166  0035 25eb           jrult L36
167                     ; 33 }
170  0037 5b03           addw sp,#3
171  0039 81             ret


void test3(uint8 *p1,uint8 *p2)
{
   uint8 i;
   for(i=0;i<100;i++)
{
p1=p2;
}
}

IAR:
        SECTION `.far_func.text`:CODE:NOROOT(0)
        CODE
test3:
        LD        A, #0x64
        LD        S:?b0, A
??test3_0:
        LD        A, (Y)
        LD        (X), A
        INCW      Y
        INCW      X
        LD        A, S:?b0
        ADD       A, #0xff
        LD        S:?b0, A
        CLR       A
        CP        A, S:?b0
        JRNE      L:??test3_0
        RETF

COSMIC:
225                     ; 35 void test3(uint8 *p1,uint8 *p2)
225                     ; 36 {
226                      switch .text
227  003a               _test3:
229  003a 89             pushw x
230  003b 88             push a
231       00000001      OFST: set 1
234                     ; 38    for(i=0;i<100;i++)
236  003c 0f01           clr (OFST+0,sp)
237  003e               L711:
238                     ; 40   p1=p2;
240  003e 7b02           ld a,(OFST+1,sp)
241  0040 97             ld xl,a
242  0041 7b03           ld a,(OFST+2,sp)
243  0043 1b01           add a,(OFST+0,sp)
244  0045 2401           jrnc L41
245  0047 5c             incw x
246  0048               L41:
247  0048 02             rlwa x,a
248  0049 89             pushw x
249  004a 7b08           ld a,(OFST+7,sp)
250  004c 97             ld xl,a
251  004d 7b09           ld a,(OFST+8,sp)
252  004f 1b03           add a,(OFST+2,sp)
253  0051 2401           jrnc L61
254  0053 5c             incw x
255  0054               L61:
256  0054 02             rlwa x,a
257  0055 f6             ld a,(x)
258  0056 85             popw x
259  0057 f7             ld (x),a
260                     ; 38    for(i=0;i<100;i++)
262  0058 0c01           inc (OFST+0,sp)
265  005a 7b01           ld a,(OFST+0,sp)
266  005c a164           cp a,#100
267  005e 25de           jrult L711
268                     ; 42 }
271  0060 5b03           addw sp,#3
272  0062 81             ret


void test4(uint16 *p1,uint16 *p2)
{
   uint8 i;
   for(i=0;i<100;i++)
{
p1=p2;
}
}
IAR:
        SECTION `.far_func.text`:CODE:NOROOT(0)
        CODE
test4:
        LDW       S:?w0, X
        LDW       X, Y
        LD        A, #0x64
        LD        S:?b2, A
??test4_0:
        LDW       Y, X
        LDW       Y, (Y)
        LDW       [S:?w0.w], Y
        ADDW      X, #0x2
        LDW       Y, S:?w0
        ADDW      Y, #0x2
        LDW       S:?w0, Y
        LD        A, S:?b2
        ADD       A, #0xff
        LD        S:?b2, A
        CLR       A
        CP        A, S:?b2
        JRNE      L:??test4_0
        RETF

COSMIC:
326                     ; 44 void test4(uint16 *p1,uint16 *p2)
326                     ; 45 {
327                      switch .text
328  0063               _test4:
330  0063 89             pushw x
331  0064 88             push a
332       00000001      OFST: set 1
335                     ; 47    for(i=0;i<100;i++)
337  0065 4f             clr a
338  0066 6b01           ld (OFST+0,sp),a
339  0068               L351:
340                     ; 49   p1=p2;
342  0068 5f             clrw x
343  0069 97             ld xl,a
344  006a 58             sllw x
345  006b 72fb06         addw x,(OFST+5,sp)
346  006e 905f           clrw y
347  0070 9097           ld yl,a
348  0072 9058           sllw y
349  0074 72f902         addw y,(OFST+1,sp)
350  0077 fe             ldw x,(x)
351  0078 90ff           ldw (y),x
352                     ; 47    for(i=0;i<100;i++)
354  007a 0c01           inc (OFST+0,sp)
357  007c 7b01           ld a,(OFST+0,sp)
358  007e a164           cp a,#100
359  0080 25e6           jrult L351
360                     ; 51 }
363  0082 5b03           addw sp,#3
364  0084 81             ret


回复评论 (10)

                                 好贴,果然惊天地,震江湖。
点赞  2010-5-2 12:56
                                 IAR STM8出来了吗??
点赞  2010-5-7 17:05
                                 4月27就出了
点赞  2010-5-7 22:59
                                 楼主你好,请问用的是什么仿真器?版本?
点赞  2010-5-8 14:01
                                 好贴
点赞  2010-5-8 16:58
                                 COSMIC C这么差吗,是不是优化级别不够高?
点赞  2010-5-8 22:18



cosmic不太熟悉,在STVD上选择优化是"maximize execute speed",
IAR优化选择是"High speed".

测试代码,楼上可以试试。
貌似论坛【i】显示有问题,换成【k】

typedef unsigned char uint8;
typedef unsigned short uint16;
typedef unsigned long uint32;

void test1(uint8 *p)
{
   uint8 k;
   for(k=0;k<100;k++)
    {
      p[k]=k;
     }
}

void test2(uint16 *p)
{
   uint8 k;
   for(k=0;k<100;k++)
   {
     p[k]=k;
   }
}


void test3(uint8 *p1,uint8 *p2)
{
   uint8 k;
   for(k=0;k<100;k++)
   {
      p1[k]=p2[k];
   }
}

void test4(uint16 *p1,uint16 *p2)
{
   uint8 k;
   for(k=0;k<100;k++)
   {
      p1[k]=p2[k];
   }
}
点赞  2010-5-9 08:12
                                 莫非效率还跟仿真器有关
点赞  2010-5-9 15:12
SECTION `.far_func.text`:CODE:NOROOT(0) 这句楼主可以讲解下是什么意思吗?
点赞  2014-3-20 11:53
嗯,COSMIC是否已经选了start-up file?
点赞  2017-5-24 14:35
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复