RT-Thread文件系统刨析

一、概述

本文系统的讲解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硬件的读写接口。

在这里插入图片描述

三、文件系统的底层驱动

文件系统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设备,为文件系统的底层操作创建一个设备。

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是具体文件系统的操作集合,不同的文件系统都有自己的一套实现。

/* 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配置到文件系统挂载

6.1 sfud和fal移植

6.2 创建fal块设备

6.3 挂载elm文件系统

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RT-Thread作品秀】基于RT-Thread的姿态解算控制平台设计作者:黄国盛 概述是一个姿态解算算法验证平台以及控制算法验证平台 实现步骤: 使用CubeMax HAL库开发; 使用Python project_generator生成工程; 精简RTT Master内核并加入C++支持; 配置调试接口; 构建C/C++混合编程框架; 硬件IIC驱动GY-86传感器驱动; MATLAB设计IIR Butterworth四阶低通滤波器; 传感器校准; Mahony互补滤波算法 实现姿态解算; 加入mavlink/私有协议、UDP/USB上传数据到PC; 通过MATLAB/STM32验证和比较各种算法; 搭建单轴单桨一维角度控制平台; …… 开发环境硬件: 碳纤管碳纤桨电机座、电机电调电源、ART_Pi、GY86、按键模块、硅胶线…… RT-Thread版本: Master 4.0.3 开发工具及版本: STM32CubeMX 6.0.1、IARforARM8.32.1、BeyondCompare4、MATLAB R2019b、VSCode、SmartGit20.1.5、匿名飞控地面站-0512…… RT-Thread使用情况概述Pin、serial、cplusplus、time、finsh 硬件框架ART_Pi、GY86、按键模块、电调…… 软件框架说明C/C++混合编程,进程和Loop Schedule结合 软件模块说明核心部分:关于GY86的驱动以及姿态解算的Mahony 演示效果演示视频: 比赛感悟4/11/2020Will_Watson 关于AHRS,卡尔曼滤波或互补滤波理解起来 简单但实施难度较大因为很多参数有待测定; 发现各开源项目用的最多的是Mahony算法,关于它的PI部分的本质着实难以理解; 当发现BP神经网络逼近好像可以和卡尔曼滤波一样,就当成滤波器,而且它还可以是一个逼近式的滤波器,免不了一番测试比较; 而后查看Madgwick原文中提到“梯度下降法”,瞬间明白了它的根源和本质; 当学习BP神经网络逼近的时候的思考流程如下: 逼近的需求来源是什么?可能是为了预测系统下一个输出,为了做前馈控制? 预测 ——> 观测器 ——> 逼近式滤波器??? 神经逼近网络的特性有哪些?不具有长时记忆,短时记忆即可以说只具有最近时刻原系统的逼近特性; 尝试检测滤波特性,从这个角度理解逼近网络也是一个不断修正的预估观测器或者说卡尔曼滤波器 从执行流程/滤波效果上 分析一维卡尔曼滤波 和 NNI-BP逼近一维非线性系统的 区别: 卡尔曼滤波流程:先验估计值——>先验估计方差——>依据各方差融合传感器数据做后验估计——>更新后验估计方差; NNI-BP逼近流程: 由网络前状态和新输入直接计算输出——>与原系统输出比较修正网络状态(是为了下一次直接获得预估输出); 注:把原系统输出当成需滤波数据;把神经网络输出当成滤波后数据 卡尔曼滤波没有阶数的概念,而NNI-BP逼近的滤波特性具有一定延迟 卡尔曼滤波器的主要控制参数(基于现实过程噪声和观测噪声)不可控,转移矩阵协方差矩阵需测得; NNI-BP逼近 的主要 控制参数(学习速率和动量因子)可控 即滤波效果可调节,逼近系统特性; 也有一部分“内闭环软拟硬输入输出”思想 当然算法的表现依然可以看起来就是加减乘除那么简单,双重卡尔曼看起来和做起来可能没那么友好;
RT-Thread操作系统资料包是为了方便开发者了解和使用RT-Thread操作系统而提供的一系列资料资源。 首先,RT-Thread操作系统资料包包含了操作系统的详细介绍和架构说明,让开发者能够了解RT-Thread的基本原理和设计思想。这对于初次接触RT-Thread的开发者来说是非常有价值的,可以帮助他们更好地理解操作系统的工作机制。 其次,RT-Thread操作系统资料包还提供了丰富的应用实例和案例分析,这些案例涵盖了不同领域的项目,如嵌入式系统、物联网设备等。这些实例可以帮助开发者更加直观地了解RT-Thread的功能和特性,以及如何在实际项目中使用RT-Thread进行开发。 此外,RT-Thread操作系统资料包还包含了详细的开发文档和API参考手册,这些文档可以为开发者提供操作系统的使用方法和开发技巧。开发者可以根据文档中的指导来进行基于RT-Thread的应用开发,从而提高开发效率和减少开发难度。 最后,RT-Thread操作系统资料包还提供了相关的开发工具和驱动程序,这些工具和驱动可以帮助开发者更好地进行开发和调试工作。开发者可以通过这些工具和驱动来实现硬件与操作系统的有效交互,加快项目的开发进度。 总的来说,RT-Thread操作系统资料包是一套全面而实用的开发资源,可以帮助开发者更好地理解和使用RT-Thread操作系统,提高开发效率和项目的成功率。无论是新手还是有经验的开发者,都能从中获得帮助和指导。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值