|
最近在学习AVR,使用的开发环境是IAR,在参考一些资料和看了IAR开发环境提供个help文档之后,基本上可以把内部资源都调试成功,发现,IAR里面的位操作挺方便,但是自己打开头文件去看IAR是如何实现这种位操作的,但就是看不懂,所以就来这里向高手请教,以下是IAR头文件里面的一部分代码
特殊功能寄存器PORTA的定义如下
SFR_B_N(0x1B,PORTA,PORTA7,PORTA6,PORTA5,PORTA4,PORTA3,PORTA2,PORTA1,PORTA0)
SFR_B_N是一个宏,使用goto definition 可以看到其定义如下:
#define SFR_B_N(_ADDR, _NAME, _B7, _B6, _B5, _B4, _B3, _B2, _B1, _B0) \
SFR_B_BITS_N(_NAME, _ADDR, \
Bit0,Bit1,Bit2,Bit3,Bit4,Bit5,Bit6,Bit7, \
_B0,_B1,_B2,_B3,_B4,_B5,_B6,_B7)
然后继续使用goto definition发现SFR_B_BITS_N的宏定义代码如下:
#define SFR_B_BITS_N(_NAME, _ADDR, _A,_B,_C,_D,_E,_F,_G,_H, \
_A2,_B2,_C2,_D2,_E2,_F2,_G2,_H2) \
__io union { \
unsigned char _NAME; /* The sfrb as 1 byte */ \
struct { /* The sfrb as 8 bits */ \
__BYTEBITS(_NAME, _A,_B,_C,_D,_E,_F,_G,_H) \
}; \
struct { /* The sfrb as 8 bits */ \
__BYTEBITS(_NAME, _A2,_B2,_C2,_D2,_E2,_F2,_G2,_H2) \
}; \
} @ _ADDR;
继续。。。。__BYTEBITS的goto definition代码为:
#define __BYTEBITS(_NAME,_A,_B,_C,_D,_E,_F,_G,_H) \
unsigned char _NAME ## _ ## _A:1, \
_NAME ## _ ## _B:1, \
_NAME ## _ ## _C:1, \
_NAME ## _ ## _D:1, \
_NAME ## _ ## _E:1, \
_NAME ## _ ## _F:1, \
_NAME ## _ ## _G:1, \
_NAME ## _ ## _H:1;
到这里就不能再往下进行goto definiton了,最终我还是看不懂这部分代码是如何实现位操作的,
这个问题很是困扰,因为我用IAR开发S3C2410的时候发现里面的头文件也是这样定义的,我猜这应该是IAR的一种风格吧
希望高手可以帮小弟解决问题呀
万分感谢!!!!!!!!!! |
阿莫论坛20周年了!感谢大家的支持与爱护!!
知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
|