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