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

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

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

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

本文的背景

DFS(Device virtual file system)是一種抽象的文件機制,RT-Thread中對文件系統(tǒng)的相關操作實際上都通過操作DFS實現(xiàn),也就是說DFS是對各具體文件系統(tǒng)的抽象。DFS使得其他部分無須關心不同文件系統(tǒng)之間的差異,使得RTThread可以支持多種類型的文件系統(tǒng)。

1 SD卡掛載操作代碼

掛載文件系統(tǒng)的源代碼位于qemu-vexpress-a9applicationsmnt.c中。在實際代碼中會將塊設備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 中使用一些常用命令體驗文件系統(tǒng)了。

2.1ls: 查看當前目錄信息

msh />ls # 使用 ls 命令查看文件系統(tǒng)目錄信息

Directory /: # 可以看到已經存在根目錄 /

2.2mkdir: 創(chuàng)建文件夾

msh />mkdir rt-thread # 創(chuàng)建 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

hello.txt 18

msh />

2.4cat: 查看文件內容

msh />cat hello.txt # 查看 hello.txt 文件的內容并輸出

hello rt-thread!!!

2.5rm: 刪除文件夾或文件

msh />ls # 查看當前目錄信息

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運行文件系統(tǒng)示例程序

了解了文件系統(tǒng)的一些常用命令之后,下面帶領大家通過運行文件系統(tǒng)的一些示例程序,來熟悉文件系統(tǒng)的基本操作。示例程序通過使用一些 DFS 的 API接口來實現(xiàn),并將示例導出到 msh 命令,通過運行示例程序并對照示例程序源碼,有利于我們盡快上手操作文件系統(tǒng)。

3.1獲取示例代碼

文件系統(tǒng)的示例代碼包含在 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 命令,文件系統(tǒng) samples 命令已經導出到 msh :

然后就可以輸入命令運行相應的示例代碼了。

例如:執(zhí)行命令 mkdir_sample 的運行結果是

msh />mkdir_samplemkdir ok!msh />lsDirectory /:dir_test

然后我們就可以對照這幾個示例代碼的源碼來詳細的了解文件系統(tǒng) API 的用法了。

4QEMU SD卡的讀寫

QEMU 運行起來之后會在bspqemu-vexpress-a9目錄下創(chuàng)建一個 sd.bin 文件。這是一個虛擬的 SD 卡,RT-Thread 默認的文件系統(tǒng)就是搭建在這個里面的。

4.1讀取 QEMU SD 卡的內容

因 sd.bin 本質上就是一個 FAT 文件系統(tǒng)的鏡像文件,所以我們利用支持提取 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

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

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

65536 512 sd sd.bin 0

在env/tools/fatdisk目錄下右鍵打開 env 工具,輸入命令fatdisk運行,就會在當前目錄下生成 sd.bin 文件了。

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

運行 qemu 輸入 ls 可以看到我們存儲到QEMU SD卡里的文件和文件夾了。

5使用 RomFS

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

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

5.1 配置使能 RomFS

開啟 RT-Thread 對 RomFS 的支持,并調整最大支持的文件系統(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" 調整最大支持文件系統(tǒng)系統(tǒng)類型數(shù):

5.2生成 romfs.c 文件

由于 RomFS 是只讀文件系統(tǒng),所以需要放入到 RomFS 的文件都需要在系統(tǒng)運行前加入。我們可以將要存入 RomFS 中的文件數(shù)據(jù)放在 romfs.c 文件中,RT-Thread提供了制作 romfs.c 的 Python 腳本文件,根據(jù)用戶需要加入到 RomFS 的文件和目錄生成對應的數(shù)據(jù)結構。

打開路徑

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

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

回到上一級目錄

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

python mkromfs.py romfs romfs.c

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

5.3掛載 RomFS

在系統(tǒng)任務調度開始之后,通過 dfs_mount() 函數(shù)掛載 RomFS ,在添加掛載函數(shù)的文件中需添加頭文件#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 文件系統(tǒng)掛載成功,使用 ls 命令可以看到 RomFS 文件系統(tǒng)里面的文件夾和文件:

6使用 RamFS

RamFS 顧名思義是內存文件系統(tǒng),它不能格式化,可以同時創(chuàng)建多個,在創(chuàng)建時可以指定其最大能使用的內存大小。其優(yōu)點是讀寫速度很快,但存在掉電丟失的風險。如果一個進程的性能瓶頸是硬盤的讀寫,那么可以考慮在 RamFS 或 tmpfs 上進行大文件的讀寫操作。

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

6.1配置使能 RamFS

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

6.2掛載 RamFS

由于 RamFS 是在系統(tǒng)運行過程中動態(tài)創(chuà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)任務調度開始之后,通過 dfs_mount() 函數(shù)掛載 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 文件系統(tǒng)掛載成功了。然后我們使用 echo 命令創(chuàng)建一個文件,可以看到創(chuàng)建成功了。

7引用參考(以下鏈接請復制至外部瀏覽器打開)

? 文件系統(tǒng) 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/

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 源碼
    +關注

    關注

    8

    文章

    626

    瀏覽量

    28965
  • API接口
    +關注

    關注

    1

    文章

    81

    瀏覽量

    10398
  • DFS
    DFS
    +關注

    關注

    0

    文章

    25

    瀏覽量

    9142

原文標題:網絡編程第3課:使用RT-Thread文件系統(tǒng)

文章出處:【微信號:RTThread,微信公眾號:RTThread物聯(lián)網操作系統(tǒng)】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    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 臨時文件系統(tǒng)

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