搜索
bottom↓
回复: 5

请教littlefs关于发生“错误”(不是数据错是空间满),关于写入不正常的问题

[复制链接]

出20入0汤圆

发表于 2020-5-11 21:22:57 | 显示全部楼层 |阅读模式
之前用spiffs非常不爽,换了之前论坛有人介绍的littlefs,可以编译正常运行的。

发现当用lfs_file_write()写入直到提示空间不足,就会发生几个奇怪问题。

文件建立后,我做了两个测试

1、不停写入直至空间满然后重新上电读出
调用lfs_file_write()不停写,直到此函数返回“错误”,实质上是空间不足,littlefs也会向串口也会提示空间不足
不管,此时断电,重新上电用lfs_file_read()发现读不出东西来,文件是空的。
尝试在写完后(即空间提示不足时)执行lfs_dir_close(),重新上电读,效果也行一样不行。

解决的方法是在每次lfs_file_write()后执行lfs_file_sync(),这时就算写提示空间不足,还是可以正确将数据写入,重上电也可以读出来,并且不需要执行lfs_dir_close()。
或者是在估算文件快满时,提前不写。数据也正确写入和读出。
但这样的话写入速度会变成会非常缓慢,一点优势都没有了,目测至少慢10倍,那开缓存干嘛呢。另外,这样做也是非常不合理,怎么可能要预先估算大小呢。。。

2、不停写入,直至空间满,然后清除文件,再写入一遍。
这里清除文件,不是删除文件,是指定文件大小为0,调用lfs_file_truncate(),和上面非常类似。
连续写入直到提示空间不足的错误后停止,再执行lfs_file_truncate(),然后读取文件大小,确实大小为0,但是再写入也会提示空间不足,重启读取文件大小,发现根本没删除,而且还可以正确读出来。
尝试不写到提示空间不足错误,提前终止写入并执行lfs_file_truncate(),再重新写一次就正常。
尝试写到空间不足后,重启,不执行任何写入,直接执行lfs_file_truncate(),这时又可以重新写入一遍。

从上面看的怪异情况是每次lfs_file_write()一旦发生错误返回,就会导致无法保存或者无法正确清空文件的问题

请教用过的高手,是不是我用这个库哪里理解错误或者调用漏了什么?

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

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入442汤圆

发表于 2020-5-11 22:00:00 来自手机 | 显示全部楼层
几乎所有的spi文件系统一般都不会去主动回收空间的,否则就没法做磨损均衡了。

出20入0汤圆

 楼主| 发表于 2020-5-11 23:27:09 | 显示全部楼层
wye11083 发表于 2020-5-11 22:00
几乎所有的spi文件系统一般都不会去主动回收空间的,否则就没法做磨损均衡了。 ...

那我提到的2个问题怎么解决?
如果按我的方法去做,又违反这些系统设置的初衷,非常矛盾

出0入169汤圆

发表于 2020-5-12 10:47:34 | 显示全部楼层
关注ing......

出0入0汤圆

发表于 2020-5-12 23:44:22 | 显示全部楼层
  这是littlefs的安全逻辑,当你发生空间不够错误的时候,文件被认为不可靠了。所以不管close或者sync时,检查到文件错误被置位就不会再进行实际写的操作。
你如果飞要写就只能去改写littlefs的代码,比如写的时候发生空间不够错误不去置文件错误位。
还有一种比较正规但比较麻烦的做法是调用 lfs fs_size获得文件系统使用大小和你flash大小进行比较,不够了就停止。或者调用lfs_fs_traverse来获得使用的block,然后和你flash的block进行比较。

出20入0汤圆

 楼主| 发表于 2020-5-13 08:38:28 | 显示全部楼层
flamma 发表于 2020-5-12 23:44
这是littlefs的安全逻辑,当你发生空间不够错误的时候,文件被认为不可靠了。所以不管close或者sync时, ...

谢谢。

其实我并非想写满了后继续写,只是想写满后littlefs能正确给我返回写满的信息,然后就不会继续写。而且可以在任何时候(包括满)按需要清除写满的文件再重新写。
顶层贴的意思是当littlefs提示写满后,我并没继续写的,而是会清除文件,但是清除就不正常了。我现在的做法是做一个全局标志,一旦发生写满,标志位写1,并且马上关闭文件并重新打开一次,直到用户执行清除,只有这样才能成功清除文件,做法非常愚蠢。
按常理满了littlefs应该提示满错误,就退出就是了,不明白为什么一旦发生满错误文件关闭、清除(实际上是截断)通通无效。

你说的方式不麻烦,我等下试试。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-26 19:21

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

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