搜索
bottom↓
回复: 5

断电重启后flash 数据异常

[复制链接]

出0入0汤圆

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

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

 楼主| 发表于 2017-10-26 08:31:29 | 显示全部楼层
补充1点:flash 是核心板的nandflash,不是eeprom

出0入0汤圆

发表于 2017-10-26 09:08:38 | 显示全部楼层
你应该这么修改文件(假设你修改的文件名是A)
1.复制A到文件B
2.修改文件B
3.同步文件内容(sync,fsync或者fflush)
4.重命名文件B的名称为A(rename)
这样才能保证意外断电造成的数据损坏。

出0入0汤圆

 楼主| 发表于 2017-10-26 09:13:24 | 显示全部楼层
ryq0110 发表于 2017-10-26 09:08
你应该这么修改文件(假设你修改的文件名是A)
1.复制A到文件B
2.修改文件B

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

出0入0汤圆

发表于 2017-10-26 09:18:20 | 显示全部楼层
本帖最后由 ryq0110 于 2017-10-26 09:19 编辑

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

出0入0汤圆

发表于 2017-10-26 09:26:46 | 显示全部楼层
第一,你可能没有执行sync,将缓冲的数据通过驱动刷新到Flash中。
第二,你可能是使用了Readonly挂载的文件系统,或是将节点挂载了ramfs或tmpfs之类的内存文件系统。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-29 08:18

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表