0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

stm32单片机基于rt-thread 的 littlefs 文件系统 的使用

RT-Thread官方账号 2024-11-06 08:04 次阅读

作者:嵌入式学习和实践


一、开发环境介绍

硬件:基于野火stm32f407 开发板
软件:基于rt-thread v4.1.1版本的 stm32f407-atk-explorer bsp工程。

二、littlefs 简介

littlefs 是 ARM 官方推出的,专为嵌入式系统设计的文件系统,相比传统的文件系统,littlefs 具有以下优点:
1、自带擦写均衡
2、支持掉电保护
3、占用的 RAM/ROM
4、littlefs 自带的擦写均衡和掉电保护使开发者可以放心的将文件系统挂载到 nor flash 上。
littlefs 在 RT-Thread 上运行的层级关系图
bb7870ec-9bd2-11ef-8084-92fbcf53809c.png
名词解释
DFS 框架
DFS 框架 是 RT-Thread 提供的虚拟文件系统组件,全称为 Device File System,即设备虚拟文件系统。DFS 框架为应用程序提供统一的 POSIX 文件和目录操作接口,如 read、write、poll/select 等。DFS 框架支持多种类型的文件系统,如 FatFS、RomFS、DevFS 等,并提供普通文件、设备文件、网络文件描述符的管理。

MTD 设备
MTD 设备,全称为 Memory Technology Device,使用 MTD 设备为 NOR FLASH 和 NAND FLASH 提供统一接口,将文件系统与底层 FLASH 存储器进行了隔离。

fal 组件
fal 全称为 Flash Abstraction Layer,即 Flash 抽象层,是对 Flash 及基于 Flash 的分区进行管理、操作的抽象层,对上层统一了 Flash 及 分区操作的 API。并提供了将分区创建成 MTD 设备的 API。

SFUD 组件
SFUD 是一款开源的串行 SPI Flash 通用驱动库。现有市面的大部分串行 Flash,用户只需要提供 SPI 或 QSPI 的读写接口,SFUD 就可以识别并驱动。同时 RT-Thread 提供了 FAL 针对 SFUD 的驱动移植,可以使两个组件无缝连接。

开发者使用的是 DFS 框架提供的统一的 POSIX API,DFS 框架会调用 littlefs 的 API,littlefs 会使用 MTD 设备的读写接口,开发者可以使用 RT-Thread 提供的 fal 组件和 SFUD 组件来完成对 FLASH 的读写任务,也可以自己实现 MTD 设备的驱动程序,使 littlefs 可以挂载到更多的存储介质上。

三、littlefs 移植

开发者只需要提供一个 MTD 设备即可使用 littlefs。开发者可以自己实现一个 MTD 设备,也可以利用 RT-Thread 提供的 fal 组件,非常方便的创建出一个 MTD 设备。相比于直接使用 flash 底层函数来自己构造一个 MTD 设备,使用 fal 创建 MTD 设备有以下三个优点:
1、创建 MTD 设备方便。
2、驱动的可移植性和可重用性强。
3、fal 的分区功能可以让 littlefs 只使用指定区域的 flash。

littlefs 的移植主要包括下面几个方面:
bb86690e-9bd2-11ef-8084-92fbcf53809c.png
工程基于

**开启SPI,根据实际选择 **
bb9295b2-9bd2-11ef-8084-92fbcf53809c.png
bba3e6a0-9bd2-11ef-8084-92fbcf53809c.png
在组件中,查看 SFUD 组件是否开启,没开启则需要开启,打开调试信息(可选)
bbbba7e0-9bd2-11ef-8084-92fbcf53809c.png
开启 fal
bbc3d870-9bd2-11ef-8084-92fbcf53809c.png
配置 MTD 设备
bbcc0aa4-9bd2-11ef-8084-92fbcf53809c.png
开启littlefs,选择V2.3.0版本,高于此版本会报错,后面会遇到。
bbe035f6-9bd2-11ef-8084-92fbcf53809c.png
v2.3.0版本:
bbf8fab4-9bd2-11ef-8084-92fbcf53809c.png

latest 版本:
bc018cd8-9bd2-11ef-8084-92fbcf53809c.png

开启DFS文件系统
bc0a04da-9bd2-11ef-8084-92fbcf53809c.png

设置完成后,退出配置界面,在 env 中输入pkgs --update。
bc1f006a-9bd2-11ef-8084-92fbcf53809c.png
fal文件接口移植适配
bc523566-9bd2-11ef-8084-92fbcf53809c.png
bc6340f4-9bd2-11ef-8084-92fbcf53809c.png
配置分区表
打开工程中的 fal_cfg.h,修改如下:

/*
* Copyright (c) 2006-2018, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
* 2018-05-17 armink the first version
*/

#ifndef _FAL_CFG_H_
#define _FAL_CFG_H_

#include
#include

#define NOR_FLASH_DEV_NAME "W25Q128"

/* ===================== Flash device Configuration ========================= */

extern struct fal_flash_dev nor_flash0;

/* flash device table */
#define FAL_FLASH_DEV_TABLE \
{ \
&nor_flash0, \
}
/* ====================== Partition Configuration ========================== */
#ifdef FAL_PART_HAS_TABLE_CFG
/* partition table */
#define FAL_PART_TABLE \
{ \
{FAL_PART_MAGIC_WORD, "filesystem", NOR_FLASH_DEV_NAME, 0, 1024*1024, 0}, \
{FAL_PART_MAGIC_WORD, "download", NOR_FLASH_DEV_NAME, 1024*1024, 1024*1024, 0}, \
{FAL_PART_MAGIC_WORD, "easyflash", NOR_FLASH_DEV_NAME, 2*1024*1024, 14*1024*1024, 0}, \
}
#endif /* FAL_PART_HAS_TABLE_CFG */

#endif /* _FAL_CFG_H_ */

创建 MTD 设备并挂载文件系统
fal 组件并没有加入自动初始化的代码,所以需要在 main 函数中初始化 fal,并使用 fal 提供的 API 来创建一个 MTD 设备。创建 MTD 设备后,就可以将 littlefs 挂载到刚刚生成的 MTD 设备上了。

测试代码如下:

/*
* Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
* 2018-11-06 SummerGift first version
* 2018-11-19 flybreak add stm32f407-atk-explorer bsp
*/

#include
#include
#include
/* 添加 fal 头文件 */
#include
/* 添加文件系统头文件 */
#include

/* 添加 DEBUG 头文件 */
#define DBG_SECTION_NAME "main"
#define DBG_LEVEL DBG_INFO
#include
/* 定义要使用的分区名字 */
#define FS_PARTITION_NAME "filesystem"

/* defined the LED0 pin: PF7 */
#define LED0_PIN GET_PIN(F, 7)

int main(void)
{
struct rt_device *mtd_dev = RT_NULL;

rt_pin_mode(LED0_PIN, PIN_MODE_OUTPUT); /* 初始化 fal */

fal_init();
/* 生成 mtd 设备 */
mtd_dev = fal_mtd_nor_device_create(FS_PARTITION_NAME);
if (!mtd_dev)
{
LOG_E("Can't create a mtd device on '%s' partition.", FS_PARTITION_NAME);
}
else
{
/* 挂载 littlefs */
if (dfs_mount(FS_PARTITION_NAME, "/", "lfs", 0, 0) == 0)
{
LOG_I("Filesystem initialized!");
}
else
{
/* 格式化文件系统 */
dfs_mkfs("lfs", FS_PARTITION_NAME);
/* 挂载 littlefs */
if (dfs_mount("filesystem", "/", "lfs", 0, 0) == 0)
{
LOG_I("Filesystem initialized!");
}
else
{
LOG_E("Failed to initialize filesystem!");
}
}
}

while (1)
{
rt_pin_write(LED0_PIN, PIN_HIGH);
rt_thread_mdelay(500);
rt_pin_write(LED0_PIN, PIN_LOW);
rt_thread_mdelay(500);
}

return RT_EOK;
}

编译工程,报错

packages\littlefs-latest\dfs_lfs.c(566): error: #393: pointer to incomplete class type is not allowed

bc7686be-9bd2-11ef-8084-92fbcf53809c.png
原因是使用的 littlefs最新版本,最新版本做了修改。降级littlefs版本即可,降到V2.3.0版本。

四、测试

将程序下载到开发板,进行测试。检查 fal 分区是否正常,MTD 设备是否创建成功,文件系统有没有挂载成功。将工程编译下载,查看系统启动时是否打印了 fal 分区、 MTD 设备创建成功和文件系统初始化成功的提示信息。

分区表的打印和 MTD 设备创建成功的提示信息如下所示:

bc833e22-9bd2-11ef-8084-92fbcf53809c.png
文件系统的使用
RT-thread 支持的文件系统很多,但是所有的文件系统都对接到 DFS 框架。对于上层应用,DFS 框架提供了统一的 POSIX 文件和目录操作接口。开发者更换文件系统后,可以将原来的代码无缝的移植到新的文件系统上而不需要修改代码。

// 使用 ls 命令查看当前目录信息
msh />ls
Directory /:
msh />
msh />

//使用 echo 命令将输入的字符串输出到指定输出位置
msh />echo "123" 123.txt # 将字符串出输出到 123.txt 文件
msh />
msh />ls
Directory /:
123.txt 3
msh />
msh />

//使用 cat 命令查看文件内容
msh />cat 123.txt
123
msh />
msh />

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式
    +关注

    关注

    5068

    文章

    19013

    浏览量

    303126
  • 存储器
    +关注

    关注

    38

    文章

    7452

    浏览量

    163591
  • RT-Thread
    +关注

    关注

    31

    文章

    1272

    浏览量

    39908
收藏 人收藏

    评论

    相关推荐

    RT-Thread文件系统的基本知识和使用方法

    为了能让开发者清楚地理解 RT-Thread DFS 框架的概念,学会使用 RT-Thread 文件系统。本应用笔记将一步步深入介绍 RT-Thread DFS 框架的相关知识以及实
    的头像 发表于 08-17 10:01 3.1w次阅读
    <b class='flag-5'>RT-Thread</b><b class='flag-5'>文件系统</b>的基本知识和使用方法

    RT-Thread文件系统的基本知识和使用方法

    本文介绍了 RT-Thread 文件系统的基本知识和使用方法,帮助开发者更好地使用 RT-Thread 文件系统。并给出了在正点原子 STM32
    发表于 03-30 07:14

    怎么使用RT-Thread文件系统

    使用RT-Thread文件系统
    发表于 03-30 07:26

    正点原子探索者stm32f407 rt-thread文件系统怎么使用?

    正点原子探索者stm32f407 rt-thread文件系统怎么使用?
    发表于 11-25 06:08

    RT-Thread文件系统的资料下载

    第一次接触 RT-Thread 文件系统的开发者可能觉得 RT-Thread 文件系统过于复杂,不知道该从何入手。想要在项目中使用文件系统
    发表于 03-24 16:03

    基于STM32F103的Littlefs文件系统移植

    移植平台: 正点原子STM32F1精英版V1.41MCU:STM32F103ZET6SPI Falsh:W25Q128LittleFS是ARM mbedOS的官方推荐文件系统,具有轻量
    发表于 12-02 12:51 32次下载
    基于<b class='flag-5'>STM32</b>F103的<b class='flag-5'>Littlefs</b><b class='flag-5'>文件系统</b>移植

    RT-Thread文件系统组件在STM32H743上的应用

    文章目录开发环境RT虚拟文件系统简介基于RT-Studio的配置重写块设备相关代码重写块设备代码的原因生成SDMMC初始化代码在RT中初始化并注册块设备将块设备挂载到
    发表于 12-05 18:36 4次下载
    <b class='flag-5'>RT-Thread</b><b class='flag-5'>文件系统</b>组件在<b class='flag-5'>STM32</b>H743上的应用

    RT-Thread系统移植到STM32f103

    RT-Thread系统移植到STM32f103
    发表于 12-09 12:51 26次下载
    <b class='flag-5'>RT-Thread</b><b class='flag-5'>系统</b>移植到<b class='flag-5'>STM32</b>f103

    RT-Thread STM32 配置系统时钟(使用外部晶振)

    RT-Thread STM32 配置系统时钟开发环境芯片:STM32F103RCT6RT-Thread Studio: V1.0.6(现在已经更新到1.1.3,由于本人使用RTT开发已
    发表于 12-14 18:45 14次下载
    <b class='flag-5'>RT-Thread</b> <b class='flag-5'>STM32</b> 配置<b class='flag-5'>系统</b>时钟(使用外部晶振)

    RT-Thread Studio驱动SD卡

    总结前言硬件平台:RT-Thread ART-Pi STM32H750XBH6开发板 H750开发板开发软件:RT-Thread Studio参考博客:RT-Thread Studio
    发表于 12-27 19:13 20次下载
    <b class='flag-5'>RT-Thread</b> Studio驱动SD卡

    RT-Thread文档_RT-Thread 潘多拉 STM32L475 上手指南

    RT-Thread文档_RT-Thread 潘多拉 STM32L475 上手指南
    发表于 02-22 18:23 9次下载
    <b class='flag-5'>RT-Thread</b>文档_<b class='flag-5'>RT-Thread</b> 潘多拉 <b class='flag-5'>STM32</b>L475 上手指南

    RT-Thread文档_虚拟文件系统

    RT-Thread文档_虚拟文件系统
    发表于 02-22 18:42 1次下载
    <b class='flag-5'>RT-Thread</b>文档_虚拟<b class='flag-5'>文件系统</b>

    RT-Thread文档_TMPFS 临时文件系统

    RT-Thread文档_TMPFS 临时文件系统
    发表于 02-22 18:42 0次下载
    <b class='flag-5'>RT-Thread</b>文档_TMPFS 临时<b class='flag-5'>文件系统</b>

    LPC55S69在RT-Thread上的SDIO驱动和文件系统

    本篇将介绍如何在LPC55S69_EVK开发板上,使用RT-Thread的SDIO驱动和FATFS文件系统组件实现SD卡上的文件读写。
    的头像 发表于 03-08 14:13 1184次阅读
    LPC55S69在<b class='flag-5'>RT-Thread</b>上的SDIO驱动和<b class='flag-5'>文件系统</b>

    RT-Thread BSP qemu-virt64-aarch64文件系统

    前面大体上搭建了 RT-Thread BSP qemu-virt64-aarch64 的交叉编译环境,运行后发现,文件系统没有挂载上,感觉是没有 mkfs。
    的头像 发表于 10-08 16:34 901次阅读
    <b class='flag-5'>RT-Thread</b> BSP qemu-virt64-aarch64<b class='flag-5'>文件系统</b>