|
发表于 2009-6-14 16:10:01
|
显示全部楼层
我也来说说我怎么做的:
数据分主存和备份,两部分的数据完全相同,每部分的数据由有效数据,校验和及特征码(0xaa,0x55)组成。
读取数据的时候,先读主存,如果校验和和特征码都正确,则读取备份区,如果备份区的 校验和不正确,或者与主存区不一样,或者特征码不正确,就直接用主存区的数据恢复。如果主存区不正确,则读取备份区,检查校验和和特征码,若正确则恢复主存区,不正确就只能恢复到默认值了。
写数据的时候,先写主存区再写备份区,流程都是 :先写特征码为0x00,0x00,然后写有效数据和 校验码,最后写特征码为0xaa,0x55
特征码有什么作用?举个例子:不使用特征码时,某个时刻EEPROM中存储的数据为0x10,0x20,0x30,0x60,(第4个字节为校验和,下同),现在数据需要变更为0x20,0x10,0x50,0x80,如果刚写完主存区数据0x10掉电了,最后主存区的数据变成了0x20,0x10,0x30,0x60,而备份区的数据仍然是0x10,0x20,0x30,0x60,主存区的校验和仍然正确,而实际上数据是错误的,再次重新读取数据的时候,将得到错误的数据,并用错误的数据覆盖备份区。
使用特征码,每次写有效数据前,先把特征码写成0x00,0x00,数据写完后才写为0xaa,0x55,这样读取数据时一旦发现特征码不正确,说明数据没正常写入。只要硬件不发生故障,主存区和备份区至少有一个区的特征码是正确的。如果两个区的校验和特征码都正确,但校验和不一样,则说明主存区的数据是最近一次写入的,而备份区的数据是上次写入的,需要用主存区的数据覆盖。
另外,读取数据的时候发现不正确,可以重复读三遍,防止总线受干扰而读到错误的数据,误判断为EEPROM中存储的数据错误。
关键数据一定要有备份区,不然数据写入一半的时候掉电,就只能挂掉了。如果只是一些无关紧要的参数,恢复到默认值就行,但如果是IP地址这样的参数受到破坏,将没法上网了,只能人工去恢复。 |
|