问题描述:在开发过程中,构建了一个结构体,然后将结构体保存到flash芯片中,读取出来的时候数据内容和存进去的不一样(STM32F103芯片)
问题所在:构建结构体的时候,没有注意到结构体数据的对齐问题,计算错了结构体的大小
详细说明:
没有进行对齐的结构体内容如下:
根据结构体的内容,按照常规的计算方式,那么这个结构体的大小是32个字节,所以我写到flash里边的时候,写入长度就给了32个字节的长度。
struct BOX_STATE
{
u32 box_password; //4字节
u16 temperature;//2字节
u16 humidity;//2字节
u8 lock_state;//1字节
u8 use_state ;//1字节
uint64_t waybill_num;//8字节
uint64_t phone_num;//8字节
u32 obligate;//4字节
u16 obligate1; //2字节
};
//给结构体赋值,查看内存情况
memset(&a_box,0xAA,sizeof(a_box));//初始化这个结构体,将初值设置为0xAA,方便对比
a_box.box_password=0x11111111;
a_box.temperature=0x2222;
a_box.humidity=0x3333;
a_box.lock_state=0x44;
a_box.use_state=0x55;
a_box.waybill_num=0x6666666666666666;
a_box.phone_num=0x7777777777777777;
a_box.obligate=0x88888888;
a_box.obligate1=0x9999;
以下是内存的内容:
蓝色部分是结构体占的内存,一共是40个字节,并不是按照上边计算的那样是32个字节,从图中可以看到,红色框里边还有0xAA,说明这一部分是没有被使用到的,因为是8字节对齐,所以这里计算或者使用指针取数据的时候要考虑到这一点
对齐之后的结构体
struct BOX_STATE{
u32 box_password; //4
u32 obligate; //4
u16 temperature;//2
u16 humidity;//2
u16 obligate1; //2
u8 lock_state;//1
u8 use_state ;//1
uint64_t waybill_num; //8
uint64_t phone_num; // 8
};
//给结构体赋值,查看内存情况
memset(&a_box,0xAA,sizeof(a_box));//初始化这个结构体,将初值设置为0xAA,方便对比
a_box.box_password=0x11111111;
a_box.temperature=0x2222;
a_box.humidity=0x3333;
a_box.lock_state=0x44;
a_box.use_state=0x55;
a_box.waybill_num=0x6666666666666666;
a_box.phone_num=0x7777777777777777;
a_box.obligate=0x88888888;
a_box.obligate1=0x9999;
内存情况如上图所示,这次占用的是32个字节,里边没有0xAA,说明内存已经全部被使用了,这时候如果要是使用指针读取数据,根据结构体里边内容的大小进行偏移就可以取到数据了,对齐之后也节省了内存
项目中碰到的问题,记录一下,如有问题,请指出,虚心受教