关于位域的结构与联合

时间:2018-12-21 14:11:50

标签: 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
{
   uint8_t bit1   :1;
   uint8_t bit2   :1;
   uint8_t bit3_4 :2;
   uint8_t rsvd   :4;
} SomeReg_t;

我写了一个简单的例子来说明我的意思:

official Vault documentation

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

1 个答案:

答案 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 */
}