打印
[复制链接]
1926|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ATmega32L|  楼主 | 2008-9-13 10:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一个简单函数,没有用到局部RAM变量,竟然还是分配堆栈空间

IAR EWARM5.20,最高速度优化。

typedef unsigned long reg_save_t;
reg_save_t __get_primask(void)
{
  asm(
      "mrs r0,primask  "
       "bx lr   "   
        );
  return 1;
}

reg_save_t CriticalEnter(void)

  reg_save_t flags=__get_primask();
  __disable_interrupt();
  return flags;
}

IAR 5.20编译出汇编代码:
CriticalEnter:
        PUSH     {LR}
        SUB      SP,SP,#+4  //分配4个字节堆栈
        BL       __get_primask
        CPSID    I
        ADD      SP,SP,#+4  //释放4个字节堆栈
        POP      {PC}             ;; return
沙发
ATmega32L|  楼主 | 2008-9-13 10:46 | 只看该作者

换成SIZE优化

换成high size优化,
两条多余指令去掉了。
CriticalEnter:
        PUSH     {R7,LR}
        BL       __get_primask
        CPSID    I
        POP      {R1,PC}          ;; return

IAR速度优化不行?

使用特权

评论回复
板凳
浪淘沙| | 2008-9-13 23:49 | 只看该作者

SUB SP,SP,#+4 是为局部变量flags预留空间

因为flags没有用到,所以不必保存,但还是为它预留存储空间。

PUSH {R7,LR}比之前的PUSH {LR}多了一个PUSH与之前的SUB SP,SP,#+4作用一样,都是把堆栈指针移动4个字节。

使用特权

评论回复
地板
ATmega32L|  楼主 | 2008-9-14 11:31 | 只看该作者

iar有点犯傻

没有用到RAM局部变量,竟然还去分配堆栈空间。

这还是使用最高速度优化的。

可见IAR速度优化不咋地。


///////////////////////////////////////////////////

是我自己无知了。

使用特权

评论回复
5
香水城| | 2008-9-14 16:39 | 只看该作者

请楼主研究过编译原理后再评价人家做的如何吧

否则显得自己水平低。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

144

主题

376

帖子

0

粉丝