偶然的一个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。