【问题标题】:Keil bit-fields allocates wrong size of union/structKeil 位域分配错误大小的联合/结构
【发布时间】:2016-06-06 08:01:45
【问题描述】:
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)

谁能建议如何以正确的方式定义上面的结构/联合?

提前致谢!

【问题讨论】:

    标签: sizeof unions bit-fields keil


    【解决方案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 也不能很好地处理嵌套联合。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-08-30
      • 1970-01-01
      • 2011-02-08
      • 1970-01-01
      • 1970-01-01
      • 2021-10-29
      • 1970-01-01
      相关资源
      最近更新 更多