作者:嵌入式學習和實踐
一、開發(fā)環(huán)境介紹
硬件:基于野火stm32f407 開發(fā)板
軟件:基于rt-thread v4.1.1版本的 stm32f407-atk-explorer bsp工程。
二、littlefs 簡介
littlefs 是 ARM 官方推出的,專為嵌入式系統(tǒng)設計的文件系統(tǒng),相比傳統(tǒng)的文件系統(tǒng),littlefs 具有以下優(yōu)點:
1、自帶擦寫均衡
2、支持掉電保護
3、占用的 RAM/ROM 少
4、littlefs 自帶的擦寫均衡和掉電保護使開發(fā)者可以放心的將文件系統(tǒng)掛載到 nor flash 上。
littlefs 在 RT-Thread 上運行的層級關系圖
名詞解釋
DFS 框架
DFS 框架 是 RT-Thread 提供的虛擬文件系統(tǒng)組件,全稱為 Device File System,即設備虛擬文件系統(tǒng)。DFS 框架為應用程序提供統(tǒng)一的 POSIX 文件和目錄操作接口,如 read、write、poll/select 等。DFS 框架支持多種類型的文件系統(tǒng),如 FatFS、RomFS、DevFS 等,并提供普通文件、設備文件、網絡文件描述符的管理。
MTD 設備
MTD 設備,全稱為 Memory Technology Device,使用 MTD 設備為 NOR FLASH 和 NAND FLASH 提供統(tǒng)一接口,將文件系統(tǒng)與底層 FLASH 存儲器進行了隔離。
fal 組件
fal 全稱為 Flash Abstraction Layer,即 Flash 抽象層,是對 Flash 及基于 Flash 的分區(qū)進行管理、操作的抽象層,對上層統(tǒng)一了 Flash 及 分區(qū)操作的 API。并提供了將分區(qū)創(chuàng)建成 MTD 設備的 API。
SFUD 組件
SFUD 是一款開源的串行 SPI Flash 通用驅動庫?,F(xiàn)有市面的大部分串行 Flash,用戶只需要提供 SPI 或 QSPI 的讀寫接口,SFUD 就可以識別并驅動。同時 RT-Thread 提供了 FAL 針對 SFUD 的驅動移植,可以使兩個組件無縫連接。
開發(fā)者使用的是 DFS 框架提供的統(tǒng)一的 POSIX API,DFS 框架會調用 littlefs 的 API,littlefs 會使用 MTD 設備的讀寫接口,開發(fā)者可以使用 RT-Thread 提供的 fal 組件和 SFUD 組件來完成對 FLASH 的讀寫任務,也可以自己實現(xiàn) MTD 設備的驅動程序,使 littlefs 可以掛載到更多的存儲介質上。
三、littlefs 移植
開發(fā)者只需要提供一個 MTD 設備即可使用 littlefs。開發(fā)者可以自己實現(xiàn)一個 MTD 設備,也可以利用 RT-Thread 提供的 fal 組件,非常方便的創(chuàng)建出一個 MTD 設備。相比于直接使用 flash 底層函數(shù)來自己構造一個 MTD 設備,使用 fal 創(chuàng)建 MTD 設備有以下三個優(yōu)點:
1、創(chuàng)建 MTD 設備方便。
2、驅動的可移植性和可重用性強。
3、fal 的分區(qū)功能可以讓 littlefs 只使用指定區(qū)域的 flash。
littlefs 的移植主要包括下面幾個方面:
工程基于
**開啟SPI,根據實際選擇 **
在組件中,查看 SFUD 組件是否開啟,沒開啟則需要開啟,打開調試信息(可選)
開啟 fal
配置 MTD 設備
開啟littlefs,選擇V2.3.0版本,高于此版本會報錯,后面會遇到。
v2.3.0版本:
latest 版本:
開啟DFS文件系統(tǒng)
設置完成后,退出配置界面,在 env 中輸入pkgs --update。
fal文件接口移植適配
配置分區(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 設備并掛載文件系統(tǒng)
fal 組件并沒有加入自動初始化的代碼,所以需要在 main 函數(shù)中初始化 fal,并使用 fal 提供的 API 來創(chuàng)建一個 MTD 設備。創(chuàng)建 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
/* 添加文件系統(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 設備 */
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;
}
編譯工程,報錯
packages\littlefs-latest\dfs_lfs.c(566): error: #393: pointer to incomplete class type is not allowed
原因是使用的 littlefs最新版本,最新版本做了修改。降級littlefs版本即可,降到V2.3.0版本。
四、測試
將程序下載到開發(fā)板,進行測試。檢查 fal 分區(qū)是否正常,MTD 設備是否創(chuàng)建成功,文件系統(tǒng)有沒有掛載成功。將工程編譯下載,查看系統(tǒng)啟動時是否打印了 fal 分區(qū)、 MTD 設備創(chuàng)建成功和文件系統(tǒng)初始化成功的提示信息。
分區(qū)表的打印和 MTD 設備創(chuàng)建成功的提示信息如下所示:
文件系統(tǒng)的使用
RT-thread 支持的文件系統(tǒng)很多,但是所有的文件系統(tǒng)都對接到 DFS 框架。對于上層應用,DFS 框架提供了統(tǒng)一的 POSIX 文件和目錄操作接口。開發(fā)者更換文件系統(tǒng)后,可以將原來的代碼無縫的移植到新的文件系統(tǒng)上而不需要修改代碼。
// 使用 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 />
-
嵌入式
+關注
關注
5082文章
19123瀏覽量
305143 -
存儲器
+關注
關注
38文章
7492瀏覽量
163828 -
RT-Thread
+關注
關注
31文章
1289瀏覽量
40122
發(fā)布評論請先 登錄
相關推薦
評論