使用RT-Thread文件系统

描述

本文的背景

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.1 ls: 查看当前目录信息

msh />ls         # 使用 ls 命令查看文件系统目录信息          

Directory /:     # 可以看到已经存在根目录 /

2.2 mkdir: 创建文件夹

msh />mkdir rt-thread    # 创建 rt-thread 文件夹

msh />ls                       # 查看目录信息如下

Directory /:rt-thread          

2.3 echo: 将输入的字符串输出到指定输出位置

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.4 cat: 查看文件内容

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

hello rt-thread!!!

2.5 rm: 删除文件夹或文件

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 运行文件系统示例程序

了解了文件系统的一些常用命令之后,下面带领大家通过运行文件系统的一些示例程序,来熟悉文件系统的基本操作。示例程序通过使用一些 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 的用法了。

4 QEMU 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 文件为下面的内容(视频中内容有误)

  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 是在嵌入式设备上常用的一种文件系统,具备体积小,可靠性高,读取速度快等优点,常用来作为系统初始文件系统。但也具有其局限性,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/

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分