C структура против объединения в отношении битовых полей - PullRequest
0 голосов
/ 21 декабря 2018

По общему признанию, это очень глупый вопрос, но тот, о котором я думал на днях.Иногда в источнике я вижу регистры, определенные так:

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;

Я написал небольшой пример, чтобы показать, что я имею в виду:

https://onlinegdb.com/r1H3Xuqe4

Вопрос в том, что касается битовых полей, каковы различия в этих двух определениях.Когда вы будете использовать одно против другого для битовых полей.

1 Ответ

0 голосов
/ 21 декабря 2018

Легко объяснить

Объединение удобно, если вы хотите прочитать или назначить также целый байт.

например

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 */
}
...