本文的背景
DFS(Device virtual file system)是一種抽象的文件機制,RT-Thread中對文件系統的相關操作實際上都通過操作DFS實現,也就是說DFS是對各具體文件系統的抽象。DFS使得其他部分無須關心不同文件系統之間的差異,使得RTThread可以支持多種類型的文件系統。
1 SD卡掛載操作代碼
掛載文件系統的源代碼位于qemu-vexpress-a9applicationsmnt.c中。在實際代碼中會將塊設備sd0中的文件系統掛載到根目錄/上。
#include
#ifdef RT_USING_DFS
#include
int mnt_init(void)
{ rt_thread_delay(RT_TICK_PER_SECOND); if (dfs_mount("sd0", "/", "elm", 0, 0) == 0) { rt_kprintf("file system initialization done! "); } return 0;
}
INIT_ENV_EXPORT(mnt_init);
#endif
2常用命令展示
在掛載文件系統成功之后,就可以在 msh 中使用一些常用命令體驗文件系統了。
2.1ls: 查看當前目錄信息
msh />ls # 使用 ls 命令查看文件系統目錄信息
Directory /: # 可以看到已經存在根目錄 /
2.2mkdir: 創建文件夾
msh />mkdir rt-thread # 創建 rt-thread 文件夾
msh />ls # 查看目錄信息如下
Directory /:rt-thread
2.3echo: 將輸入的字符串輸出到指定輸出位置
msh />echo "hello rt-thread!!!" # 將字符串輸出到標準輸出hello rt-thread!!!msh />echo "hello rt-thread!!!" hello.txt # 將字符串輸出到 hello.txt 文件msh />lsDirectory /:rt-thread
msh />
2.4cat: 查看文件內容
msh />cat hello.txt # 查看 hello.txt 文件的內容并輸出
hello rt-thread!!!
2.5rm: 刪除文件夾或文件
msh />ls # 查看當前目錄信息
Directory /:rt-thread
msh />rm rt-thread # 刪除 rt-thread 文件夾
msh />lsDirectory /:hello.txt 18
msh />rm hello.txt # 刪除 hello.txt 文件
msh />lsDirectory /:msh />
3運行文件系統示例程序
了解了文件系統的一些常用命令之后,下面帶領大家通過運行文件系統的一些示例程序,來熟悉文件系統的基本操作。示例程序通過使用一些 DFS 的 API接口來實現,并將示例導出到 msh 命令,通過運行示例程序并對照示例程序源碼,有利于我們盡快上手操作文件系統。
3.1獲取示例代碼
文件系統的示例代碼包含在 RT-Thread samples 軟件包中,可以通過 env 配置將示例代碼加入到項目中,路徑如下所示。
RT-Thread online packages ---> miscellaneous packages ---> samples: RT-Thread kernel and components samples ---> [*] a filesystem_samples package for rt-thread --->
將示例代碼全部選中,然后退出保存并更新軟件包即可將示例代碼加入到工程里。
3.2運行示例代碼
在運行示例代碼之前需要先輸入scons編譯一遍工程。
然后輸入.qemu.bat運行工程
RT-Thread 啟動完成之后,按 TAB 鍵查看 msh 命令,文件系統 samples 命令已經導出到 msh :
然后就可以輸入命令運行相應的示例代碼了。
例如:執行命令 mkdir_sample 的運行結果是
msh />mkdir_samplemkdir ok!msh />lsDirectory /:dir_test
然后我們就可以對照這幾個示例代碼的源碼來詳細的了解文件系統 API 的用法了。
4QEMU SD卡的讀寫
QEMU 運行起來之后會在bspqemu-vexpress-a9目錄下創建一個 sd.bin 文件。這是一個虛擬的 SD 卡,RT-Thread 默認的文件系統就是搭建在這個里面的。
4.1讀取 QEMU SD 卡的內容
因 sd.bin 本質上就是一個 FAT 文件系統的鏡像文件,所以我們利用支持提取 FAT 格式的解壓軟件 7-Zip 就可以將 sd.bin 里的文件讀取出來。
4.2制作 QEMU SD 卡
在 env 工具的tools/fatdisk目錄下有一個打包 FAT 格式文件的工具 fatdisk.exe,我們可以利用這個工具將我們要存儲到QEMU SD卡里的文件打包成 sd.bin 文件。然后用新生成的 sd.bin 替換掉bspqemu-vexpress-a9目錄下原來的 sd.bin 文件即可。
打開路徑env/tools/fatdisk并在該目錄下新建文件夾 sd
打開上一步我們創建好的文件夾,放入我們需要存儲到QEMU SD卡里的文件或文件夾
修改env/tools/fatdisk目錄下 fatdisk.xml 文件為下面的內容(視頻中內容有誤)
在env/tools/fatdisk目錄下右鍵打開 env 工具,輸入命令fatdisk運行,就會在當前目錄下生成 sd.bin 文件了。
然后用新生成的 sd.bin 替換掉bspqemu-vexpress-a9目錄下原來的 sd.bin 文件
運行 qemu 輸入 ls 可以看到我們存儲到QEMU SD卡里的文件和文件夾了。
5使用 RomFS
RomFS 是在嵌入式設備上常用的一種文件系統,具備體積小,可靠性高,讀取速度快等優點,常用來作為系統初始文件系統。但也具有其局限性,RomFS 是一種只讀文件系統。
不同的數據存儲方式對文件系統占用空間,讀寫效率,查找速度等主要性能影響極大。RomFS 使用順序存儲方式,所有數據都是順序存放的。因此 RomFS 中的數據一旦確定就無法修改,這是 RomFS 是一種只讀文件系統的原因。也由于這種順序存放策略,RomFS 中每個文件的數據都能連續存放,讀取過程中只需要一次尋址操作,就可以讀入整塊數據,因此 RomFS 中讀取數據效率很高。
5.1 配置使能 RomFS
開啟 RT-Thread 對 RomFS 的支持,并調整最大支持的文件系統類型數目。
打開 menuconfig 菜單,保證 “RT-Thread Components” → “Device virtual file system” → “Enable ReadOnly file system on flash” 為開啟狀態:
打開子菜單 "RT-Thread Components" → "Device virtual file system" 調整最大支持文件系統系統類型數:
5.2生成 romfs.c 文件
由于 RomFS 是只讀文件系統,所以需要放入到 RomFS 的文件都需要在系統運行前加入。我們可以將要存入 RomFS 中的文件數據放在 romfs.c 文件中,RT-Thread提供了制作 romfs.c 的 Python 腳本文件,根據用戶需要加入到 RomFS 的文件和目錄生成對應的數據結構。
打開路徑
rtthreadcomponentsdfsfilesystems omfs并在該目錄下新建文件夾 romfs
打開上一步我們創建好的文件夾,放入我們需要在 RomFS 中放置的文件或文件夾。
回到上一級目錄
rt-threadcomponentsdfsfilesystems omfs,在該目錄下打開 env 工具,并運行命令
python mkromfs.py romfs romfs.c
可以看到目錄下成功生成 romfs.c 文件:
5.3掛載 RomFS
在系統任務調度開始之后,通過 dfs_mount() 函數掛載 RomFS ,在添加掛載函數的文件中需添加頭文件#include "dfs_romfs.h"
我們將qemu-vexpress-a9applicationsmnt.c文件中的內容替換成下面的代碼,即可將 RomFS 掛載到根目錄。
#include
#ifdef RT_USING_DFS
#include
#include "dfs_romfs.h"
int mnt_init(void)
{ if (dfs_mount(RT_NULL, "/", "rom", 0, &(romfs_root)) == 0) { rt_kprintf("ROM file system initializated! "); } else { rt_kprintf("ROM file system initializate failed! "); } return 0;
}
INIT_ENV_EXPORT(mnt_init);
#endif
5.4預期結果
編譯并運行工程之后,可以看到 RomFS 文件系統掛載成功,使用 ls 命令可以看到 RomFS 文件系統里面的文件夾和文件:
6使用 RamFS
RamFS 顧名思義是內存文件系統,它不能格式化,可以同時創建多個,在創建時可以指定其最大能使用的內存大小。其優點是讀寫速度很快,但存在掉電丟失的風險。如果一個進程的性能瓶頸是硬盤的讀寫,那么可以考慮在 RamFS 或 tmpfs 上進行大文件的讀寫操作。
RamFS 使用鏈式存儲方式,并且數據存儲在內存空間,因此 RamFS 具備了可讀寫文件系統的特征,同時也擁有較快的讀寫速度。
6.1配置使能 RamFS
打開 menuconfig 菜單,保證 “RT-Thread Components” → “Device virtual file system” → “Enable RAM file system” 為開啟狀態:
6.2掛載 RamFS
由于 RamFS 是在系統運行過程中動態創建的,所以在掛載之前我們應該先創建 RamFS ,RT-Thread 提供了創建 RamFS 的 API 接口:
struct dfs_ramfs* dfs_ramfs_create(rt_uint8_t *pool, rt_size_t size)
在系統任務調度開始之后,通過 dfs_mount() 函數掛載 RamFS
我們將qemu-vexpress-a9applicationsmnt.c文件中的內容替換成下面的代碼,即可將 RamFS 掛載到根目錄。
#include
#ifdef RT_USING_DFS
#include
int mnt_init(void)
{ if (dfs_mount(RT_NULL, "/", "ram", 0, dfs_ramfs_create(rt_malloc(1024),1024)) == 0) { rt_kprintf("RAM file system initializated! "); } else { rt_kprintf("RAM file system initializate failed! "); } return 0;
}
INIT_ENV_EXPORT(mnt_init);
#endif
6.3預期結果
編譯并運行工程之后, 可以看到 RamFS 文件系統掛載成功了。然后我們使用 echo 命令創建一個文件,可以看到創建成功了。
7引用參考(以下鏈接請復制至外部瀏覽器打開)
? 文件系統 samples
https://github.com/RT-Thread-packages/filesystem-sample
?env 使用手冊
https://www.rt-thread.org/document/site/rtthread-development-guide/rtthread-tool-manual/env/env-user-manual/
-
源碼
+關注
關注
8文章
633瀏覽量
29146 -
API接口
+關注
關注
1文章
82瀏覽量
10431 -
DFS
+關注
關注
0文章
26瀏覽量
9154
原文標題:網絡編程第3課:使用RT-Thread文件系統
文章出處:【微信號:RTThread,微信公眾號:RTThread物聯網操作系統】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論