[开发工具]

[复制链接]
2686|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速度优化不咋地。


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

是我自己无知了。
香水城 发表于 2008-9-14 16:39 | 显示全部楼层

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

否则显得自己水平低。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

144

主题

376

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部