RM新时代网站-首页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

stm32單片機(jī)基于rt-thread 的 littlefs 文件系統(tǒng) 的使用

RT-Thread官方賬號(hào) ? 2024-11-06 08:04 ? 次閱讀

作者:嵌入式學(xué)習(xí)和實(shí)踐


一、開發(fā)環(huán)境介紹

硬件:基于野火stm32f407 開發(fā)板
軟件:基于rt-thread v4.1.1版本的 stm32f407-atk-explorer bsp工程。

二、littlefs 簡(jiǎn)介

littlefs 是 ARM 官方推出的,專為嵌入式系統(tǒng)設(shè)計(jì)的文件系統(tǒng),相比傳統(tǒng)的文件系統(tǒng),littlefs 具有以下優(yōu)點(diǎn):
1、自帶擦寫均衡
2、支持掉電保護(hù)
3、占用的 RAM/ROM
4、littlefs 自帶的擦寫均衡和掉電保護(hù)使開發(fā)者可以放心的將文件系統(tǒng)掛載到 nor flash 上。
littlefs 在 RT-Thread 上運(yùn)行的層級(jí)關(guān)系圖
bb7870ec-9bd2-11ef-8084-92fbcf53809c.png
名詞解釋
DFS 框架
DFS 框架 是 RT-Thread 提供的虛擬文件系統(tǒng)組件,全稱為 Device File System,即設(shè)備虛擬文件系統(tǒng)。DFS 框架為應(yīng)用程序提供統(tǒng)一的 POSIX 文件和目錄操作接口,如 read、write、poll/select 等。DFS 框架支持多種類型的文件系統(tǒng),如 FatFS、RomFS、DevFS 等,并提供普通文件、設(shè)備文件、網(wǎng)絡(luò)文件描述符的管理。

MTD 設(shè)備
MTD 設(shè)備,全稱為 Memory Technology Device,使用 MTD 設(shè)備為 NOR FLASH 和 NAND FLASH 提供統(tǒng)一接口,將文件系統(tǒng)與底層 FLASH 存儲(chǔ)器進(jìn)行了隔離。

fal 組件
fal 全稱為 Flash Abstraction Layer,即 Flash 抽象層,是對(duì) Flash 及基于 Flash 的分區(qū)進(jìn)行管理、操作的抽象層,對(duì)上層統(tǒng)一了 Flash 及 分區(qū)操作的 API。并提供了將分區(qū)創(chuàng)建成 MTD 設(shè)備的 API。

SFUD 組件
SFUD 是一款開源的串行 SPI Flash 通用驅(qū)動(dòng)庫(kù)。現(xiàn)有市面的大部分串行 Flash,用戶只需要提供 SPI 或 QSPI 的讀寫接口,SFUD 就可以識(shí)別并驅(qū)動(dòng)。同時(shí) RT-Thread 提供了 FAL 針對(duì) SFUD 的驅(qū)動(dòng)移植,可以使兩個(gè)組件無縫連接。

開發(fā)者使用的是 DFS 框架提供的統(tǒng)一的 POSIX API,DFS 框架會(huì)調(diào)用 littlefs 的 API,littlefs 會(huì)使用 MTD 設(shè)備的讀寫接口,開發(fā)者可以使用 RT-Thread 提供的 fal 組件和 SFUD 組件來完成對(duì) FLASH 的讀寫任務(wù),也可以自己實(shí)現(xiàn) MTD 設(shè)備的驅(qū)動(dòng)程序,使 littlefs 可以掛載到更多的存儲(chǔ)介質(zhì)上。

三、littlefs 移植

開發(fā)者只需要提供一個(gè) MTD 設(shè)備即可使用 littlefs。開發(fā)者可以自己實(shí)現(xiàn)一個(gè) MTD 設(shè)備,也可以利用 RT-Thread 提供的 fal 組件,非常方便的創(chuàng)建出一個(gè) MTD 設(shè)備。相比于直接使用 flash 底層函數(shù)來自己構(gòu)造一個(gè) MTD 設(shè)備,使用 fal 創(chuàng)建 MTD 設(shè)備有以下三個(gè)優(yōu)點(diǎn):
1、創(chuàng)建 MTD 設(shè)備方便。
2、驅(qū)動(dòng)的可移植性和可重用性強(qiáng)。
3、fal 的分區(qū)功能可以讓 littlefs 只使用指定區(qū)域的 flash。

littlefs 的移植主要包括下面幾個(gè)方面:
bb86690e-9bd2-11ef-8084-92fbcf53809c.png
工程基于

**開啟SPI,根據(jù)實(shí)際選擇 **
bb9295b2-9bd2-11ef-8084-92fbcf53809c.png
bba3e6a0-9bd2-11ef-8084-92fbcf53809c.png
在組件中,查看 SFUD 組件是否開啟,沒開啟則需要開啟,打開調(diào)試信息(可選)
bbbba7e0-9bd2-11ef-8084-92fbcf53809c.png
開啟 fal
bbc3d870-9bd2-11ef-8084-92fbcf53809c.png
配置 MTD 設(shè)備
bbcc0aa4-9bd2-11ef-8084-92fbcf53809c.png
開啟littlefs,選擇V2.3.0版本,高于此版本會(huì)報(bào)錯(cuò),后面會(huì)遇到。
bbe035f6-9bd2-11ef-8084-92fbcf53809c.png
v2.3.0版本:
bbf8fab4-9bd2-11ef-8084-92fbcf53809c.png

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

開啟DFS文件系統(tǒng)
bc0a04da-9bd2-11ef-8084-92fbcf53809c.png

設(shè)置完成后,退出配置界面,在 env 中輸入pkgs --update。
bc1f006a-9bd2-11ef-8084-92fbcf53809c.png
fal文件接口移植適配
bc523566-9bd2-11ef-8084-92fbcf53809c.png
bc6340f4-9bd2-11ef-8084-92fbcf53809c.png
配置分區(qū)表
打開工程中的 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_ */

創(chuàng)建 MTD 設(shè)備并掛載文件系統(tǒng)
fal 組件并沒有加入自動(dòng)初始化的代碼,所以需要在 main 函數(shù)中初始化 fal,并使用 fal 提供的 API 來創(chuàng)建一個(gè) MTD 設(shè)備。創(chuàng)建 MTD 設(shè)備后,就可以將 littlefs 掛載到剛剛生成的 MTD 設(shè)備上了。

測(cè)試代碼如下:

/*
* 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
/* 添加文件系統(tǒng)頭文件 */
#include

/* 添加 DEBUG 頭文件 */
#define DBG_SECTION_NAME "main"
#define DBG_LEVEL DBG_INFO
#include
/* 定義要使用的分區(qū)名字 */
#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 設(shè)備 */
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
{
/* 格式化文件系統(tǒng) */
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;
}

編譯工程,報(bào)錯(cuò)

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

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

四、測(cè)試

將程序下載到開發(fā)板,進(jìn)行測(cè)試。檢查 fal 分區(qū)是否正常,MTD 設(shè)備是否創(chuàng)建成功,文件系統(tǒng)有沒有掛載成功。將工程編譯下載,查看系統(tǒng)啟動(dòng)時(shí)是否打印了 fal 分區(qū)、 MTD 設(shè)備創(chuàng)建成功和文件系統(tǒng)初始化成功的提示信息。

分區(qū)表的打印和 MTD 設(shè)備創(chuàng)建成功的提示信息如下所示:

bc833e22-9bd2-11ef-8084-92fbcf53809c.png
文件系統(tǒng)的使用
RT-thread 支持的文件系統(tǒng)很多,但是所有的文件系統(tǒng)都對(duì)接到 DFS 框架。對(duì)于上層應(yīng)用,DFS 框架提供了統(tǒng)一的 POSIX 文件和目錄操作接口。開發(fā)者更換文件系統(tǒng)后,可以將原來的代碼無縫的移植到新的文件系統(tǒng)上而不需要修改代碼。

// 使用 ls 命令查看當(dāng)前目錄信息
msh />ls
Directory /:
msh />
msh />

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

//使用 cat 命令查看文件內(nèi)容
msh />cat 123.txt
123
msh />
msh />

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 嵌入式
    +關(guān)注

    關(guān)注

    5082

    文章

    19104

    瀏覽量

    304781
  • 存儲(chǔ)器
    +關(guān)注

    關(guān)注

    38

    文章

    7484

    瀏覽量

    163759
  • RT-Thread
    +關(guān)注

    關(guān)注

    31

    文章

    1285

    瀏覽量

    40077
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    RT-Thread文件系統(tǒng)的基本知識(shí)和使用方法

    為了能讓開發(fā)者清楚地理解 RT-Thread DFS 框架的概念,學(xué)會(huì)使用 RT-Thread 文件系統(tǒng)。本應(yīng)用筆記將一步步深入介紹 RT-Thread DFS 框架的相關(guān)知識(shí)以及實(shí)
    的頭像 發(fā)表于 08-17 10:01 ?3.1w次閱讀
    <b class='flag-5'>RT-Thread</b><b class='flag-5'>文件系統(tǒng)</b>的基本知識(shí)和使用方法

    RT-Thread文件系統(tǒng)的基本知識(shí)和使用方法

    本文介紹了 RT-Thread 文件系統(tǒng)的基本知識(shí)和使用方法,幫助開發(fā)者更好地使用 RT-Thread 文件系統(tǒng)。并給出了在正點(diǎn)原子 STM32
    發(fā)表于 03-30 07:14

    怎么使用RT-Thread文件系統(tǒng)

    使用RT-Thread文件系統(tǒng)
    發(fā)表于 03-30 07:26

    正點(diǎn)原子探索者stm32f407 rt-thread文件系統(tǒng)怎么使用?

    正點(diǎn)原子探索者stm32f407 rt-thread文件系統(tǒng)怎么使用?
    發(fā)表于 11-25 06:08

    RT-Thread文件系統(tǒng)的資料下載

    第一次接觸 RT-Thread 文件系統(tǒng)的開發(fā)者可能覺得 RT-Thread 文件系統(tǒng)過于復(fù)雜,不知道該從何入手。想要在項(xiàng)目中使用文件系統(tǒng),
    發(fā)表于 03-24 16:03

    基于STM32F103的Littlefs文件系統(tǒng)移植

    移植平臺(tái): 正點(diǎn)原子STM32F1精英版V1.41MCU:STM32F103ZET6SPI Falsh:W25Q128LittleFS是ARM mbedOS的官方推薦文件系統(tǒng),具有輕量
    發(fā)表于 12-02 12:51 ?32次下載
    基于<b class='flag-5'>STM32</b>F103的<b class='flag-5'>Littlefs</b><b class='flag-5'>文件系統(tǒng)</b>移植

    RT-Thread文件系統(tǒng)組件在STM32H743上的應(yīng)用

    文章目錄開發(fā)環(huán)境RT虛擬文件系統(tǒng)簡(jiǎn)介基于RT-Studio的配置重寫塊設(shè)備相關(guān)代碼重寫塊設(shè)備代碼的原因生成SDMMC初始化代碼在RT中初始化并注冊(cè)塊設(shè)備將塊設(shè)備掛載到
    發(fā)表于 12-05 18:36 ?4次下載
    <b class='flag-5'>RT-Thread</b><b class='flag-5'>文件系統(tǒng)</b>組件在<b class='flag-5'>STM32</b>H743上的應(yīng)用

    RT-Thread系統(tǒng)移植到STM32f103

    RT-Thread系統(tǒng)移植到STM32f103
    發(fā)表于 12-09 12:51 ?26次下載
    <b class='flag-5'>RT-Thread</b><b class='flag-5'>系統(tǒng)</b>移植到<b class='flag-5'>STM32</b>f103

    RT-Thread STM32 配置系統(tǒng)時(shí)鐘(使用外部晶振)

    RT-Thread STM32 配置系統(tǒng)時(shí)鐘開發(fā)環(huán)境芯片:STM32F103RCT6RT-Thread Studio: V1.0.6(現(xiàn)在已經(jīng)更新到1.1.3,由于本人使用RTT開發(fā)已
    發(fā)表于 12-14 18:45 ?14次下載
    <b class='flag-5'>RT-Thread</b> <b class='flag-5'>STM32</b> 配置<b class='flag-5'>系統(tǒng)</b>時(shí)鐘(使用外部晶振)

    RT-Thread Studio驅(qū)動(dòng)SD卡

    總結(jié)前言硬件平臺(tái):RT-Thread ART-Pi STM32H750XBH6開發(fā)板 H750開發(fā)板開發(fā)軟件:RT-Thread Studio參考博客:RT-Thread Studio
    發(fā)表于 12-27 19:13 ?20次下載
    <b class='flag-5'>RT-Thread</b> Studio驅(qū)動(dòng)SD卡

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

    RT-Thread文檔_RT-Thread 潘多拉 STM32L475 上手指南
    發(fā)表于 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文檔_虛擬文件系統(tǒng)

    RT-Thread文檔_虛擬文件系統(tǒng)
    發(fā)表于 02-22 18:42 ?1次下載
    <b class='flag-5'>RT-Thread</b>文檔_虛擬<b class='flag-5'>文件系統(tǒng)</b>

    RT-Thread文檔_TMPFS 臨時(shí)文件系統(tǒng)

    RT-Thread文檔_TMPFS 臨時(shí)文件系統(tǒng)
    發(fā)表于 02-22 18:42 ?0次下載
    <b class='flag-5'>RT-Thread</b>文檔_TMPFS 臨時(shí)<b class='flag-5'>文件系統(tǒng)</b>

    LPC55S69在RT-Thread上的SDIO驅(qū)動(dòng)和文件系統(tǒng)

    本篇將介紹如何在LPC55S69_EVK開發(fā)板上,使用RT-Thread的SDIO驅(qū)動(dòng)和FATFS文件系統(tǒng)組件實(shí)現(xiàn)SD卡上的文件讀寫。
    的頭像 發(fā)表于 03-08 14:13 ?1219次閱讀
    LPC55S69在<b class='flag-5'>RT-Thread</b>上的SDIO驅(qū)動(dòng)和<b class='flag-5'>文件系統(tǒng)</b>

    RT-Thread BSP qemu-virt64-aarch64文件系統(tǒng)

    前面大體上搭建了 RT-Thread BSP qemu-virt64-aarch64 的交叉編譯環(huán)境,運(yùn)行后發(fā)現(xiàn),文件系統(tǒng)沒有掛載上,感覺是沒有 mkfs。
    的頭像 發(fā)表于 10-08 16:34 ?942次閱讀
    <b class='flag-5'>RT-Thread</b> BSP qemu-virt64-aarch64<b class='flag-5'>文件系統(tǒng)</b>
    RM新时代网站-首页