请教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

相关文章

Spring的RedisTemplate的json反序列泛型丢失问题解决

《Spring的RedisTemplate的json反序列泛型丢失问题解决》本文主要介绍了SpringRedisTemplate中使用JSON序列化时泛型信息丢失的问题及其提出三种解决方案,可以根据性... 目录背景解决方案方案一方案二方案三总结背景在使用RedisTemplate操作redis时我们针对

Kotlin Map映射转换问题小结

《KotlinMap映射转换问题小结》文章介绍了Kotlin集合转换的多种方法,包括map(一对一转换)、mapIndexed(带索引)、mapNotNull(过滤null)、mapKeys/map... 目录Kotlin 集合转换:map、mapIndexed、mapNotNull、mapKeys、map

nginx中端口无权限的问题解决

《nginx中端口无权限的问题解决》当Nginx日志报错bind()to80failed(13:Permissiondenied)时,这通常是由于权限不足导致Nginx无法绑定到80端口,下面就来... 目录一、问题原因分析二、解决方案1. 以 root 权限运行 Nginx(不推荐)2. 为 Nginx

解决1093 - You can‘t specify target table报错问题及原因分析

《解决1093-Youcan‘tspecifytargettable报错问题及原因分析》MySQL1093错误因UPDATE/DELETE语句的FROM子句直接引用目标表或嵌套子查询导致,... 目录报js错原因分析具体原因解决办法方法一:使用临时表方法二:使用JOIN方法三:使用EXISTS示例总结报错原

Windows环境下解决Matplotlib中文字体显示问题的详细教程

《Windows环境下解决Matplotlib中文字体显示问题的详细教程》本文详细介绍了在Windows下解决Matplotlib中文显示问题的方法,包括安装字体、更新缓存、配置文件设置及编码調整,并... 目录引言问题分析解决方案详解1. 检查系统已安装字体2. 手动添加中文字体(以SimHei为例)步骤

MyBatis-Plus通用中等、大量数据分批查询和处理方法

《MyBatis-Plus通用中等、大量数据分批查询和处理方法》文章介绍MyBatis-Plus分页查询处理,通过函数式接口与Lambda表达式实现通用逻辑,方法抽象但功能强大,建议扩展分批处理及流式... 目录函数式接口获取分页数据接口数据处理接口通用逻辑工具类使用方法简单查询自定义查询方法总结函数式接口

SpringSecurity整合redission序列化问题小结(最新整理)

《SpringSecurity整合redission序列化问题小结(最新整理)》文章详解SpringSecurity整合Redisson时的序列化问题,指出需排除官方Jackson依赖,通过自定义反序... 目录1. 前言2. Redission配置2.1 RedissonProperties2.2 Red

nginx 负载均衡配置及如何解决重复登录问题

《nginx负载均衡配置及如何解决重复登录问题》文章详解Nginx源码安装与Docker部署,介绍四层/七层代理区别及负载均衡策略,通过ip_hash解决重复登录问题,对nginx负载均衡配置及如何... 目录一:源码安装:1.配置编译参数2.编译3.编译安装 二,四层代理和七层代理区别1.二者混合使用举例

SQL中如何添加数据(常见方法及示例)

《SQL中如何添加数据(常见方法及示例)》SQL全称为StructuredQueryLanguage,是一种用于管理关系数据库的标准编程语言,下面给大家介绍SQL中如何添加数据,感兴趣的朋友一起看看吧... 目录在mysql中,有多种方法可以添加数据。以下是一些常见的方法及其示例。1. 使用INSERT I

Ubuntu如何分配​​未使用的空间

《Ubuntu如何分配​​未使用的空间》Ubuntu磁盘空间不足,实际未分配空间8.2G因LVM卷组名称格式差异(双破折号误写)导致无法扩展,确认正确卷组名后,使用lvextend和resize2fs... 目录1:原因2:操作3:报错5:解决问题:确认卷组名称​6:再次操作7:验证扩展是否成功8:问题已解