sinc_mark 发表于 2017-10-26 08:30:31

断电重启后flash 数据异常

最近需要在linux保存数据,定义了一个结构体,在需要保存数据的时候,我在打开文件之后,定位到文件开始的地方,然后写入结构体字节数的数据,查看写入的字节数等于结构体的大小;但当我重新上电后,发现读该文件,数据不正确,有时候数据是前一次写入的数据,有时候数据出错了,不知道哪里出了问题,请有经验的兄弟提醒一声!

sinc_mark 发表于 2017-10-26 08:31:29

补充1点:flash 是核心板的nandflash,不是eeprom

ryq0110 发表于 2017-10-26 09:08:38

你应该这么修改文件(假设你修改的文件名是A)
1.复制A到文件B
2.修改文件B
3.同步文件内容(sync,fsync或者fflush)
4.重命名文件B的名称为A(rename)
这样才能保证意外断电造成的数据损坏。

sinc_mark 发表于 2017-10-26 09:13:24

ryq0110 发表于 2017-10-26 09:08
你应该这么修改文件(假设你修改的文件名是A)
1.复制A到文件B
2.修改文件B


首先谢谢你的意见,
但我不是意外断电,我是主动的断电,现在我的疑惑是,为什么我明明写了文件了,但重启后再次读文件失败了!

ryq0110 发表于 2017-10-26 09:18:20

本帖最后由 ryq0110 于 2017-10-26 09:19 编辑

严格按照我上面说的操作。
因为你没有执行第3步,将缓冲区数据同步到文件。
其实如果在实行第3步的过程中断电,文件内容可能被破坏。
所以想正确修改一个文件,严格按照上面的操作,因为第4部是原子操作,不会破坏数据A的完整性。

shell.albert 发表于 2017-10-26 09:26:46

第一,你可能没有执行sync,将缓冲的数据通过驱动刷新到Flash中。
第二,你可能是使用了Readonly挂载的文件系统,或是将节点挂载了ramfs或tmpfs之类的内存文件系统。
页: [1]
查看完整版本: 断电重启后flash 数据异常