栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/864213.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号