文章目录

  • 前言
    • 编写目的
    • 术语和缩写词
    • 方案选择
  • 一、Littlefs介绍
  • 二、Littlefs搭建步骤
    • 1.设备树构建
    • 2.自动挂载流程(二选一)
      • 2.1设备树启用自动挂载
      • 2.2 在 littlefs_fs.c 中,设备树宏会被展开
      • 2.3 模块注册初始化
      • 2.4 初始化阶段
        • 2.4.1注册Littlefs文件系统到总文件系统
        • 2.4.2 检查自动挂载标志
      • 2.5 挂载函数调用
    • 3.手动挂载流程(二选一)
      • 3.1设备树注释自动挂载
      • 3.2 外部声明挂载结构
      • 3.3 基础方式挂载
    • 4. 基础应用
  • 总结


前言

编写目的

 本文档旨在为开发者介绍Littlef’s文件系统相关配置使用指南。通过本文档,开发者可以了解系统支持的文件系统类型、文件系统的挂载与使用方法、文件操作接口以及文件系统相关的配置选项,帮助开发者在嵌入式环境中高效、安全地使用文件系统功能,实现数据的持久化存储和管理。

术语和缩写词

术语和缩写词解释
文件系统用于组织和存储数据的方法,管理文件的创建、读取、写入、删除等操作,提供数据持久化存储能力
littlefs为闪存设计的轻量级文件系统,具有掉电保护和磨损均衡功能,适用于资源受限的嵌入式设备
fatfs一种广泛使用的文件系统格式,兼容性好,支持长文件名,适用于SD卡、U盘等可移动存储设备

方案选择

 Zephyr 操作系统支持 fatfs 和 littlefs,因为 SPINAND 存在坏块,而 littlefs 支持坏块管理,所以选择 littlefs 作为外部NAND-Flash文件系统。

一、Littlefs介绍

请参考优秀博客:
Little介绍
单片机移植操作

二、Littlefs搭建步骤

Littlefs系统原函数文件路径:zephyr/subsys/fs/littlefs_fs.c
该文件作用说明:

  • LittleFS 文件系统驱动原函数实现
  • 双存储后端支持
  • 设备树驱动的自动挂载(若设备树启动:autonount属性)
  • 内存管理和线程安全
  • 通过 SYS_INIT 在系统启动时自动初始化(注册文件系统框架)

1.设备树构建

/ {fstab {compatible = "zephyr,fstab";lfs1: lfs1 {compatible = "zephyr,fstab,littlefs"; //标识符read-size = <1>; // 数据块读取的最小大小,所有读取都将是此值的倍数prog-size = <16>; // 数据块写入的最小大小,所有写入都将是此值的倍数cache-size = <256>; //缓存的大小,必须是 flash page size 的倍数lookahead-size = <32>; //lookahead 缓冲区大小,必须是8的倍数block-cycles = <512>; //用于动态磨损均衡,将数据移动到另一个块之前的擦除次数partition = <&lfs1_partition>; //挂载分区mount-point = "/lfs1"; //挂载点automount; //启用自动挂载(自动:littlefs_fs.c挂载。手动:fs_mount函数挂载)};};
};&flash0 {partitions {compatible = "fixed-partitions";#address-cells = <1>;#size-cells = <1>;/* Use second half of flash for the filesystem. */lfs1_partition: partition@100000 {label = "storage";reg = <0x100000 DT_SIZE_K(1024)>;};};
};

易错点:若重复挂载会返回错误
可使用**fs_statvfs()**检查后再挂载。

2.自动挂载流程(二选一)

2.1设备树启用自动挂载

fstab {compatible = "zephyr,fstab";lfs1: lfs1 {.......automount;  // 启用自动挂载.......};
};

2.2 在 littlefs_fs.c 中,设备树宏会被展开

//匹配设备树:
#define DT_DRV_COMPAT zephyr_fstab_littlefs
// DT_INST_FOREACH_STATUS_OKAY(DEFINE_FS) 展开为:
#define DEFINE_FS(inst) \
static struct fs_littlefs fs_data_0 = { \.cfg = { \.read_size = 1, \.prog_size = 16, \.cache_size = 256, \.lookahead_size = 32, \.read_buffer = read_buffer_0, \.prog_buffer = prog_buffer_0, \.lookahead_buffer = lookahead_buffer_0, \}, \
}; \
struct fs_mount_t z_fsmp_lfs1 = { \.type = FS_LITTLEFS, \.mnt_point = "/lfs1", \.fs_data = &fs_data_0, \.storage_dev = (void *)0, \.flags = FS_MOUNT_FLAG_AUTOMOUNT, \
};

2.3 模块注册初始化

// 文件系统初始化优先级:CONFIG_FILE_SYSTEM_INIT_PRIORITY
// littlefs_fs.c 中的 SYS_INIT 宏
SYS_INIT(littlefs_init, POST_KERNEL, CONFIG_FILE_SYSTEM_INIT_PRIORITY);// 系统启动时自动调用 littlefs_init()

2.4 初始化阶段

2.4.1注册Littlefs文件系统到总文件系统
    // 注册 LittleFS 文件系统驱动int rc = fs_register(FS_LITTLEFS, &littlefs_fs);if (rc != 0) {LOG_ERR("Failed to register LittleFS driver: %d", rc);return rc;}
2.4.2 检查自动挂载标志
if ((mp->flags & FS_MOUNT_FLAG_AUTOMOUNT) != 0) {// 执行自动挂载int rc = fs_mount(mp);if (rc < 0) {LOG_ERR("Automount %s failed: %d", mp->mnt_point, rc);} else {LOG_INF("Automount %s succeeded", mp->mnt_point);}}// 如果没有 automount 标志,直接返回,不执行挂载

2.5 挂载函数调用

int fs_mount(struct fs_mount_t *mp)
{......// 检查是否已经挂载if (mp->fs != NULL) {return -EBUSY;  // 已经挂载}// 调用文件系统特定的挂载函数int rc = fs->mount(mp);if (rc == 0) {// 5. 挂载成功,更新挂载点信息mp->fs = fs;mp->mountp_len = strlen(mp->mnt_point);}.......
}

3.手动挂载流程(二选一)

3.1设备树注释自动挂载

fstab {compatible = "zephyr,fstab";lfs1: lfs1 {.......//automount;  //注释关闭掉.......};
};

3.2 外部声明挂载结构

// 在应用程序中声明外部挂载结构
FS_FSTAB_DECLARE_ENTRY(FS_PARTITION_NODE);
// 展开为:extern struct fs_mount_t z_fsmp_lfs1;

3.3 基础方式挂载

#include <zephyr/fs/fs.h>
#include <zephyr/fs/littlefs.h>void basic_mount_example(void)
{// 1. 获取挂载结构指针struct fs_mount_t *mp = &FS_FSTAB_ENTRY(FS_PARTITION_NODE);// 2. 执行挂载int rc = fs_mount(mp);if (rc < 0) {printk("Mount failed: %d\n", rc);return;}printk("Mount succeeded at %s\n", mp->mnt_point);
}

4. 基础应用

简化版Demo:

/** 最简 LittleFS 测试*/#include <stdio.h>
#include <zephyr/kernel.h>
#include <zephyr/fs/fs.h>
#include <zephyr/fs/littlefs.h>int main(void)
{struct fs_file_t file;char buffer[64];int res;printk("Simple LittleFS Test\n");// 挂载文件系统FS_LITTLEFS_DECLARE_DEFAULT_CONFIG(storage);static struct fs_mount_t lfs_mount = {.type = FS_LITTLEFS,.fs_data = &storage,.storage_dev = (void *)FIXED_PARTITION_ID(storage_partition),.mnt_point = "/lfs",};res = fs_mount(&lfs_mount);if (res != 0) {printk("Mount failed: %d\n", res);return 0;}printk("Mounted successfully\n");// 写入文件fs_file_t_init(&file);res = fs_open(&file, "/lfs/hello.txt", FS_O_CREATE | FS_O_WRITE);if (res == 0) {fs_write(&file, "Hello LittleFS!", 15);fs_close(&file);printk("File written\n");}// 读取文件res = fs_open(&file, "/lfs/hello.txt", FS_O_READ);if (res == 0) {res = fs_read(&file, buffer, sizeof(buffer) - 1);if (res > 0) {buffer[res] = '\0';printk("Read: %s\n", buffer);}fs_close(&file);}// 卸载fs_unmount(&lfs_mount);printk("Test completed\n");return 0;
}

更完善Demo请参考官方Littlefs例程:Littlefs_demo

总结

无论使用自动挂载还是使用手动挂载,Littlefs_Moudle都会在启动阶段进行初始化。手动挂载具有搭配(条件挂载、错误处理、状态检测、性能监控的优势),提供了更大的灵活性和控制力,具体可通过Shell进行测试与体验。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/90338.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/90338.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/90338.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

保护板测试仪:守护电池安全的“幕后卫士”

在现代科技飞速发展的今天&#xff0c;电池作为各类电子设备和新能源系统的核心动力源&#xff0c;其安全性与稳定性直接关系到设备的正常运行和使用者的安全。而保护板作为电池的“安全卫士”&#xff0c;承担着过充保护、过放保护、短路保护等关键功能。保护板测试仪则是专门…

【unitrix】 6.11 二进制数字标准化模块(normalize.rs)

一、源码 这个模块实现了类型级别的二进制数标准化处理&#xff0c;确保二进制数在组合时保持最简形式。 //! 二进制数字标准化模块 //! //! 提供二进制数字(B<H, L>)的组合前标准化功能&#xff0c;确保数字以最简形式表示&#xff0c; //! 避免同一数值有不同表示形式。…

解决OpenHarmony中找不到pthread_cancel和pthread_setcanceltype等libc符号的问题

笔者在移植三方库到OpenHarmony时遇到了pthread_cancel和pthread_setcanceltype函数找不到的问题&#xff0c;将解决办法分享如下&#xff1a; OpenHarmony的使用的c库musl中注释了这些函数的导出&#xff0c;在third_party/musl/libc.map.txt将屏蔽的函数中取消注释即可

Python编程进阶知识之第五课处理数据(matplotlib)

简介matplotlib 是 Python 中最流行的数据可视化库之一&#xff0c;它可以创建各种高质量的图表。无论是简单的折线图&#xff0c;还是复杂的 3D 图形&#xff0c;matplotlib 都能轻松应对。它提供了类似 MATLAB 的绘图接口&#xff0c;使得用户可以非常方便地进行图表的创建和…

rust-所有权

什么是所有权 所有权是一组规则&#xff0c;它决定了 Rust 程序如何管理内存。所有运行中的程序都必须管理它们对计算机内存的使用方式。某些语言使用垃圾回收&#xff08;GC&#xff09;&#xff0c;在程序运行时定期查找不再使用的内存&#xff1b;另一些语言则要求程序员显式…

破解哈希极化:基于主动路径规划的智算网络负载均衡方案

如今人工智能&#xff08;AI&#xff09;和大模型训练的蓬勃发展&#xff0c;大规模AI算力集群&#xff08;智算集群&#xff09;已成为关键基础设施。这类集群对网络性能&#xff0c;特别是高吞吐、低延迟和无损特性有着严苛要求&#xff0c;RoCE因此被广泛应用。然而&#xf…

Vue工程化 ElementPlus

一、Vue工程化1、环境准备create-vue是Vue官方提供的最新的脚手架工具&#xff0c;用于快速生成一个工程化的Vue项目。提供了以下功能&#xff1a;统一的目录结构本地调试热部署单元测试集成打包上线依赖环境&#xff1a;Node JS 是一个免费、开源、跨平台的JavaScript运行时环…

深入解析TCP:可靠传输的核心机制与实现逻辑

Linux 系列 文章目录Linux 系列前言一、TCP协议的概念1.1 TCP协议的特点1.2 TCP又叫做传输控制协议二、TCP协议段格式2.1、TCP的流量控制----------窗口大小&#xff08;16位&#xff09;2.2 TCP的确认应答机制2.2.1 什么是确认应答机制2.2.2 确认应答机制的优化2.3 超时重传机…

通缩浪潮中的 “测量防线”:新启航如何用国产 3D 白光干涉仪筑牢半导体成本护城河?

一、通缩浪潮下半导体行业的成本困局在通缩浪潮冲击下&#xff0c;半导体行业面临市场需求疲软、产品价格下滑的严峻挑战。为维持竞争力&#xff0c;降低生产成本成为企业生存发展的关键。而 3D 白光干涉仪作为半导体晶圆检测、制程监控的核心设备&#xff0c;传统进口产品价格…

[网安工具] 自动化威胁检测工具 —— D 盾 · 使用手册

&#x1f31f;想了解其它网安工具&#xff1f;看看这个&#xff1a;[网安工具] 网络安全工具管理 —— 工具仓库 管理手册 D盾防火墙D盾,D盾_防火墙,D盾_IIS防火墙,D盾_web查杀,IIS防火墙,webshell查杀,https://www.d99net.net/ 0x01&#xff1a;D 盾 —— 工具简介 D 盾防火…

Spring AI 系列之二十二 - ImageModel

之前做个几个大模型的应用&#xff0c;都是使用Python语言&#xff0c;后来有一个项目使用了Java&#xff0c;并使用了Spring AI框架。随着Spring AI不断地完善&#xff0c;最近它发布了1.0正式版&#xff0c;意味着它已经能很好的作为企业级生产环境的使用。对于Java开发者来说…

Redis集群高可用与性能优化实战指南

Redis集群高可用与性能优化实战指南 一、业务场景描述 在大型分布式系统中&#xff0c;Redis不仅承担缓存职责&#xff0c;还常用于限流、排行榜、会话管理等高并发场景。随着访问量的激增和集群规模的扩展&#xff0c;如何保证Redis服务的高可用性与高性能&#xff0c;成为后端…

基于SpringBoot+Vue的高校特长互助系统(WebSocket实时聊天、协同过滤算法、ECharts图形化分析)

“ &#x1f388;系统亮点&#xff1a;WebSocket实时聊天、协同过滤算法、ECharts图形化分析”01系统开发工具与环境搭建前后端分离架构项目架构&#xff1a;B/S架构运行环境&#xff1a;win10/win11、jdk17前端&#xff1a;技术&#xff1a;框架Vue.js&#xff1b;UI库&#x…

于纵横交错的矩阵间:二维数组与多维数据的默契和鸣

大家好啊,我是小象٩(๑ω๑)۶ 我的博客:Xiao Xiangζั͡ޓއއ 很高兴见到大家,希望能够和大家一起交流学习,共同进步。* 接着上节课的内容,这一节我们来学习二维数组,学习二维数组的概念和创建,明白二维数组的初始化,学会不完全初始化,完全初始化,按照行初始化的…

SHA-3算法详解

SHA-3&#xff08;Secure Hash Algorithm 3&#xff09;是美国国家标准与技术研究院&#xff08;NIST&#xff09;于 2015 年发布的新一代密码哈希算法标准&#xff0c;其核心基于比利时密码学家团队设计的Keccak 算法。SHA-3 的诞生旨在应对 SHA-1 和 SHA-2 系列算法可能面临的…

前端笔记:同源策略、跨域问题

只有前端才会有跨域问题后端不受限制 一、什么是“同源策略”&#xff08;Same-Origin Policy&#xff09; ✅ 定义&#xff1a; 浏览器的 同源策略 是一种 安全机制&#xff0c;限制一个源的 JavaScript 访问另一个源的资源&#xff0c;以防止恶意网站窃取用户敏感信息。 ✅ “…

java通过com进行pdf转换docx丢失

使用&#xff0c;通过com调用&#xff0c;发现pdf转换成docx后&#xff0c;没有看到docx输出到指定目录。直接说解决方案:关闭的保护模式即可&#xff0c;打开工具&#xff0c;编辑->首选项 找到安全性(增强)&#xff0c;关闭启动时启用保护模式关闭后&#xff0c;docx正常输…

SQL基础⑫ | 视图篇

0 序言 本文将系统讲解数据库中视图的相关知识&#xff0c;包括视图的定义、作用、创建&#xff08;单表、多表、基于视图创建&#xff09;、查看、更新、修改与删除操作&#xff0c;以及视图的优缺点。 通过学习&#xff0c;你能够掌握视图的基本概念&#xff0c;理解何时及如…

移动云×华为昇腾:“大EP+PD分离”架构实现单卡吞吐量跨越式提升!

在面向下一代AI基础设施的关键技术攻关中&#xff0c;移动云与华为昇腾计算团队深度协同&#xff0c;实现了大模型推理引擎的架构级突破。双方基于昇腾AI基础软硬件平台&#xff0c;针对DeepSeek大模型完成了大规模专家并行&#xff08;Expert Parallelism&#xff0c;简称“大…

配电自动化终端中电源模块的设计

配电自动化终端中电源模块的设计 引言 配电终端设备的可靠性和自动化程度,直接影响到整个配电自动化系统的可靠性和自动化水平。由于配电终端设备一般安装于户外或比较偏僻的地方,不可能有直流电源提供,因此,配电网终端设备的直流供电方式成为各配网自动化改造中必须要研究…