2016-06-06 1 views
0
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).Keil битовые поля выделяет неправильный размер накидной/структуры

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

Заранее благодарен!

ответ

0

Это работает для меня (и для моего проекта это даже лучше иметь 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 компилятор выделяет битовые поля в обратном порядке.

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

Смежные вопросы