如何方便的读写结构体到EEPROM中?

2020-02-06 10:09发布

f1946的片子,想写个结构体到eeprom中,但是
eeprom_write(unsigned char addr, unsigned char value);
只能写8位无符号数据,而我要操作的结构体却是有各种
数据的,例如long。

我不想用循环什么的一个字节一个字节读出来再
拼起来,或者把内存中的结构体打撒成为一个
字节一个字节的数据再写进去,感觉很繁琐,
有没有什么更好的办法?

别告诉我可以不使用eeprom_write等等函数,
直接用PC指针对EEPROM进行操作,那就太方便了!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
27条回答
liuqian
2020-02-08 23:19
本帖最后由 liuqian 于 2015-11-12 20:10 编辑

前一段正好写过类似的,就说一说
我用avr32,它是4字节对齐的,比如有一个struct
typedef struct eepData_t{
U32 a;
U16 b;
U8 c;
U8 d;
U8 e;
}eepData_t;

用sizeof(eepData_t),结果是12,就是说最后一个U8 eee实际占用了4 bytes。
内存中是这样的
a3,a2,a1,a0,b1,b0,c,d,X,X,X,e
X,X,X是被浪费的3字节,直接存大量这样的数据到eeprom,这种浪费是不能忍受的,改之
typedef struct eepData_t{
U32 a;
U16 b;
U8 c;
U8 d;
U8 e;
U8 x1;//无效数据 3 字节
U8 x2;
U8 x3;
}eepData_t;

eepData_t dataInRam;
dataInRam.a=0x12345678;
......
dataInRam.e=0x0e;

数据准备好了,写入的时候,直接强制类型转换

int writeData(U32 address, U8 *ptrData);
int wirteByte(U32 address, U8 byteData);

int writeData(U32 addr, U8 *data)
{
// 自己是知道一共要写9个字节的
for(int i=0;i<9;i++)
{
wirteByte(addr,*data);
data++;
addr++;
}
}

写入时用强制类型转换
writeData((U8 *)&dataInRam);

-----------------over-------------------

都是很基础的C,如果不明白,建议是找本国外的经典C教材,仔细看,最好直接看英文版,谭大师的就算了,虽然我也是用谭大师的书入门的,但是后来有重新学

修改:错别字

一周热门 更多>