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

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

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

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

RTThread物聯(lián)網(wǎng)操作系統(tǒng) ? 來源:未知 ? 作者:李倩 ? 2018-11-07 10:40 ? 次閱讀

本文的背景

DFS(Device virtual file system)是一種抽象的文件機(jī)制,RT-Thread中對(duì)文件系統(tǒng)的相關(guān)操作實(shí)際上都通過操作DFS實(shí)現(xiàn),也就是說DFS是對(duì)各具體文件系統(tǒng)的抽象。DFS使得其他部分無須關(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

hello.txt 18

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

hello.txt 18

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)大家通過運(yùn)行文件系統(tǒng)的一些示例程序,來熟悉文件系統(tǒng)的基本操作。示例程序通過使用一些 DFS 的 API接口來實(shí)現(xiàn),并將示例導(dǎo)出到 msh 命令,通過運(yùn)行示例程序并對(duì)照示例程序源碼,有利于我們盡快上手操作文件系統(tǒng)。

3.1獲取示例代碼

文件系統(tǒng)的示例代碼包含在 RT-Thread samples 軟件包中,可以通過 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è)示例代碼的源碼來詳細(xì)的了解文件系統(tǒng) API 的用法了。

4QEMU SD卡的讀寫

QEMU 運(yùn)行起來之后會(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 里的文件讀取出來。

4.2制作 QEMU SD 卡

在 env 工具的tools/fatdisk目錄下有一個(gè)打包 FAT 格式文件的工具 fatdisk.exe,我們可以利用這個(gè)工具將我們要存儲(chǔ)到QEMU SD卡里的文件打包成 sd.bin 文件。然后用新生成的 sd.bin 替換掉bspqemu-vexpress-a9目錄下原來的 sd.bin 文件即可。

打開路徑env/tools/fatdisk并在該目錄下新建文件夾 sd

打開上一步我們創(chuàng)建好的文件夾,放入我們需要存儲(chǔ)到QEMU SD卡里的文件或文件夾

修改env/tools/fatdisk目錄下 fatdisk.xml 文件為下面的內(nèi)容(視頻中內(nèi)容有誤)

65536 512 sd sd.bin 0

在env/tools/fatdisk目錄下右鍵打開 env 工具,輸入命令fatdisk運(yùn)行,就會(huì)在當(dāng)前目錄下生成 sd.bin 文件了。

然后用新生成的 sd.bin 替換掉bspqemu-vexpress-a9目錄下原來的 sd.bin 文件

運(yùn)行 qemu 輸入 ls 可以看到我們存儲(chǔ)到QEMU SD卡里的文件和文件夾了。

5使用 RomFS

RomFS 是在嵌入式設(shè)備上常用的一種文件系統(tǒng),具備體積小,可靠性高,讀取速度快等優(yōu)點(diǎn),常用來作為系統(tǒng)初始文件系統(tǒng)。但也具有其局限性,RomFS 是一種只讀文件系統(tǒng)。

不同的數(shù)據(jù)存儲(chǔ)方式對(duì)文件系統(tǒng)占用空間,讀寫效率,查找速度等主要性能影響極大。RomFS 使用順序存儲(chǔ)方式,所有數(shù)據(jù)都是順序存放的。因此 RomFS 中的數(shù)據(jù)一旦確定就無法修改,這是 RomFS 是一種只讀文件系統(tǒng)的原因。也由于這種順序存放策略,RomFS 中每個(gè)文件的數(shù)據(jù)都能連續(xù)存放,讀取過程中只需要一次尋址操作,就可以讀入整塊數(shù)據(jù),因此 RomFS 中讀取數(shù)據(jù)效率很高。

5.1 配置使能 RomFS

開啟 RT-Thread 對(duì) RomFS 的支持,并調(diào)整最大支持的文件系統(tǒng)類型數(shù)目。

打開 menuconfig 菜單,保證 “RT-Thread Components” → “Device virtual file system” → “Enable ReadOnly file system on flash” 為開啟狀態(tà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)。

打開路徑

rtthreadcomponentsdfsfilesystems omfs并在該目錄下新建文件夾 romfs

打開上一步我們創(chuàng)建好的文件夾,放入我們需要在 RomFS 中放置的文件或文件夾。

回到上一級(jí)目錄

rt-threadcomponentsdfsfilesystems omfs,在該目錄下打開 env 工具,并運(yùn)行命令

python mkromfs.py romfs romfs.c

可以看到目錄下成功生成 romfs.c 文件:

5.3掛載 RomFS

在系統(tǒng)任務(wù)調(diào)度開始之后,通過 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)是讀寫速度很快,但存在掉電丟失的風(fēng)險(xiǎn)。如果一個(gè)進(jìn)程的性能瓶頸是硬盤的讀寫,那么可以考慮在 RamFS 或 tmpfs 上進(jìn)行大文件的讀寫操作。

RamFS 使用鏈?zhǔn)酱鎯?chǔ)方式,并且數(shù)據(jù)存儲(chǔ)在內(nèi)存空間,因此 RamFS 具備了可讀寫文件系統(tǒng)的特征,同時(shí)也擁有較快的讀寫速度。

6.1配置使能 RamFS

打開 menuconfig 菜單,保證 “RT-Thread Components” → “Device virtual file system” → “Enable RAM file system” 為開啟狀態(tài):

6.2掛載 RamFS

由于 RamFS 是在系統(tǒng)運(yùn)行過程中動(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)度開始之后,通過 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ù)制至外部瀏覽器打開)

? 文件系統(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/

聲明:本文內(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)注

    8

    文章

    641

    瀏覽量

    29211
  • API接口
    +關(guān)注

    關(guān)注

    1

    文章

    84

    瀏覽量

    10438
  • DFS
    DFS
    +關(guān)注

    關(guān)注

    0

    文章

    26

    瀏覽量

    9163

原文標(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)注明出處。

收藏 人收藏

    評(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í)和使用方法

    7天入門網(wǎng)絡(luò)編程視頻課 - 3-1使用 RT-Thread 文件系統(tǒng)

    嵌入式編程語(yǔ)言
    RT-ThreadIoTOS
    發(fā)布于 :2022年01月14日 14:09:34

    7天入門網(wǎng)絡(luò)編程視頻課 - 3-2使用 RT-Thread 文件系統(tǒng)

    嵌入式編程語(yǔ)言
    RT-ThreadIoTOS
    發(fā)布于 :2022年01月14日 14:11:43

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

    本文介紹了 RT-Thread 文件系統(tǒng)的基本知識(shí)和使用方法,幫助開發(fā)者更好地使用 RT-Thread 文件系統(tǒng)。并給出了在正點(diǎn)原子 STM32F429-apollo 開發(fā)板上驗(yàn)證的代
    發(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

    在 SPI Flash上怎樣去使用RT-Thread文件系統(tǒng)

    RT-Thread文件系統(tǒng)的主要功能特點(diǎn)有哪些?在SPI Flash上怎樣去使用RT-Thread文件系統(tǒng)呢?
    發(fā)表于 12-20 08:07

    RT-Thread實(shí)現(xiàn)分布式溫度監(jiān)控系統(tǒng)的教程合集

    優(yōu)化,會(huì)大大增強(qiáng)系統(tǒng)性能。本次任務(wù)了解 RT-Thread 文件系統(tǒng),在接收節(jié)點(diǎn)中使用文件系統(tǒng),存放來自發(fā)送節(jié)點(diǎn)發(fā)送過來的數(shù)據(jù)。上述任務(wù)比較單一,只是
    發(fā)表于 03-24 11:00

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

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

    如何讀取RT-Thread文件系統(tǒng).txt文本中指定行的數(shù)據(jù)?

    文件系統(tǒng)中,存放的.txt文本文檔,怎么讀取指定行的一行數(shù)據(jù)。存儲(chǔ)的數(shù)據(jù),每行數(shù)據(jù)長(zhǎng)度不一樣長(zhǎng)。如圖所示的數(shù)據(jù),怎么讀取指定的一行數(shù)據(jù)。謝謝
    發(fā)表于 04-19 09:52

    怎樣去做一個(gè)RT-Thread文件系統(tǒng)重構(gòu)呢

    做個(gè)RT-Thread文件系統(tǒng)重構(gòu)吧,當(dāng)前的DFS和RT-Thread結(jié)合得還不是太緊密:DFS原來是和DOOLOO聯(lián)系在一起的,同時(shí)為了測(cè)試方便也做了Win32 & POSIX平臺(tái)
    發(fā)表于 08-10 11:19

    請(qǐng)問一下大佬RT-Thread文件系統(tǒng)能同時(shí)讀寫多個(gè)文件嗎?

    請(qǐng)問一下大佬RT-Thread文件系統(tǒng)能同時(shí)讀寫多個(gè)文件嗎?
    發(fā)表于 08-11 09:46

    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>組件在STM32H743上的應(yīng)用

    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>