关于位字段的C结构与联合

关于位字段的C结构与联合,c,embedded,C,Embedded,诚然,这是一个非常愚蠢的问题,但前几天我一直在思考这个问题。有时在源代码中,我看到寄存器的定义如下: 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 { u

诚然,这是一个非常愚蠢的问题,但前几天我一直在思考这个问题。有时在源代码中,我看到寄存器的定义如下:

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;
我写了一个简单的例子来说明我的意思:

问题是,关于位字段,这两种定义有什么区别。什么时候可以将一个与另一个用于位字段。

这很容易解释

如果您还想读取或分配整个字节,Union非常方便

比如说

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 */
}
比特域?看到和