C语言位域引起的字节对齐问题

偶然的一个bug,掉进了前人挖的坑,爬上来记下来。

修改前的类型定义:

typedef struct
{
    union {
        uint32_t value1;
        struct
        {
            ……

        };
    };

    union {
        uint32_t value2;
        struct
        {
            uint8_t reserved1 : 2;
            uint8_t MotorDriver_temperature_sensor_fault : 1;
            uint8_t reserved2 : 3;
            uint8_t MotorDriver_ADC_sampling_fault : 1;
            uint8_t reserved3 : 8;
            uint8_t reserved4 : 1;

            uint8_t Spary_Motor_open_circuit  : 1;
            uint8_t Filter_Motor_open_circuit : 1;
            uint8_t reserved5 : 3;
            uint8_t Vacuum_or_Brush_Motor_overload : 1;
            uint8_t Spary_Motor_overload : 1;
            uint8_t Filter_Motor_overload : 1;
            uint8_t reserved6 : 2;
            uint8_t Brushlift_Motor_overload : 1;
            uint8_t Squeegeelift_Motor_overload : 1;
            uint8_t MotorDriver_temperature_very_high : 1;
            uint8_t MotorDriver_temperature_extremely_high : 1;
            uint8_t reserved7 : 2;
        };
    };
} XD510_ERROR_CODE_TypeDef;

修改后的类型:

typedef struct
{
    union {
        uint32_t value1;
        struct
        {
            ……

        };
    };

    union {
        uint32_t value2;
        struct
        {
            uint8_t reserved1 : 2;
            uint8_t MotorDriver_temperature_sensor_fault : 1;
            uint8_t reserved2 : 3;
            uint8_t MotorDriver_ADC_sampling_fault : 1;
            uint8_t reserved3 : 1;
            uint8_t reserved4 : 8;

            uint8_t Spary_Motor_open_circuit  : 1;
            uint8_t Filter_Motor_open_circuit : 1;
            uint8_t reserved5 : 3;
            uint8_t Vacuum_or_Brush_Motor_overload : 1;
            uint8_t Spary_Motor_overload : 1;
            uint8_t Filter_Motor_overload : 1;
            uint8_t reserved6 : 2;
            uint8_t Brushlift_Motor_overload : 1;
            uint8_t Squeegeelift_Motor_overload : 1;
            uint8_t MotorDriver_temperature_very_high : 1;
            uint8_t MotorDriver_temperature_extremely_high : 1;
            uint8_t reserved7 : 2;
        };
    };
} XD510_ERROR_CODE_TypeDef;

修改内容就是调整了一下黄色背景部分。

在修改的结构体中,前四个成员变量占用7bit。修改前,reserved3成员占用8bit,那么不能继续放在前面7bit之后,需要占用新的1byte,原来7bit后面填充1bit对齐,然后reserved4和后面几个成员开始新的1byte,导致最后MotorDriver_temperature_extremely_high成员后面还有1bit空间,而reserved7占用2bit,又需要重新占用1byte,这样整个结构体占用5byte,超出了预想的空间,在使用中出现bug。而修改后,结构体内的所有成员刚好能够占用4byte。

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值