还未设置个性签名
成为VIP会员 享9项特权: 开通会员

完善资料让更多小伙伴认识你,还能领取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/

  • 源码
    +关注

    关注

    3

    文章

    279

    浏览量

    25911
  • API接口
    +关注

    关注

    0

    文章

    33

    浏览量

    9226
  • DFS
    DFS
    +关注

    关注

    0

    文章

    8

    浏览量

    8490
收藏 人收藏

    评论

    相关推荐

    剖析详解React Fiber的架构原理

    一、概述 在 React 16 之前,VirtualDOM 的更新采用的是Stack架构实现的,也就是循环递归方式。不过,这种对比方式有明显...
    发表于 08-11 15:32 416次 阅读

    阿里云IoT软件包API接口说明

    API 说明 ali-iotkit 是 RT-Thread 移植的用于连接阿里云 IoT 平台的软件包。基础 SDK 是阿里提供的  iot...
    发表于 08-11 15:03 438次 阅读

    展示MQTT和OTA应用的数据交互流程

    工作原理 iotkit SDK 为了方便设备上云封装了丰富的连接协议,如 MQTT、CoAP、HTTP、TLS,并且对硬件平台进行...
    发表于 08-11 10:53 262次 阅读

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

    做个RT-Thread文件系统重构吧,当前的DFS和RT-Thread结合得还不是太紧密: DFS原来是和DOOLOO联系在一起的,同...
    发表于 08-10 11:19 765次 阅读

    如何在RK2206开发板上使用鸿蒙LiteOS-M创建一个事件

    实验内容 本例程演示如何在小凌派-RK2206开发板上使用鸿蒙LiteOS-M内核接口,进行事件编程开发。例程创建一个事件,两个任...
    发表于 08-09 15:21 545次 阅读

    分享一下mqttclient的设计与实现方式

    设计思想 整体采用分层式设计,代码实现采用异步设计方式,降低耦合。 消息的处理使用回调的方式处理:用户指定订阅的主题与指...
    发表于 08-09 11:27 462次 阅读

    基于socket API开发一个高性能高稳定性的跨平台MQTT客户端

    mqttclient 一个高性能、高稳定性的跨平台MQTT客户端 一个高性能、高稳定性的跨平台MQTT客户端,基于socket API之上...
    发表于 08-09 11:15 474次 阅读

    如何在RK2206开发板上使用鸿蒙LiteOS-M内核接口进行队列编程开发

    实验内容 本例程演示如何在小凌派-RK2206开发板上使用鸿蒙LiteOS-M内核接口,进行队列编程开发。例程创建一个队列,两个任...
    发表于 08-08 15:17 3116次 阅读

    一文搞懂RT-Robot 协议API

    协议 API (protocol) 机器人 API (robot) 包括智能小车、机械臂、飞行器。 智能小车 API (mobile_robot) 1 车底盘 ...
    发表于 08-08 11:53 732次 阅读

    介绍AT24CXX软件包的基本读写功能

    1 介绍 AT24CXX 软件包提供了 at24cxx 系列 EEPROM 基本功能。介绍该软件包的基本读写功能,以及Finsh/MSH测试命...
    发表于 08-08 11:00 702次 阅读

    红果数字藏品NFTapp系统源码开发

    在大多数人的印象里,演出行业是一个基于线下的传统行业,但在数字藏品这个时髦领域里,演出行业已经开始热....
    的头像 tia8896 发表于 08-02 10:36 124次 阅读

    芯启源05CODIVA可以为DPU用户带来哪些好处

    芯启源产品市场总监曹辉详细介绍了CODIVA平台功能及运行方式,芯启源董事长、CEO卢笙就记者提出的....
    的头像 芯启源 发表于 07-30 09:44 102次 阅读

    分布式软总线实现设备无感发现和高效传输

    分布式软总线是OpenHarmony社区开源的分布式设备通信基座,为设备之间的互通互联提供统一的分布....
    发表于 07-23 16:04 204次 阅读

    什么是CircleIndicator?CircleIndicator的源码实现

    CircleIndicator顾名思义,它指的是圆形指示器。不过在我们OpenHarmony三方组件....
    的头像 OpenAtom OpenHarmony 发表于 07-22 11:01 188次 阅读

    Python 3.11与之前Python 版本差异情况

    Python 3.11.0 正式版本预计于今年 10 月份发布,目前已发布了首个和第二个 Beta ....
    的头像 Linux爱好者 发表于 07-22 10:51 238次 阅读

    leader选举在kubernetes controller中是如何实现的

    在 Kubernetes 的 kube-controller-manager , kube-sche....
    的头像 马哥Linux运维 发表于 07-21 10:03 280次 阅读

    如何在 Petalinux 下定位 decice-tree 错误

      今天邀请到赛灵思专家和大家分享下如何在 Petalinux 下定位 decice-tree 错误....
    的头像 FPGA之家 发表于 07-21 09:16 121次 阅读

    基于eTS的HamronyOS应用开发

    随着HarmonyOS 3.0 Beta版的发布,API Version 8新增了大批JS/eTS ....
    的头像 HarmonyOS开发者 发表于 07-15 09:20 829次 阅读
    基于eTS的HamronyOS应用开发

    时间片调度算法issue详解

    在之前 rt_schedule中need_insert_from_thread的问题 提问中,笔者提....
    的头像 RTThread物联网操作系统 发表于 07-10 13:23 174次 阅读

    control suite如何安装

    今天给大家安利一下了。一般同学会去某度上搜,看到各种各样版本的PID示例,或者去GitHub上白嫖。
    的头像 硬件攻城狮 发表于 07-10 10:24 197次 阅读

    10大算法步骤合集

    DFS 在访问图中某一起始顶点 v 后,由 v 出发,访问它的任一邻接顶点 w1;再从 w1 出发,....
    的头像 硬件攻城狮 发表于 07-08 16:29 285次 阅读

    OpenHarmony多媒体子系统的源码分析

    OpenAtom OpenHarmony(以下简称“OpenHarmony”)作为“开源”世界的“连....
    发表于 07-07 10:16 352次 阅读

    如何提高阅读源码的效率

    另外还需要gcc编译源码生成dumpfile文件,如果想要方便一些,可能还需要自己写脚本实现自动化,....
    的头像 FPGA之家 发表于 07-06 10:01 168次 阅读

    RT-Thread记录(十一、UART设备—源码解析)

    一文带你深入理解 RT-Thread I/O 设备模型 — UART 设备源码分析。
    的头像 矜辰所致 发表于 07-01 11:24 2773次 阅读
    RT-Thread记录(十一、UART设备—源码解析)

    pay-crm-osc刷脸支付系统

    ./oschina_soft/gitee-pay-crm-osc.zip
    发表于 06-29 15:39 28次 阅读
    pay-crm-osc刷脸支付系统

    caozha-tp-comment基于thinkphp的评论系统

    ./oschina_soft/gitee-caozha-tp-comment.zip
    发表于 06-29 15:07 21次 阅读
    caozha-tp-comment基于thinkphp的评论系统

    开源的代码编辑器sourcetrail

    sourcetrail能够十分高效的帮助开发者去探索、熟悉陌生的代码,目前支持 C、C++、Pyth....
    的头像 FPGA之家 发表于 06-29 09:37 275次 阅读

    RK3568JQ Linux_SDK源码包

    iCore-3568JQ板载 RK3568J 四核 64 位工业级处理器,支持 8GB 大内存;支持....
    发表于 06-27 14:23 40次 阅读
    RK3568JQ Linux_SDK源码包

    哈希是什么,常见的哈希算法有哪些

    什么是哈希? 哈希又称作“散列”,是一种数学计算机程序,它接收任何一组任意长度的输入信息,通过哈希算....
    的头像 18125913365 发表于 06-23 14:57 536次 阅读

    SWAlertController2 iOS弹框组件

    ./oschina_soft/gitee-SWAlertController2.zip
    发表于 06-23 09:46 35次 阅读
    SWAlertController2 iOS弹框组件

    quinesnake在源码上玩贪吃蛇

    ./oschina_soft/quinesnake.zip
    发表于 06-22 09:58 27次 阅读
    quinesnake在源码上玩贪吃蛇

    关于Spring的循环依赖问题

      Spring 的循环依赖,源码详细分析 → 真的非要三级缓存吗 中讲到了循环依赖问题
    的头像 Android编程精选 发表于 06-14 17:21 388次 阅读

    @Autowired的使用及源码分析

    目前绝大部分的代码都使用第2、第3种。第1种在bean实例化时完成,而第2、第3种的实现原理都是一样....
    的头像 Android编程精选 发表于 06-14 17:04 368次 阅读

    Glean源码分析引擎

    ./oschina_soft/Glean.zip
    发表于 06-13 11:24 33次 阅读
    Glean源码分析引擎

    MBbs铭飞MBbs论坛源码

    ./oschina_soft/gitee-MCMS.zip
    发表于 06-10 12:00 53次 阅读
    MBbs铭飞MBbs论坛源码

    studygolang Go语言中文网源码

    ./oschina_soft/studygolang.zip
    发表于 06-10 10:07 36次 阅读
    studygolang Go语言中文网源码

    BBX ASP.Net 4.5论坛源码

    ./oschina_soft/BBX.zip
    发表于 06-10 09:47 31次 阅读
    BBX ASP.Net 4.5论坛源码

    robbin_site范凯个人网站源码

    ./oschina_soft/robbin_site.zip
    发表于 06-09 10:22 24次 阅读
    robbin_site范凯个人网站源码

    PerfreeBlog Java博客建站平台

    ./oschina_soft/gitee-PerfreeBlog.zip
    发表于 06-08 09:17 42次 阅读
    PerfreeBlog Java博客建站平台

    负载平衡监控系统设计源码分享

    负载平衡监控系统设计源码分享
    发表于 06-06 11:33 36次 阅读

    OpenHarmony电话子系统的其中的短彩信模块

    Interfaces 对外提供暴露接口,包括 JS 接口定义,napi native C++ 的 J....
    的头像 OpenAtom OpenHarmony 发表于 06-01 10:54 334次 阅读

    Hash哈希竞猜游戏开发方案(源码部署)简介

    Hash,一般翻译做“散列”,也有直接音译为“哈希”的, 哈l8O希2857系8624统 竞猜模式就....
    的头像 a1271916008 发表于 05-31 15:39 640次 阅读

    yunbao-zhibo-web云豹直播APP源码

    ./oschina_soft/gitee-yunbao-zhibo-web.zip
    发表于 05-26 14:50 41次 阅读
    yunbao-zhibo-web云豹直播APP源码

    Laravel-Chat基于Laravel的聊天应用

    ./oschina_soft/gitee-laravel-chat.zip
    发表于 05-26 11:12 44次 阅读
    Laravel-Chat基于Laravel的聊天应用

    CuteMarkEd Markdown编辑器

    ./oschina_soft/CuteMarkEd.zip
    发表于 05-25 10:00 38次 阅读
    CuteMarkEd Markdown编辑器

    EUX文本/源码编辑器

    ./oschina_soft/gitee-EUX.zip
    发表于 05-24 14:22 84次 阅读
    EUX文本/源码编辑器

    linux内核中llist.h文件中的链表宏讲解

    链表宏在linux内核、鸿蒙内核、rtos和一些开源代码中用的非常多。链表宏是双向链表的经典实现方式....
    的头像 小麦大叔 发表于 05-23 12:06 699次 阅读

    基于non-OS和RT-Thread的按键库源码及应用

    核心的按键扫描代码仅有三行,没错,就是经典的 三行按键扫描算法。使用 C 语言标准库 API 编写,....
    的头像 硬件攻城狮 发表于 05-23 09:39 614次 阅读
    基于non-OS和RT-Thread的按键库源码及应用

    NoGit Visual Studio扩展

    ./oschina_soft/nogit.zip
    发表于 05-19 09:55 44次 阅读
    NoGit Visual Studio扩展

    PLC程序源码之三得利啤酒灌装机图纸和程序

    PLC程序源码——上海光明三得利啤酒灌装机图纸和程序(三菱)
    发表于 05-13 14:50 135次 阅读

    中科曙光智算AC3.0平台赋能用户创新发展

    今日,中科曙光独家策划的全新产业对话类栏目《智算Talk》首期正式上线。中国信通院技术与标准研究所互....
    的头像 科技绿洲 发表于 05-11 15:47 606次 阅读

    W806单片机移植LVGL库例程源码下载

    W806单片机移植LVGL库例程源码下载。
    发表于 05-11 15:11 223次 阅读

    W806单片机LCD显示例程源码下载

    W806单片机LCD显示例程源码免费下载。
    发表于 05-11 15:10 173次 阅读

    一文详解Linux内核源码组织结构

    概要:本文内容包含Linux源码树结构分析、Linux Makefile分析、Kconfig文件分析....
    的头像 书生途 发表于 05-10 19:28 3944次 阅读

    openEuler Embedded软实时系统的特性说明

    Preempt_RT 补丁(以下简称 RT 补丁)可直接打在内核源码上,并通过内核配置选项 CONF....
    的头像 openEuler 发表于 05-10 15:22 371次 阅读

    bk-bcs-saas蓝鲸智云容器管理平台SaaS

    ./oschina_soft/gitee-bk-bcs-saas.zip
    发表于 05-10 10:25 53次 阅读
    bk-bcs-saas蓝鲸智云容器管理平台SaaS

    Passopolis密码管理器

    ./oschina_soft/passopolis-server.zip
    发表于 05-09 10:06 28次 阅读
    Passopolis密码管理器

    Microsoft Application Inspector软件特征源码分析器

    ApplicationInspector.zip
    发表于 05-07 10:45 45次 阅读
    Microsoft Application Inspector软件特征源码分析器

    CodeQL扫描源码漏洞

    codeql.zip
    发表于 05-06 11:06 41次 阅读
    CodeQL扫描源码漏洞

    装盒机PLC源码程序

    装盒机PLC源码程序,包括CAD装配图等完整的文件工程。
    发表于 05-05 15:04 127次 阅读