之前的老代码中用到大量位变量,其中很多部分会在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位都去数一下它在第几位,而且以后维护的时候还不能改,那样不是死的很难看?
谢谢! |