8949|10

67

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

IARSTM8并不是一无是处,简单循环比较iar,cosmic效率 [复制链接]



简单指针+循环测试,基本上都是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


此帖出自stm32/stm8论坛

最新回复

嗯,COSMIC是否已经选了start-up file?  详情 回复 发表于 2017-5-24 14:35
点赞 关注
 

回复
举报

81

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
                                 好贴,果然惊天地,震江湖。
此帖出自stm32/stm8论坛
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
                                 IAR STM8出来了吗??
此帖出自stm32/stm8论坛
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

4
 
                                 4月27就出了
此帖出自stm32/stm8论坛
 
 
 

回复

92

帖子

0

TA的资源

一粒金砂(初级)

5
 
                                 楼主你好,请问用的是什么仿真器?版本?
此帖出自stm32/stm8论坛
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

6
 
                                 好贴
此帖出自stm32/stm8论坛
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

7
 
                                 COSMIC C这么差吗,是不是优化级别不够高?
此帖出自stm32/stm8论坛
 
 
 

回复

59

帖子

0

TA的资源

一粒金砂(初级)

8
 



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];
   }
}
此帖出自stm32/stm8论坛
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

9
 
                                 莫非效率还跟仿真器有关
此帖出自stm32/stm8论坛
 
 
 

回复

8

帖子

0

TA的资源

一粒金砂(中级)

10
 
SECTION `.far_func.text`:CODE:NOROOT(0) 这句楼主可以讲解下是什么意思吗?
此帖出自stm32/stm8论坛
 
 
 

回复

5

帖子

0

TA的资源

一粒金砂(初级)

11
 
嗯,COSMIC是否已经选了start-up file?
此帖出自stm32/stm8论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表