很多时候读I2C存储芯片,需要定义一堆的地址,读写长度,如果后期在中间插入一个存储,维护的成本就会很高,调试修改都很困难,介绍一种利用结构体定义存储结构的方法,需要用到以下两个宏定义
计算结构成员在结构体内的偏移地址,用在I2C的存储结构中很方便知道每个变量的存储地址,修改存储结构也不会影响到程序的修改
#define offsetof(TYPE, MEMBER) ((int)(&((TYPE *)0)->MEMBER))
计算结构成员的占用的空间
sizeof(((CANDIDATE_T*)0)->total_tv)
使用样例,定义数据存储结构CANDIDATE_T
typedef struct {
VOTE_DATE_T vote_date;
uint8_t vtn[50];
uint8_t av;
uint8_t ebb_id[12];
uint16_t total_tv;
uint8_t candidate_num;
uint16_t total_voters;
uint16_t no_voters;
VOTE_DATA_T vote_data[CANDIDATE_NUM];
}CANDIDATE_T;
at88sc_write_storage( AT_SC, offsetof(CANDIDATE_T,total_tv), sizeof(((CANDIDATE_T*)0)->total_tv), ptr);
at88sc_read_storage( AT_SC, offsetof(CANDIDATE_T,total_tv), sizeof(((CANDIDATE_T*)0)->total_tv), ptr);
修改数据存储基本不用修改代码,改变地址也不用担心程序读写地址出错,改变名称更会有编译错误担心,添加删除数据单元出一样,比直接地址读写方式省下维护的时间,修改起来也不会出错