本想把 结构体 变量数据 保存 到24C02中, 再读取保存数据,验证保存是否成功。开始没加 #pragma pack (x) 对齐关键字,结果反复调试都是失败只有部分数据存进去了。若将成员变量一个一个存,再一个一个读就没问题。在单步调试发现成员变量的地址不连续。豁然开朗 原来字节 对齐问题,编译器默认是4字节对齐,所以就导致了成员变量地址不连续。成员变量中有1、2、4字节的公约数是1, 所以加 #pragma pack (1) 1字节对齐就解决了结构体成员变量地址不连续问题,让其连续。
触摸屏校准参数保存 代码片段: (所调用的函数是没问题的,经过百万套产品验证)
#define RTS_ADJUST_OK 0x55 //校准OK或已经校准 #define RTS_ADJUST_SAVE_SADDR 0x00 //校准参数保存首地址 #pragma pack (1) //1字节对齐,若不加,成员变量类型不同,则字节空间不连续。字节对齐问题 typedef struct { f32 Xfac; //系数因子 f32 Yfac; s16 Xoff; //常数偏移量 s16 Yoff; u8 Sta; //校准状态 }SAdjustPar_t; //电阻触摸屏校准类型 #pragma pack () //取消字节对齐 SAdjustPar_t s_adjPar = {0, 0, 0, 0, 0}; //结构体变量 s_adjPar.Xfac = ((adjParTmp1.Xfac + adjParTmp2.Xfac)/2); s_adjPar.Xoff = ((adjParTmp1.Xoff + adjParTmp2.Xoff)/2); s_adjPar.Yfac = ((adjParTmp1.Yfac + adjParTmp2.Yfac)/2); s_adjPar.Yoff = ((adjParTmp1.Yoff + adjParTmp2.Yoff)/2); s_adjPar.Sta = RTS_ADJUST_OK; //标记校准 AT24CXX_Write(RTS_ADJUST_SAVE_SADDR, (u8 *)&s_adjPar, sizeof(s_adjPar)); //保存校准参数 adjParTmp1.Xfac = 0; adjParTmp1.Xoff = 0; adjParTmp1.Yfac = 0; adjParTmp1.Yoff = 0; adjParTmp1.Sta = 0; AT24CXX_Read(RTS_ADJUST_SAVE_SADDR, (u8 *)&adjParTmp1, sizeof(adjParTmp1)); //读取保存校准参数 if( (s_adjPar.Xfac != adjParTmp1.Xfac) || \ (s_adjPar.Xoff != adjParTmp1.Xoff) || \ (s_adjPar.Yfac != adjParTmp1.Yfac) || \ (s_adjPar.Yoff != adjParTmp1.Yoff) || \ (s_adjPar.Sta != adjParTmp1.Sta) ) //检测保存是否正确 { step = 0; break; }