0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

使用RT-Thread文件系统

RTThread物联网操作系统 来源:未知 作者:李倩 2018-11-07 10:40 次阅读

本文的背景

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

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

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

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/

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

    关注

    8

    文章

    632

    浏览量

    29092
  • API接口
    +关注

    关注

    1

    文章

    82

    浏览量

    10417
  • DFS
    DFS
    +关注

    关注

    0

    文章

    26

    浏览量

    9147

原文标题:网络编程第3课:使用RT-Thread文件系统

文章出处:【微信号:RTThread,微信公众号:RTThread物联网操作系统】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    RT-Thread文件系统的基本知识和使用方法

    为了能让开发者清楚地理解 RT-Thread DFS 框架的概念,学会使用 RT-Thread 文件系统。本应用笔记将一步步深入介绍 RT-Thread DFS 框架的相关知识以及实
    的头像 发表于 08-17 10:01 3.1w次阅读
    <b class='flag-5'>RT-Thread</b><b class='flag-5'>文件系统</b>的基本知识和使用方法

    7天入门网络编程视频课 - 3-1使用 RT-Thread 文件系统

    嵌入式编程语言
    RT-ThreadIoTOS
    发布于 :2022年01月14日 14:09:34

    7天入门网络编程视频课 - 3-2使用 RT-Thread 文件系统

    嵌入式编程语言
    RT-ThreadIoTOS
    发布于 :2022年01月14日 14:11:43

    RT-Thread文件系统的基本知识和使用方法

    本文介绍了 RT-Thread 文件系统的基本知识和使用方法,帮助开发者更好地使用 RT-Thread 文件系统。并给出了在正点原子 STM32F429-apollo 开发板上验证的代
    发表于 03-30 07:14

    怎么使用RT-Thread文件系统

    使用RT-Thread文件系统
    发表于 03-30 07:26

    正点原子探索者stm32f407 rt-thread文件系统怎么使用?

    正点原子探索者stm32f407 rt-thread文件系统怎么使用?
    发表于 11-25 06:08

    在 SPI Flash上怎样去使用RT-Thread文件系统

    RT-Thread文件系统的主要功能特点有哪些?在SPI Flash上怎样去使用RT-Thread文件系统呢?
    发表于 12-20 08:07

    RT-Thread实现分布式温度监控系统的教程合集

    优化,会大大增强系统性能。本次任务了解 RT-Thread 文件系统,在接收节点中使用文件系统,存放来自发送节点发送过来的数据。上述任务比较单一,只是
    发表于 03-24 11:00

    RT-Thread文件系统的资料下载

    第一次接触 RT-Thread 文件系统的开发者可能觉得 RT-Thread 文件系统过于复杂,不知道该从何入手。想要在项目中使用文件系统
    发表于 03-24 16:03

    如何读取RT-Thread文件系统.txt文本中指定行的数据?

    文件系统中,存放的.txt文本文档,怎么读取指定行的一行数据。存储的数据,每行数据长度不一样长。如图所示的数据,怎么读取指定的一行数据。谢谢
    发表于 04-19 09:52

    怎样去做一个RT-Thread文件系统重构呢

    做个RT-Thread文件系统重构吧,当前的DFS和RT-Thread结合得还不是太紧密:DFS原来是和DOOLOO联系在一起的,同时为了测试方便也做了Win32 & POSIX平台
    发表于 08-10 11:19

    请问一下大佬RT-Thread文件系统能同时读写多个文件吗?

    请问一下大佬RT-Thread文件系统能同时读写多个文件吗?
    发表于 08-11 09:46

    RT-Thread文件系统组件在STM32H743上的应用

    文章目录开发环境RT虚拟文件系统简介基于RT-Studio的配置重写块设备相关代码重写块设备代码的原因生成SDMMC初始化代码在RT中初始化并注册块设备将块设备挂载到
    发表于 12-05 18:36 4次下载
    <b class='flag-5'>RT-Thread</b><b class='flag-5'>文件系统</b>组件在STM32H743上的应用

    RT-Thread文档_虚拟文件系统

    RT-Thread文档_虚拟文件系统
    发表于 02-22 18:42 1次下载
    <b class='flag-5'>RT-Thread</b>文档_虚拟<b class='flag-5'>文件系统</b>

    RT-Thread文档_TMPFS 临时文件系统

    RT-Thread文档_TMPFS 临时文件系统
    发表于 02-22 18:42 0次下载
    <b class='flag-5'>RT-Thread</b>文档_TMPFS 临时<b class='flag-5'>文件系统</b>