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

本文主要是介绍请教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关于发生“错误”(不是数据错是空间满),关于写入不正常的问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/895776

相关文章

IDEA和GIT关于文件中LF和CRLF问题及解决

《IDEA和GIT关于文件中LF和CRLF问题及解决》文章总结:因IDEA默认使用CRLF换行符导致Shell脚本在Linux运行报错,需在编辑器和Git中统一为LF,通过调整Git的core.aut... 目录问题描述问题思考解决过程总结问题描述项目软件安装shell脚本上git仓库管理,但拉取后,上l

Linux下利用select实现串口数据读取过程

《Linux下利用select实现串口数据读取过程》文章介绍Linux中使用select、poll或epoll实现串口数据读取,通过I/O多路复用机制在数据到达时触发读取,避免持续轮询,示例代码展示设... 目录示例代码(使用select实现)代码解释总结在 linux 系统里,我们可以借助 select、

idea npm install很慢问题及解决(nodejs)

《ideanpminstall很慢问题及解决(nodejs)》npm安装速度慢可通过配置国内镜像源(如淘宝)、清理缓存及切换工具解决,建议设置全局镜像(npmconfigsetregistryht... 目录idea npm install很慢(nodejs)配置国内镜像源清理缓存总结idea npm in

pycharm跑python项目易出错的问题总结

《pycharm跑python项目易出错的问题总结》:本文主要介绍pycharm跑python项目易出错问题的相关资料,当你在PyCharm中运行Python程序时遇到报错,可以按照以下步骤进行排... 1. 一定不要在pycharm终端里面创建环境安装别人的项目子模块等,有可能出现的问题就是你不报错都安装

idea突然报错Malformed \uxxxx encoding问题及解决

《idea突然报错Malformeduxxxxencoding问题及解决》Maven项目在切换Git分支时报错,提示project元素为描述符根元素,解决方法:删除Maven仓库中的resolv... 目www.chinasem.cn录问题解决方式总结问题idea 上的 maven China编程项目突然报错,是

Python爬虫HTTPS使用requests,httpx,aiohttp实战中的证书异步等问题

《Python爬虫HTTPS使用requests,httpx,aiohttp实战中的证书异步等问题》在爬虫工程里,“HTTPS”是绕不开的话题,HTTPS为传输加密提供保护,同时也给爬虫带来证书校验、... 目录一、核心问题与优先级检查(先问三件事)二、基础示例:requests 与证书处理三、高并发选型:

前端导出Excel文件出现乱码或文件损坏问题的解决办法

《前端导出Excel文件出现乱码或文件损坏问题的解决办法》在现代网页应用程序中,前端有时需要与后端进行数据交互,包括下载文件,:本文主要介绍前端导出Excel文件出现乱码或文件损坏问题的解决办法,... 目录1. 检查后端返回的数据格式2. 前端正确处理二进制数据方案 1:直接下载(推荐)方案 2:手动构造

Python绘制TSP、VRP问题求解结果图全过程

《Python绘制TSP、VRP问题求解结果图全过程》本文介绍用Python绘制TSP和VRP问题的静态与动态结果图,静态图展示路径,动态图通过matplotlib.animation模块实现动画效果... 目录一、静态图二、动态图总结【代码】python绘制TSP、VRP问题求解结果图(包含静态图与动态图

MyBatis/MyBatis-Plus同事务循环调用存储过程获取主键重复问题分析及解决

《MyBatis/MyBatis-Plus同事务循环调用存储过程获取主键重复问题分析及解决》MyBatis默认开启一级缓存,同一事务中循环调用查询方法时会重复使用缓存数据,导致获取的序列主键值均为1,... 目录问题原因解决办法如果是存储过程总结问题myBATis有如下代码获取序列作为主键IdMappe

C#使用iText获取PDF的trailer数据的代码示例

《C#使用iText获取PDF的trailer数据的代码示例》开发程序debug的时候,看到了PDF有个trailer数据,挺有意思,于是考虑用代码把它读出来,那么就用到我们常用的iText框架了,所... 目录引言iText 核心概念C# 代码示例步骤 1: 确保已安装 iText步骤 2: C# 代码程