芯课堂 | FatFs文件系统的移植及应用指南

news2024/12/23 15:24:31

1、FatFs文件系统简介

FatFs是用于小型嵌入式系统的通用FAT/exFAT文件系统模块。FatFs模块是按照ANSI C(C89)编写的,与磁盘控制层完全分离。因此,它独立于平台和存储设备,具有良好的硬件平台独立性。它可以集成到资源有限的小型微控制器中,如8051、PIC、AVR、ARM、Z80、RX等,支持多种存储设备如 SD 卡、MMC、USB闪存、NAND/NOR 闪存等。FatFs支持 FAT12/16/32 文件系统格式,具有高效、简洁、易于移植的特点。

2、FatFs的主要结构组成

(1) 用户应用层

文件操作API接口函数:如 f_open、f_read、f_write、f_close 等。这些函数用于用户操作文件和目录,如打开、读取、写入和关闭文件等 。

(2) 文件系统层

•文件控制块(FIL):用于表示一个已打开的文件,包含文件的状态、文件的指针、当前位置等信息。

•目录控制块(DIR):用于表示一个已打开的目录,包含目录的结构、当前读取位置等。

•文件系统对象(FATFS):用于表示整个文件系统的状态,包括当前挂载的信息、文件系统类型、扇区大小等。

•文件分配表(FAT):FAT 文件系统核心的数据结构,用于管理文件的簇链,标识文件占用了哪些簇,以及这些簇是否已被分配、空闲或损坏。

(3) 缓存管理层

FatFs 会在 RAM 中保留一个扇区缓冲区,用于加速文件读写操作,将块设备的读写操作优化为扇区大小。

(4) 低级设备抽象层

FatFs 通过硬件抽象层与具体的存储设备交互,即磁盘接口。支持多种存储设备媒介(SD 卡、USB、NAND、NOR Flash)。

·disk_read():从存储设备中读取数据。

·disk_write():向存储设备写入数据。

3、FatFs的移植及使用

(1)FatFs源码下载,FatFs官方网站:http://elm-chan.org/fsw/ff/。

图1 FatFs源码下载网页

如图1所示,通过官网下载到最新的FatFs源码包,源码包解压后得到相关文件如图2所示,文件包含了:存放于documents文件夹的相关使用的帮助文档、存放于source文件夹中的FatFs源代码以及许可证信息,这里我们主要聚焦于源码部分。

(2)FatFs源码移植。

ffsystem.c 通常是一个可选文件,提供了操作系统依赖的函数,这些函数用于动态内存分配和多任务环境中的互斥锁管理(当启用 FF_FS_REENTRANT 配置时),这里我们不启用相关函数功能。因此我们对其余的6个程序模块进行移植,这里以华芯微特UI_Creator上位机swm34s工程为例,如图3所示,针对FAtfs移植来进行相关的讲解。

图3 UI_Creator上位机工程FatFs模块

FatFs主要通过对低级设备抽象层(即diskio.c模块)进行程序修改移植。

在 diskio.c 中,有以下5个函数实现:

•disk_status(): 获取磁盘状态。

•disk_initialize(): 初始化磁盘(通常是 SPI 或 SD 卡的初始化)。

•disk_read(): 从磁盘读取数据。

•disk_write(): 向磁盘写入数据。

•disk_ioctl(): 控制磁盘的操作,比如获取磁盘扇区、块大小、擦除等。

在上位机工程中,我们支持对SD卡及串行闪存盘进行文件系统移植,需添加硬件初始化及磁盘操作的相关头文件(SWM341.h、FlashDisk.h<闪存盘读写擦操作的头文件>),其次是添加设备定义编号,程序如图3编程界面红框所示。

在diskio.c的6个功能函数中,对对应设备部分进行编程或功能函数植入,其中包括:①在disk_status()中实现磁盘设备ID读取检测(闪存设备),实现状态信息返回,如图4所示;

图4

②在disk_initialize()中对相关存储设备硬件IO接口进行初始化,如图5所示;

图5

③在disk_read()、disk_write()中添加对硬件设备相关的读写操作函数接口,如图6所示;

图6

④在disk_ioctl()中可添加需要的磁盘操作功能,如图7所示;

图7

至此,我们基本完成了FatFs文件系统的移植。

(3)FatFs的使用。

移植完FatFs后,需要通过f_mount()函数实现对文件系统的挂载,而后ff.c所提供的标准文件操作接口来实现文件读写。以上位机工程为例,通过在lv_fs_fatfs.c中,将 FatFs 提供的文件系统接口与 LVGL 的文件 I/O 接口关联起来,如图8所示,实现了LVGL从文件系统中加载资源,比如图像、字体、数据文件等。

图8 LVGL(LittlevGL)中使用 FatFs 文件系统

值得一提的是,作为FatFs文件系统的配置文件,ffconf.h允许用户通过修改其程序源码中的宏定义来选择开启或关闭特定的功能、调整文件系统的行为、优化内存资源占用和性能,从而满足嵌入式系统的不同要求。

FatFs的相关移植使用也可参考华芯微特SWM341基础库中的SFC\SFC_FATFS例程,如图9所示。

图9 SWM341基础库SFC\SFC_FATFS例程

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2200985.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

这个问题做项目的时给某些客户普及过,这里再给你普及一下

有些因素不是地理概念&#xff0c;没错&#xff01;但与地理有关&#xff01;可以通过地理位置将他们链接起来&#xff0c;再结合其它业务数据&#xff0c;完成数据分析&#xff01;例如百度地图会将&#xff1a;餐饮、文化、交通、住宿、甚至价格、天气与位置关联分析&#xf…

S7---基本介绍

目录 高通S7和S7 Pro Gen 1声音平台 音频性能的新层次 高通XPAN技术 卓越的听力增强 高通第四代ANC 特征 QualcommS7 Pro Gen 1附加功能 QualcommS7 Pro Gen 1框图 高通S7和S7 Pro Gen 1声音平台 声音被重新想象。QualcommS7声音平台旨在开启一个新的高级音频性能级别。…

Unity转Unreal5之从入门到精通 Spline(样条曲线)组件的使用

前言 Spline 组件 能编辑 样条曲线,定义一条路径,路径上的点可以通过距离起点的长度获取,因此可以实现 物体沿路径连续移动 的效果或者 物体沿路径分布 的效果。 今天我们就来实现一个简单的Spline样条曲线的Demo 实现一个沿路径运动的功能 1.新建一个基于 Actor 的蓝图…

JavaSE——集合1:Collection接口(Iterator和增强for遍历集合)

目录 一、集合框架体系(重要) 二、集合引入 (一)集合的理解与好处 三、Collection接口 (一)Collection接口实现类的特点 (二)Collection接口常用方法 (三)Collection接口遍历元素的方式(Iterator和增强for) 1.使用Iterator(迭代器) 1.1Iterator(迭代器)介绍 1.2Itera…

使用cv::FileStorage对yaml文件进行读写

问题描述&#xff1a;记录使用cv::FileStorage对yaml文件进行读写 参考官网&#xff1a;OpenCV: cv::FileStorage Class Reference WRITE&#xff1a;根据文件路径写文件&#xff0c;如果文件不存在会新建&#xff0c;文件存在则变空白 FileStorage fs(filepath, FileStorag…

新增数据集 SDK、“关系抽取”文本标注、优化模型监控和管理|ModelWhale 版本更新

ModelWhale 带来了新一轮的版本更新&#xff0c;期待为大家带来更优质的使用体验。 本次更新中&#xff0c;ModelWhale 主要进行了以下功能迭代&#xff1a; 数据管理&#xff1a;新增 mw_python_sdk 支持通过查看、下载、制作、更新数据集 文本标注&#xff1a;新增“关系抽取…

【DFDT】DFDT: An End-to-End DeepFake Detection Framework Using Vision Transformer

文章目录 DFDT: An End-to-End DeepFake Detection Framework Using Vision Transformerkey points贡献方法补丁提取和嵌入基于注意力的补丁选择多流transformer块多尺度分类器实验DFDT: An End-to-End DeepFake Detection Framework Using Vision Transformer 会议/期刊:App…

Apache Linkis + OceanBase:如何提升数据分析效率

计算中间件 Apache Linkis 构建了一个计算中间件层&#xff0c;以实现上层应用程序和底层数据引擎之间的连接、治理和编排。目前&#xff0c;已经支持通过数据源的功能&#xff0c;实现用户通过Linkis 对接并使用 OceanBase数据库。 本文详细阐述了在 Apache Linkis v1.3.2中&a…

【虚拟化】内核级虚拟化技术KVM介绍,全/半虚拟化的区别,使用libvirt搭建虚拟化平台(go/java/c++)

【虚拟化】内核级虚拟化技术KVM介绍&#xff0c;全/半虚拟化的区别&#xff0c;使用libvirt搭建虚拟化平台&#xff08;go/java/c&#xff09; 文章目录 1、虚拟化技术分类与架构&#xff08;KVM&#xff0c;Xen&#xff09;&#xff0c;全/半虚拟化的区别2、libvirt介绍3、使用…

【北京迅为】《STM32MP157开发板嵌入式开发指南》-第二十四章 安装 Samba

iTOP-STM32MP157开发板采用ST推出的双核cortex-A7单核cortex-M4异构处理器&#xff0c;既可用Linux、又可以用于STM32单片机开发。开发板采用核心板底板结构&#xff0c;主频650M、1G内存、8G存储&#xff0c;核心板采用工业级板对板连接器&#xff0c;高可靠&#xff0c;牢固耐…

举个栗子!Tableau 技巧(283):用山丘图呈现项目周期

人们常常用爬山来比喻工作中做项目的过程&#xff1a;明确目标、规划路线、团队合作、应对挑战&#xff0c;然后享受登顶并在下山后总结经验教训。 图片来自网络 在 Tableau 中做项目分析时&#xff0c;将一段时期的项目用山丘图来呈现&#xff0c;山丘大小代表项目周期的时间…

RAG(Retrieval-Augmented Generation,检索增强生成)

简介&#xff1a;个人学习分享&#xff0c;如有错误&#xff0c;欢迎批评指正。 RAG&#xff08;Retrieval-Augmented Generation&#xff09;是一种结合信息检索与生成式模型的混合架构&#xff0c;旨在提升自然语言生成任务的准确性、丰富性和知识覆盖范围。它通过在生成过程…

sqli-labs less-20 less-21 less-22 cookie注入

COOKIE 作用&#xff1a;是由网络服务器存储在你电脑硬盘上的一个txt类型的小文件&#xff0c;它和你的网络行为有关&#xff0c;记录了当前用户的状态 形式&#xff1a;keyvalue 例如&#xff1a;当我们登录某个账号后&#xff0c;服务器会在cookies进行记录 个人理解&#xf…

基于Vue3+pinia+vue-router+axios+element-plus等开发的新闻发布管理系统

新闻发布管理系统是一个基于Vue3piniavue-routeraxioselement-plus等开发的系统&#xff0c;主要功能包括&#xff1a;登录模块、注册模块、新闻分类管理模块、新闻管理模块、个人中心模块&#xff08;包括基本资料、更换头像、重置密码功能&#xff09;等。 代码下载&#xf…

指针式表盘指针关键部位分割系统源码&数据集分享

指针式表盘指针关键部位分割系统源码&#xff06;数据集分享 [yolov8-seg-LSKNet&#xff06;yolov8-seg-C2f-EMSC等50全套改进创新点发刊_一键训练教程_Web前端展示] 1.研究背景与意义 项目参考ILSVRC ImageNet Large Scale Visual Recognition Challenge 项目来源AAAI Gl…

MAX模型转为las点云模型

在做一个小项目&#xff0c;探测闯入的野生动物。在做案例&#xff0c;需要用到一些野生动物的点云模型。公开的模型像斯坦福等学术机构&#xff0c;以及Thingiverse、Digital Morphology都没有合适的。但是在一些3d数据库中可以下载到max模型&#xff0c;如图1所示。通过3dmax…

英伟达RTX 5090和RTX 5080

英伟达RTX 5090和RTX 5080 一、英伟达RTX 5090和RTX 5080显卡参数的更为详细的介绍&#xff1a; RTX 5090 显卡参数 GPU核心与架构 核心代号&#xff1a;GB202-300-A1。 架构&#xff1a;Blackwell架构&#xff0c;这是英伟达最新的显卡架构&#xff0c;旨在提供更高的性能…

C++内部类和匿名对象

1.内部类 内部类就是定义在一个类的内部的类&#xff0c;比如 #include<iostream> using namespace std; class AA{ public:class BB {public:void print(const AA& A){cout << A.aa1 << " " << A.aa2 << endl;}private:}; priv…

RabbitMQ初识

目录 Kafka RocketMQ RabbitMQ MQ界面(它使用的端口号5672&#xff0c;界面是15672&#xff09; 如何添加一个虚拟机&#xff0c;点击右侧 Topics&#xff08;通配符模式&#xff09; 发布确认机制 持久性(可靠性保证的机制之一) JDK17,Linux服务器Ubuntu 什么是MQ 实…

recyclerView(kotlin)

recyclerView的优点 使用viewHolderRecycledViewPool的方式复用资源&#xff0c;提高性能利用LayoutManager&#xff0c;可根据不同需求使用不同的布局&#xff0c;且可以方便使用对应布局提供的方法&#xff0c;如快速定位item等。RecyclerView 提供了一个 ItemAnimator 接口…