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

相关文章

Python使用vllm处理多模态数据的预处理技巧

《Python使用vllm处理多模态数据的预处理技巧》本文深入探讨了在Python环境下使用vLLM处理多模态数据的预处理技巧,我们将从基础概念出发,详细讲解文本、图像、音频等多模态数据的预处理方法,... 目录1. 背景介绍1.1 目的和范围1.2 预期读者1.3 文档结构概述1.4 术语表1.4.1 核

SpringBoot+Docker+Graylog 如何让错误自动报警

《SpringBoot+Docker+Graylog如何让错误自动报警》SpringBoot默认使用SLF4J与Logback,支持多日志级别和配置方式,可输出到控制台、文件及远程服务器,集成ELK... 目录01 Spring Boot 默认日志框架解析02 Spring Boot 日志级别详解03 Sp

MySQL 删除数据详解(最新整理)

《MySQL删除数据详解(最新整理)》:本文主要介绍MySQL删除数据的相关知识,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录一、前言二、mysql 中的三种删除方式1.DELETE语句✅ 基本语法: 示例:2.TRUNCATE语句✅ 基本语

怎样通过分析GC日志来定位Java进程的内存问题

《怎样通过分析GC日志来定位Java进程的内存问题》:本文主要介绍怎样通过分析GC日志来定位Java进程的内存问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、GC 日志基础配置1. 启用详细 GC 日志2. 不同收集器的日志格式二、关键指标与分析维度1.

Java 线程安全与 volatile与单例模式问题及解决方案

《Java线程安全与volatile与单例模式问题及解决方案》文章主要讲解线程安全问题的五个成因(调度随机、变量修改、非原子操作、内存可见性、指令重排序)及解决方案,强调使用volatile关键字... 目录什么是线程安全线程安全问题的产生与解决方案线程的调度是随机的多个线程对同一个变量进行修改线程的修改操

Redis出现中文乱码的问题及解决

《Redis出现中文乱码的问题及解决》:本文主要介绍Redis出现中文乱码的问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. 问题的产生2China编程. 问题的解决redihttp://www.chinasem.cns数据进制问题的解决中文乱码问题解决总结

MyBatisPlus如何优化千万级数据的CRUD

《MyBatisPlus如何优化千万级数据的CRUD》最近负责的一个项目,数据库表量级破千万,每次执行CRUD都像走钢丝,稍有不慎就引起数据库报警,本文就结合这个项目的实战经验,聊聊MyBatisPl... 目录背景一、MyBATis Plus 简介二、千万级数据的挑战三、优化 CRUD 的关键策略1. 查

python实现对数据公钥加密与私钥解密

《python实现对数据公钥加密与私钥解密》这篇文章主要为大家详细介绍了如何使用python实现对数据公钥加密与私钥解密,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录公钥私钥的生成使用公钥加密使用私钥解密公钥私钥的生成这一部分,使用python生成公钥与私钥,然后保存在两个文

mysql中的数据目录用法及说明

《mysql中的数据目录用法及说明》:本文主要介绍mysql中的数据目录用法及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、版本3、数据目录4、总结1、背景安装mysql之后,在安装目录下会有一个data目录,我们创建的数据库、创建的表、插入的

MySQL之InnoDB存储页的独立表空间解读

《MySQL之InnoDB存储页的独立表空间解读》:本文主要介绍MySQL之InnoDB存储页的独立表空间,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、独立表空间【1】表空间大小【2】区【3】组【4】段【5】区的类型【6】XDES Entry区结构【