本文主要是介绍请教littlefs关于发生“错误”(不是数据错是空间满),关于写入不正常的问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
论坛帖子:
cantonguy:
之前用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()一旦发生错误返回,就会导致无法保存或者无法正确清空文件的问题
请教用过的高手,是不是我用这个库哪里理解错误或者调用漏了什么?
wye11083:
几乎所有的spi文件系统一般都不会去主动回收空间的,否则就没法做磨损均衡了。 |
flamma:
这是littlefs的安全逻辑,当你发生空间不够错误的时候,文件被认为不可靠了。所以不管close或者sync时,检查到文件错误被置位就不会再进行实际写的操作。
你如果飞要写就只能去改写littlefs的代码,比如写的时候发生空间不够错误不去置文件错误位。
还有一种比较正规但比较麻烦的做法是调用 lfs fs_size获得文件系统使用大小和你flash大小进行比较,不够了就停止。或者调用lfs_fs_traverse来获得使用的block,然后和你flash的block进行比较。
cantonguy:
flamma 发表于 2020-5-12 23:44
这是littlefs的安全逻辑,当你发生空间不够错误的时候,文件被认为不可靠了。所以不管close或者sync时, ...
谢谢。
其实我并非想写满了后继续写,只是想写满后littlefs能正确给我返回写满的信息,然后就不会继续写。而且可以在任何时候(包括满)按需要清除写满的文件再重新写。
顶层贴的意思是当littlefs提示写满后,我并没继续写的,而是会清除文件,但是清除就不正常了。我现在的做法是做一个全局标志,一旦发生写满,标志位写1,并且马上关闭文件并重新打开一次,直到用户执行清除,只有这样才能成功清除文件,做法非常愚蠢。
按常理满了littlefs应该提示满错误,就退出就是了,不明白为什么一旦发生满错误文件关闭、清除(实际上是截断)通通无效。
你说的方式不麻烦,我等下试试。
请教littlefs关于发生“错误”(不是数据错是空间满),关于写入不正常的问题 (amobbs.com 阿莫电子论坛)
这篇关于请教littlefs关于发生“错误”(不是数据错是空间满),关于写入不正常的问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!