Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
文件系统
RT-Thread文件系统刨析
发布于 2023-07-16 18:42:45 浏览:1375
订阅该版
[tocm] # 一、概述 本文系统的讲解RT-Thread的文件系统,第二章代码架构从整体把我文件系统的结构,数据自顶向下的处理流程;第三章讲解底层的处理,与传统的直接操作硬件驱动不同,RT-Thread文件系统的底层是通过操作设备实现的;第四章讲解设备虚拟文件系统的注册和匹配,横向加深对dfs层的理解;第五章介绍RT-Thread下文件系统的配置和使用;第六章以一个示例介绍从fal驱动配置到文件系统的挂载的完整流程。 # 二、文件系统的代码架构 rtthread的文件系统依托于fal(flash抽象层),fal为上层提供了统一的操作flash的接口,隔离了不同flash的差异,当需要为rtthread适配不同的flash时,只需要适配好fal即可。从下图可以看到rtthread的文件系统由上向下分为三层:文件系统层、fal层、底层硬件层。 - 文件系统层:文件系统层的代码在components\dfs\src和components\dfs\filesystems,其中,src为文件系统的源码,是文件系统的最顶层,向上为应用提供诸如dfs_mount等文件系统接口,dfs\filesystems为具体的文件系统的实现,每一类实现最后会调用src中的dfs_register向文件系统注册一个实例,即向filesystem_operation_table添加一个实例。 - flash抽象层:文件系统的所有操作都是基于块设备,块设备的一种实现方式是fal,源码中采用的是这种方式,fal设备的定义在components\fal\src\fal_rtt.c,文件系统需要读写flash时操作的是fal的读写接口。 - 底层硬件层:根据fal的移植文档,将具体的flash硬件适配到fal框架,主要向fal提供flash硬件的读写接口。 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230716/42d56d3724e9fe9dd9e0f1ad3a7e301b.png.webp) # 三、文件系统的底层驱动 文件系统dfs的底层是rt_device,对于sd卡设备来说是msd设备,对于使用fal的设备来说是fal_blk设备,文件系统适的配是提供读写存储设备的接口,传统的读写接口是直接的硬件的驱动接口,而rtthread是通过对rt_device设备的读写,再由rt_device驱动具体的硬件设备。为了弄懂文件系统底层的工作过程,需要关注文件系统的dfs_mount,dfs_file_write两个过程。 dfs_mount会根据入参中的设备名称找到rt_device的句柄并打开设备,为后面的dfs_file_write写rt_device做准备,在fatfs的dfs实现中,会在dfs_elm_mount时将rt_device的句柄保存在一个全局的数组disk中,在文件系统的读写接口disk_write中调用rt_device_write通过disk中的句柄实现对rt_device的写操作。 下面说明使用fal_blk设备时文件系统底层的工作过程。 fal_blk设备在fal_rtt.c中,fal_blk_device的定义如下。使用fal_blk时第一步是通过fal_blk_device_create在指定的分区上创建一个fal_blk设备,为文件系统的底层操作创建一个设备。 ```c struct fal_blk_device { struct rt_device parent; struct rt_device_blk_geometry geometry; const struct fal_partition *fal_part; }; ``` 接着可以通过dfs_mount挂载文件系统,在该过程中会通过分区名找到fal_blk_device设备句柄并保存到disk数组,同时通过fal_partition_find获取分区的句柄并保存到fal_blk_device的fal_part,当需要写文件系统(disk_write)时,会调用blk_dev_write,接着调用fal_partition_write对fal_blk_device的fal_part执行写操作。 总结的说,文件系统的读写是通过对rt_device的读写,所以在此之前需要先注册一个rt_device,不同的rt_device有不同的读写方式,如fal_blk设备的读写是通过读写fal_part。 # 四、文件系统的注册和匹配 设备虚拟文件系统的操作集合定义如下,在每一类文件系统注册dfs_register时,会将相应文件系统的名称和操作保存在filesystem_operation_table,在配置使能相应的文件系统后,会自动注册文件系统。dfs_filesystem_ops是具体文件系统的操作集合,不同的文件系统都有自己的一套实现。 ```c /* File system operations */ struct dfs_filesystem_ops { char *name; uint32_t flags; /* flags for file system operations */ /* operations for file */ const struct dfs_file_ops *fops; /* mount and unmount file system */ int (*mount) (struct dfs_filesystem *fs, unsigned long rwflag, const void *data); int (*unmount) (struct dfs_filesystem *fs); /* make a file system */ int (*mkfs) (rt_device_t devid); int (*statfs) (struct dfs_filesystem *fs, struct statfs *buf); int (*unlink) (struct dfs_filesystem *fs, const char *pathname); int (*stat) (struct dfs_filesystem *fs, const char *filename, struct stat *buf); int (*rename) (struct dfs_filesystem *fs, const char *oldpath, const char *newpath); }; ``` 当dfs_mount挂载文件系统时,会根据文件系统的类型名称和filesystem_operation_table中的文件系统操作做匹配,匹配上后会创建文件系统dfs_filesystem并保存到filesystem_table,操作也保存在创建的dfs_filesystem中。 # 五、rtthread支持的文件系统及如何使用 # 六、文件系统示例-从底层fal配置到文件系统挂载
0
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
happycode999
这家伙很懒,什么也没写!
文章
28
回答
6
被采纳
0
关注TA
发私信
相关文章
1
【文件系统】目录查询
2
文件系统Posix 接口 的close API疑问
3
dfs_mount挂载文件系统路径的路径必须为‘/’才能成功
4
SD卡连续读写文件报错
5
文件系统挂载断言机制
6
文件系统是否支持挂载NFS网络文件系统
7
文件系统挂载失败!!!
8
dfs_filesystem_lookup() 返回NULL
9
webnet 是否可以做全动态网页,使用内存池来加快速度
10
“文件系统装在表”报错
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
WIZnet_W5500
UART
ota在线升级
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
rt_mq_消息队列_msg_queue
keil_MDK
ulog
MicroPython
C++_cpp
本月问答贡献
a1012112796
20
个答案
3
次被采纳
张世争
11
个答案
3
次被采纳
踩姑娘的小蘑菇
7
个答案
3
次被采纳
rv666
9
个答案
2
次被采纳
用户名由3_15位
13
个答案
1
次被采纳
本月文章贡献
程序员阿伟
9
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
RTT_逍遥
1
篇文章
6
次点赞
大龄码农
1
篇文章
5
次点赞
ThinkCode
1
篇文章
1
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部