结构体变量 存到24C02中 读出来不对 (结构体成员变量 字节对齐问题)

本想把 结构体 变量数据 保存 到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;
       }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值