LittleFS - 一个高度完整的嵌入式文件系统_yi412的博客-程序员宅基地

技术标签: 文件系统  嵌入式  

LittleFS - 一个高度完整的嵌入式文件系统

 

拥有小巧灵活的文件系统对许多物联网设备至关重要。使用文件系统并将其与正确的存储技术(如外部闪存或SD卡)配对可能很困难。Mbed操作系统使文件系统的组合变得简单。Mbed OS 5.7既支持FAT文件系统,又引入了高度集成的嵌入式文件系统。这包括对没有自己的磨损平衡控制器的闪存芯片的磨损平衡支持。

LittleFS  - 一个高度完整的嵌入式文件系统

将数据存储在嵌入式设备上非常有用:无论是配置文件,传感器信息批量还是新的固件更新。您可以抓取一些非易失性存储器(如EEPROM或SD卡),并将这些数据写入随机闪存页面,但容易出错。没有关于闪存数据的概述,不保证您不覆盖其他数据使用的页面,并且一遍又一遍地写入同一闪存页面对于耐久性是不利的。所以,你需要一个文件系统(自1965年左右),为您管理这一切。

嵌入式系统和物联网设备的文件系统有一些额外的要求:

  1. 断电恢复能力 - 要求文件系统保持一致,并将数据刷新到底层存储。

  2. 平均磨损 - 通常情况下,存储支持每块数量有限的擦除,因此使用整个存储设备对于可靠性非常重要。

  3. 微小的占地面积 - 物联网设备受到ROM和RAM的限制。占地面积小可以节省资金。

市场上有许多商业和开源嵌入式文件系统,但都没有达到我们的设计代码大小,功能或可靠性要求,这对于成功部署物联网设备至关重要。我们正在发布高完整性嵌入式文件系统,这是一个为嵌入式系统设计的小型故障安全文件系统。它作为Mbed OS 5.7的一部分以早期版本形式提供,并作为非Mbed系统的独立C库提供。它是在从GitHub的允许Apache 2.0许可和可用许可这里。

高完整性的嵌入式文件系统与FAT文件系统

Mbed OS长久以来都支持由安全数字卡或NOR闪存支持的FAT文件系统。FAT文件系统于2010年首次引入,作为外部库,然后作为Mbed OS 5.5核心操作系统的一部分进行集成。由于FAT文件系统对从DOS 6到Mac OS 10.13等其他操作系统的广泛支持和兼容性,FAT文件系统仍然是一个重要的功能。在许多物联网使用案例中,需要具有电源丢失弹性,数据完整性和更长的存储器使用寿命。对于很多物联网设备,与传统的FAT文件系统相比,高完整性嵌入式文件系统是一个更好的选择。

RAM / ROM大小

littlefs1.png

fatfs与littlefs RAM + ROM大小

Littlebed是Mbed OS中高度集成的嵌入式文件系统,可以在有限的RAM和ROM下工作。它避免了递归,将动态内存限制为可配置的缓冲区,并且不需要将整个存储块存储在RAM中。通过专注于一小组多用途数据结构,这个高度集成的嵌入式文件系统使用比FAT少的13K ROM和少于4K的RAM。

失电恢复能力

littlefs3.gif

fatfs引导计数应用程序 littlefs引导计数应用程序

我们为可能有随机电源故障的系统设计了这个文件系统。它具有强大的copy-on-write保证,并且磁盘上的存储总是保持有效状态。在上面的gif中,您可以看到FAT文件系统损坏的速度以及该文件系统的弹性。有关更多详细信息,请参阅我们用于测试的程序。

磨损均衡

littlefs4.gif

fatfs vs littlefs平均分

大多数嵌入式设备使用的存储芯片支持每个扇区有限的一组擦除。如果您没有支持磨损平衡的存储控制器,则嵌入式设备的使用寿命可能会受到影响。嵌入式文件系统提供动态损耗均衡,以在整个闪存的整个区域内跨扇区传播数据。这可以防止应用程序频繁地写入相同的扇区。失败模式是文件系统使用和文件系统中存储的数据量的组合。平均算法并不完美,但具有扩展闪存存储容量的优点,增加了设备的使用寿命。

gif显示了高完整性嵌入式文件系统与FAT文件系统在静态数据3K和动态数据3K之间的比较。要查看不同配置的磨损级别行为,请参阅此交互式仿真。

如何开始使用高完整性嵌入式文件系统?
任何实现BlockDevice接口的设备都可以在Mbed OS中托管文件系统。您可以更改基于BlockDevice的存储驱动程序,而无需更改您的应用程序或库代码。

开始:

1. 选择一个BlockDevice为您的闪存实现API 的驱动程序: DataFlash,SD卡,SFDP SPI Flash或实现您自己的。
2. 初始化并挂载文件系统:

BlockDevice bd =  / *获取块设备* / ;

//第一个参数是挂载点,例如文件将在/ fs /下可用,第二个指向块设备的指针 
LittleFileSystem fs(“fs”,&bd);

使用POSIX文件系统调用来读取和写入文件(例如fread,fopen等等)。
你可以在这里找到一个示例程序。如果您的开发板上没有任何存储空间,您可以使用HeapBlockDevice来测试这个高度集成的嵌入式文件系统,HeapBlockDevice将数据存储在内存中(但不会持久存储)。

测试
由于文件系统是设备固件的重要组成部分,因此这个高度集成的嵌入式文件系统带有一套完整的单元和集成测试,Mbed OS测试服务器场每天运行该测试。要运行这些测试,您需要mbed CLI:

功能测试 - mbed test -n 'features-filesystem-littlefs-tests-filesystem-*'。
重新测试 - mbed test -n 'features-filesystem-littlefs-tests-filesystem_retarget-*'。
磨平测试 - mbed test -n 'features-filesystem-littlefs-tests-filesystem_recovery-wear_leveling'。
模拟功率弹性测试mbed test -n 'features-filesystem-littlefs-tests-filesystem_recovery-resilience'。
硬件功率弹性测试mbed test -n 'features-filesystem-littlefs-tests-filesystem_recovery-resilience_functional'。
另外,我们建立了浸泡测试来验证文件系统在真实的硬件上正确处理闪存耗尽失败。

-

Jan Jongboom是Arm的物联网开发人员,他看到太多损坏的SD卡。Chris Haster是Arm的一名软件工程师。

 

参考链接:LittleFS - 一个高度完整的嵌入式文件系统

arm官方项目地址:armmbed/mbed-littlefs

原作者项目地址:geky/littlefs

移植代码:

C

 
  1. #include "lfs.h"

  2.  
  3. // variables used by the filesystem

  4. lfs_t lfs;

  5. lfs_file_t file;

  6.  
  7. // configuration of the filesystem is provided by this struct

  8. const struct lfs_config cfg = {

  9. // block device operations

  10. .read = user_provided_block_device_read,

  11. .prog = user_provided_block_device_prog,

  12. .erase = user_provided_block_device_erase,

  13. .sync = user_provided_block_device_sync,

  14.  
  15. // block device configuration

  16. .read_size = 16,

  17. .prog_size = 16,

  18. .block_size = 4096,

  19. .block_count = 128,

  20. .lookahead = 128,

  21. };

  22.  
  23. // entry point

  24. int main(void) {

  25. // mount the filesystem

  26. int err = lfs_mount(&lfs, &cfg);

  27.  
  28. // reformat if we can't mount the filesystem

  29. // this should only happen on the first boot

  30. if (err) {

  31. lfs_format(&lfs, &cfg);

  32. lfs_mount(&lfs, &cfg);

  33. }

  34.  
  35. // read current count

  36. uint32_t boot_count = 0;

  37. lfs_file_open(&lfs, &file, "boot_count", LFS_O_RDWR | LFS_O_CREAT);

  38. lfs_file_read(&lfs, &file, &boot_count, sizeof(boot_count));

  39.  
  40. // update boot count

  41. boot_count += 1;

  42. lfs_file_rewind(&lfs, &file);

  43. lfs_file_write(&lfs, &file, &boot_count, sizeof(boot_count));

  44.  
  45. // remember the storage is not updated until the file is closed successfully

  46. lfs_file_close(&lfs, &file);

  47.  
  48. // release any resources we were using

  49. lfs_unmount(&lfs);

  50.  
  51. // print the boot count

  52. printf("boot_count: %d\n", boot_count);

  53. }

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/yi412/article/details/86654020

智能推荐

Markdown 使用技巧-程序员宅基地

Markdown 换行在行尾按两个以上的空格然后回车 使用html标签 <br/>Markdown 标题markdown支持两种标题语法类Setext形式:用底线的形式,利用=(第一级标题)和-(第二级标题)。任何数量的=和-都有效果且效果一样。类atx形式:在行首插入1到6个#,对应1到6级标题Markdown 缩进全角下输入的空格 : &amp...

【拔刀吧 TensorFlow】TensorFlow学习笔记二-程序员宅基地

这次的故事从从一颗蓝色药丸说起……图片原作者:W. Carter 每一次学习一种新的编程语言,譬如从C到Python,都是从实现“Hello World!”开始,用一个陌生的新工具和这个世界说你好。小小的HW代码,让我们初步理解这个工具的原理。 入门TensorFlow一样如此,正如官方的蓝色药丸,MNIST是零基础入门TensorFlow的新人居家旅行必备良药。今天服下这颗药...

第6节--决策树算法实现(scikit-learn)-程序员宅基地

1、python本课程的机器学习的算法都是基于python语言实现的,所以你需要有一定的python语言基础,可以参考彭亮在麦子学院讲授的“Python语言编程基础”。2、python机器学习的库:scikit-learn特性: 简单高效的数据挖掘和机器学习分析 对所有用户开放,根据不同需求高度可重用性 基于Numpy, SciPy和matplotlib 开源,商用级别:获得 BSD许可覆盖

排序算法之一 冒泡排序(C++版本)_冒泡法排序c++程序-程序员宅基地

冒泡排序的相关知识,参考冒泡排序 程序员小灰下面是具体实现:辅助函数:void Print(int* pData, int size){ for (int idx = 0; idx < size; ++idx) std::cout << pData[idx] << " "; std::cout << std::endl;}初始数据为:i..._冒泡法排序c++程序

搭建阿里云OSS python SDK 开发环境_python 安装aliyunsdkoss-程序员宅基地

OSS(Object Storage Service,即对象存储服务),是阿里云对外提供的海量,安全,低成本,高可靠的云存储服务。自公司产品v2.0版本之后,开始引入使用该服务。在产品v1.0版本持续的使用中,产生了大量的用户数据及图片资源等文件。图片资源主要存放在阿里云ECS主机的特定目录中。在每次进行系统升级时,就需要进行数据备份,而备份的数据中,其中很大的一部分内容为图片资源文件。在v2_python 安装aliyunsdkoss

腾讯云对象存储COS新品发布——智能分层存储,自动优化您的存储成本-程序员宅基地

近日,腾讯云正式发布对象存储新品——智能分层存储,能够根据用户数据的访问模式,自动地转换数据的冷热层级,为用户提供与标准存储一致的低延迟和高吞吐的产品体验,同时具有更低的存储成本。熟悉数...

随便推点

Android 混淆:proguard实践-程序员宅基地

前言网上关于使用proguard进行混淆的文章很多,但大部分是从讲解proguard知识点这个角度去写的,为什么要混淆,如何去混淆,混淆的注意点等重要的问题反而都没有写。所以想通过这篇文章来记录我学习proguard的过程,一来是整理android混淆相关的知识点,二来是总结此次学习混淆的方法,提高学习能力。proguard实践学习任何技术之前应该要有一个明确的目标,本次学习混淆的目标就是会使用a

python提取视频字幕_利用Python提取视频中的字幕(文字识别)-程序员宅基地

我的程序员宅基地id:qq_39783601,昵称是糖潮丽子~辣丽从今天开始我会陆续将数据分析师相关的知识点分享在这里,包括Python、机器学习、数据库等等。今天来分享一个Python小项目!文字识别项目背景通过获取百度API实现视频文字识别。需求阐述将.MP4格式视频裁剪成一帧一帧的图片再将图片中的字幕摘取出来,保存成一个文档。进入正题喽!!!思路1.将视频按帧截取成图片2.将上一步截取的图片..._python 提取视频文字

第三章作业题3--队列-程序员宅基地

选择题2-1为解决计算机主机与打印机之间速度不匹配问题,通常设置一个打印数据缓冲区,主机将要输出的数据依次写入该缓冲区,而打印机则依次从该缓冲区中取出数据。该缓冲区的逻辑结构应该是? BA.堆栈B.队列C.树D.图2-2若已知一队列用单向链表表示,该单向链表的当前状态(含3个对象)是:1->2->3,其中x->y表示x的下一节点是y。此时,如果将对象4入队,然后队...

C++小白踩坑--关于main函数的传值 argc 和argv 以及math.h-程序员宅基地

今天学习了 main函数的传值操作。正常情况使用编译器的时候main函数是不会被传值的。但是当我们使用cmd来启动build完成的exe文件之后我们就可以输入数字或者字符串来实现对main的传值。例子1#include <iostream>#include<stdio.h>#include<string.h>#include<stdlib.h&...

API函数CopyFileEx使用详解(delphi)-程序员宅基地

{ 函数原型 } function CopyFileEx( lpExistingFileName : PChar; // 来源文件 lpNewFileName : PChar; // 目标文件 lpProgressRoutine : TFNProgressRoutine; // 用于返回文_copyfileex

这些年,被“颠覆性创新”的五大行业-程序员宅基地

“创新一停就落后”放在哪里都是真理。携程CEO梁建章认为,创新有两种形式:一种是“微创新”,即不断分析、研究每一个环节出现的小问题,想出方法加以完善;另一种是“颠覆性创新”,“当技术变化特别快的时候,可能要跳出原来的模式做一种新的产品或业务。”从当年的微软、苹果到当下最热门的特斯拉,这是对产品的颠覆性创新,从阿里巴巴、淘宝、美团到当下竖起“免佣”大旗要颠覆传统OTA模式的快捷酒店管家,这是

推荐文章

热门文章

相关标签