[stm8s]IAR for stm8果然是杯具-_-

2019-12-11 18:34发布

总见上官一直支持IAR,我今天也突然有兴致换个编译器试试,
移植了cosmic下的一个stm8s103F3的工程,编译成功,结果发现真杯具-_-


cosmic下 data:58 flash:2578 堆栈未知(我没做堆栈占用信息的统计工具) 我并没有使用开代码压缩,即使开了也就再少几十字节,我写的代码一向注重优化了。。。

结果在IAR下
  2 143 bytes of readonly  code memory
  1 105 bytes of readonly  data memory
    326 bytes of readwrite data memory


杯具。。。等IAR懂了stm8的指令,等IAR懂(u8)(a>>8)只取低8位就可以不需要真的移8次,要等到什么时候-_-
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
90条回答
snoopyzz
2019-12-14 05:06
ram倒真是一样的。。。

cosmic的ram 有额外的x_reg,y_reg共四字节,58-4=54
iar有16字节的vreg,326-256-16=54


flash优化方面,我观察了下汇编。只能说目前真的不怎么样,连ST7的指令集都不会用,似乎是只使用了标准6502指令集。。。

[IAR]

      8                  {
      9                          APump.Tick = MS(500);
      000006 A67D                  LD        A, #0x7d
      000008 C70000                LD        L:APump, A
     10                          APump.CurLevel = LEVEL_STOP;
      00000B 4F                    CLR       A
      00000C C70000                LD        L:APump + 2, A
     11                          APump.IsUpdate = true;
      00000F A601                  LD        A, #0x1
      000011 CA0000                OR        A, L:APump + 3
      000014 C70000                LD        L:APump + 3, A
      000017 2000                  JRA       L:??APump_DoEvent_1
     12                  }

[cosmic]
458  0005 357d0000              mov        _APump,#125
459                     ; 10                 APump.CurLevel = LEVEL_STOP;
460  0009 3f02                  clr        _APump+2
461                     ; 11                 APump.IsUpdate = true;
463  000b 2011                  jp        LC001  (后面有相同的语句,合并优化,故跳转后面去了)
...
481  001e 72100003              bset        _APump+3,#0

我之前还用错了。。。IAR的代码还更大些,
有些位变量,我是用了cosmic的_Bool来定义的,在IAR中被认做了unsigned char

一周热门 更多>