L23STR; extern volatile ATD0CTL23STR _ATD0CTL23 @(REG_BASE + 0x000002C2UL); #define ATD0CTL23 _ATD0CTL23.Word #define ATD0CTL23_FRZ0 _ATD0CTL23.Bits.FRZ0 #define ATD0CTL23_FRZ1 _ATD0CTL23.Bits.FRZ1 #define ATD0CTL23_FIFO _ATD0CTL23.Bits.FIFO #define ATD0CTL23_S1C _ATD0CTL23.Bits.S1C #define ATD0CTL23_S2C _ATD0CTL23.Bits.S2C #define ATD0CTL23_S4C _ATD0CTL23.Bits.S4C #define ATD0CTL23_S8C _ATD0CTL23.Bits.S8C #define ATD0CTL23_DJM _ATD0CTL23.Bits.DJM #define ATD0CTL23_ACMPIE _ATD0CTL23.Bits.ACMPIE #define ATD0CTL23_ASCIE _ATD0CTL23.Bits.ASCIE #define ATD0CTL23_ETRIGE _ATD0CTL23.Bits.ETRIGE #define ATD0CTL23_ETRIGP _ATD0CTL23.Bits.ETRIGP #define ATD0CTL23_ETRIGLE _ATD0CTL23.Bits.ETRIGLE #define ATD0CTL23_ICLKSTP _ATD0CTL23.Bits.ICLKSTP #define ATD0CTL23_AFFC _ATD0CTL23.Bits.AFFC #define ATD0CTL23_FRZ _ATD0CTL23.MergedBits.grpFRZ
#define ATD0CTL23_FRZ0_MASK 1U #define ATD0CTL23_FRZ1_MASK 2U #define ATD0CTL23_FIFO_MASK 4U #define ATD0CTL23_S1C_MASK 8U #define ATD0CTL23_S2C_MASK 16U #define ATD0CTL23_S4C_MASK 32U #define ATD0CTL23_S8C_MASK 64U #define ATD0CTL23_DJM_MASK 128U #define ATD0CTL23_ACMPIE_MASK 256U #define ATD0CTL23_ASCIE_MASK 512U #define ATD0CTL23_ETRIGE_MASK 1024U #define ATD0CTL23_ETRIGP_MASK 2048U #define ATD0CTL23_ETRIGLE_MASK 4096U #define ATD0CTL23_ICLKSTP_MASK 8192U #define ATD0CTL23_AFFC_MASK 16384U #define ATD0CTL23_FRZ_MASK 3U #define ATD0CTL23_FRZ_BITNUM 0U
1、位域的分配
位域定义时的位地址分配并不是我们想象的那样依次按从上而下,从低位到高位的顺序排列起来的。他在分配时根据当前占用的位域和下一个位域能否合并为一个字节,来
判断是否将当前位域独立为一个字节,如果不注意这一点,很有可能位域分配时会存在只有几个位就占用了一个字节的情况。比如:
struct{
union{
struct{
unsigned char bit0:4;
unsigned char bit1:1;
unsigned char bit2:3;
unsigned char bit4:4;
unsinged char bit5:6;
unsigned char bit6:6;
}bitdata;
unsigned char data[3];
}example_unn;
}example_stt;
本来我们以为:4+1+3+4+6+6=24个bit占3个字节;
而实际上位域并没有我们想象的那么灵活:
struct{
union{
struct{
//byte1: 4+1+3=8(正好8位)
unsigned char bit0:4;
unsigned char bit1:1;
unsigned char bit2:3;
//byte2:因为4+6>8,bit4所以单独占一个字节
unsigned char bit4:4;
//byte3:同上bit5单独占一个一节(6+6>8)
unsinged char bit5:6;
//byte4:最后bit6再单独占一个字节
unsigned char bit6:6;
}bitdata;
unsigned char data[4];//所以一共占用了4个字节
}example_unn;
}example_stt;
C语言位域定义并不是太好用,当我们根据实际使用情况需要将内存那么分配时,位域将会失去他的便捷性,如上我们无法将bit4和bit5的低4位合并起来访问,实际操作
我们还是要自己移位赋值,所以在制定协议时最好不要做跨字节的连续位定义。
2、位定位定义中的无名位域
无名位域可以用来填充使用,但无法访问。
对于1中的情况,我们可以加入无名位域使其看起来更直观的表示其位域地址分配的情况:
struct{
union{
struct{
//byte1: 4+1+3=8(正好8位)
unsigned char bit0:4;
unsigned char bit1:1;
unsigned char bit2:3;
//byte2:因为4+6>8,bit4所以单独占一个字节
unsigned char bit4:4;
unsigned char :4;//无名位域,占位用,这样你一下就可以看出,bit4单独占一个字节!
//byte3:同上bit5单独占一个一节(6+6>8)
unsigned char bit5:6;
unsigned char :2;