Битовые поля Keil выделяют неправильный размер объединения/структуры

typedef union {
 struct {
  union {
   struct {
    unsigned int dev_t : 4; // Device Type, see DEV_type_t
    unsigned int dev_n : 7; // Device Number
   };
   unsigned int id : 11; // CAN_ID
  };
  unsigned int online    : 1;
  unsigned int reserved  : 4;
 }; // 16 bit total
 uint16_t _raw;
} CAN_prefix_t;

После компиляции sizeof(CAN_prefix_t) показывает 3 bytes, но ожидается, что будет 2 bytes (11+1+4 bits or 4+7+1+4 bits = 16 bits).

Может ли кто-нибудь посоветовать, как правильно определить структуру/объединение выше?

Заранее спасибо!


person Alex Pristenskiy    schedule 06.06.2016    source источник


Ответы (1)


Это работает для меня (и для моего проекта еще лучше иметь 2 "вида" - с точки зрения устройства и с точки зрения CAN-шины):

#pragma pack(push,1)

typedef union {
    struct {
        unsigned int dev_n      : 7;
        unsigned int dev_t      : 4;
        unsigned int online   : 1;
        unsigned int reserved : 4;      
    } dev;
    struct {
        unsigned int id              : 11;
        unsigned int online    :  1;
        unsigned int reserved  :  4;
    } can;
    uint16_t raw;
} CAN_prefix_t;

#pragma pack(pop)

ВАЖНО: компилятор Keil размещает битовые поля в обратном порядке.

А также Keil плохо работает с вложенными союзами.

person Alex Pristenskiy    schedule 06.06.2016