打印

代码移植带来的位操作问题求教

[复制链接]
1217|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
bobo5650|  楼主 | 2011-7-11 17:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
之前的老代码中用到大量位变量,其中很多部分会在ISR内外都有操作,所以对这种操作肯定希望能直接用位操作。
用IAR编译出来的lst文件里,看来是在用and或者or来操作的,这样肯定不适合使用。然后我定义成bitband,使用这个宏:#define  RAM_BIT(ADDR,BIT) (*(vu32 *)((((u32)&(ADDR) - CPU_BIT_BAND_SRAM_REG_LO) * 32) + ((BIT) * 4) + CPU_BIT_BAND_SRAM_BASE)),这样出来的汇编倒是直接给bitband赋值了,但是纠结的是2个问题:
1、lst里看到还真在做*32,*4这样的动作(通过移位做的啦当然),难道就不能直接在编译的时候吧它的地址算出来吗,非得在执行的时候再去算?有没有什么办法设置一下IAR让它搞定这个计算的?
2、我们一般定义位域都是类似于
union
    {
      struct{
        char  Bit_a   : 1;
        char  Bit_b   : 1;
        char  Bit_c   : 1;
        char  Bit_d   : 1;
        char  Bit_e   : 1;
        char  Bit_f   : 1;
        char  Bit_g   : 1;
        char  Bit_h   : 1;
      } bits;
      char  uChar;
    };
有没有什么简单的方法转成宏呢。比如我之前使用xx.bits.Bit_a,有没有方法让编译器自动获得Bit_a是第几位呢,也就是自动确定RAM_BIT那个宏里的BIT参数?不然我就得给每个bit位都去数一下它在第几位,而且以后维护的时候还不能改,那样不是死的很难看?

谢谢!

相关帖子

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

本版积分规则

4

主题

279

帖子

1

粉丝