诚然,这是一个非常愚蠢的问题,但是前几天我在想这个问题。有时在源代码中,我看到这样定义的寄存器:
union
{
uint8_t byte;
struct
{
uint8_t bit1 :1;
uint8_t bit2 :1;
uint8_t bit3_4 :2;
uint8_t rsvd :4;
} bitfield;
} SomeReg_t;
其他时候我只看到标准结构:
struct
{
uint8_t bit1 :1;
uint8_t bit2 :1;
uint8_t bit3_4 :2;
uint8_t rsvd :4;
} SomeReg_t;
我写了一个简单的例子来说明我的意思:
问题是,关于位域,这两个定义有什么区别。什么时候将一个与另一个用于位域。
答案 0 :(得分:2)
很容易解释
如果您还想读取或分配整个字节,则联盟很方便。
例如
typedef union
{
uint8_t byte;
struct
{
uint8_t bit1 :1;
uint8_t bit2 :1;
uint8_t bit3_4 :2;
uint8_t rsvd :4;
} bitfield;
} SomeReg_t;
SomeReg_t reg;
reg.bitfield.bit1 = 1;
/*...*/
printf("The reg value is %hhx\n", reg.byte);
reg.byte = ReadFormPeriph();
if(reg.bitfield.rsvd == 0b1011)
{
/* do something */
}