FATFS文件系统

文件系统是为了存储管理数据,而在存储设备上建立的一种组织结构

Windows常用的文件系统:        

1、FAT12     2、FAT16     3、FAT32       4、exFAT        5、NTFS

FAT:File Alloction Table 文件分配表

        在小型的嵌入式存储设备大多使用的是FAT32和exFAT,使用文件系统前,需先对存储设备进行格式化,擦除原来的数据,在存储设备上建立一个文件分配表和目录。

为什么需要文件系统?

① 直接面对存储设备的底层硬件操作,非专业人士不能适用,普通人无从下手。

② 假如扇区数据中包含多个音频片段,传输后比较难定位对应音频片段位置。

        如果有文件系统,我们可以把数据数组组织成文件,给这些数据起一个名字(文件名),通过这个名字访问到这些数据。文件系统会根据文件名为我们找到数据在磁盘中的位置。

FAT文件系统简介

系统引导扇区:引导程序,以及文件系统信息(扇区字节数/每簇扇区数/保留扇区数等)

文件分配表:记录文件存储中簇与簇之间连接的信息

根目录:存在所有文件和子目录信息(文件名/文件夹名/创建时间/文件大小)

数据区:文件等数据存放地方,占用大部分的磁盘空间

        FAT文件系统用“簇” 作为数据单元,一个“簇”由一组连续的扇区组成,而一个扇区的大小为512字节。所有的簇从2开始进行编号,每个簇都有自己的地址编号,用户文件和数据都存储在簇中。

        FATFS是专门用于小型嵌入式系统的通用FAT/exFAT文件系统模块。标准C语言编写,具有良好的硬件平台独立性,简单修改就可移植到单片机上。FATFS是可裁剪的文件系统

FATFS层次结构图

FATFS文件系统包结构

FATFS文件系统的移植需要修改2个文件,ffconf.hdiskio.c

第三方库的移植,基本上需要用户编写底层驱动源码,然后提供上层配置文件供配置。

FATFS配置

ffconf.h:FATFS关键配置文件              完整介绍 http://elm-chan.org/fsw/ff/doc/config.html

ffconf.h

配置项

配置项说明

设定值

系统配置

FF_FS_TINY

配置使用FATFS为正常模式还是Tiny模式

0

FF_FS_EXFAT

使用或禁用exFAT文件系统(使能exFAT需使能长文件名)

1

功能函数配置

FF_FS_READONLY

使能或禁止与写相关函数,即配置只读

0

FF_USE_MKFS

使能或禁用f_mkfs函数,即是否使能格式化

1

FF_USE_FASTSEEK

使能快速搜索功能,加快f_lseek/read/write函数执行

1

FF_USE_LABEL

使能或禁止支持磁盘盘符读取与设置函数

1

FF_USE_STRFUNC

设置是否支持字符串类操作

1

FF_STRF_ENCODE

设置字符串I/O函数读写文件字符编码

0

命名空间和本地环境配置

FF_CODE_PAGE

设置语言类型,简体中文设置为963 

963

FF_USE_LFN

使能或禁止长文件名,取值范围(0~3),存储地方不同

3

磁盘配置

FF_VOLUMES

设置FATFS支持的逻辑设备数目

3

FF_MAX_SS

设置最大扇区大小

512

diskio.c

需要实现的函数

disk_initialize        初始化磁盘驱动器

disk_status        获取磁盘状态

disk_read        从磁盘驱动器读扇区

disk_write        从磁盘驱动器写扇区

disk_ioctl            控制设备实现指定功能,用于辅助FATFS中其他API

get_fattime         获取当前时间

disk_initialize函数

disk_status函数

disk_read函数

disk_write函数

disk_ioctl函数

get_fattime函数                                                      ffconf.h文件中FF_FS_NORTC宏为0时需要实现

FATFS开放函数(常用)

文 件 操作

f_open        打开/创建一个文件

f_close       关闭一个打开的文件

f_read        从文件中读取数据

f_write       往文件中写数据

f_gets        读一个字符串

f_putc        写一个字符

f_puts        写一个字符串

f_printf       写一个格式化的字符串

f_lseek       移动文件读/写指针

f_tell           获取当前读/写指针

f_size         获取文件大小

目录操作

f_opendif        打开一个目录

f_closedir       关闭一个已经打开的目录

f_readdir        读取目录条目

f_mkdir           创建一个新目录

f_unlink          删除一个文件或目录

f_rename       重命名/移动一个文件或文件夹

卷管理

f_mount      注册/注销一个工作区

f_mkfs        格式化,创建一个文件系统

f_getfree     获取磁盘信息以及空闲簇数量

f_setlabel    设置盘符(磁盘名字)

f_getlabel    获取盘符    

FATFS最简移植步骤

1、前期工作

        准备好一个带有存储设备驱动的工程(SPI实验/SD卡实验) FATFS文件系统开源库

2、复制FATFS文件到工程文件夹下

        具体路径在:Middlewares下

3、将移植文件添加到工程中

        新建分组且添加diskio.c和ff.c,并添加头文件

4、修改ffconf.h的配置项

        FF_FS_NORTC / FF_USE_STRFUNC / FF_CODE_PAGE / FF_VOLUMES

5、修改diskio.c文件5个函数

        disk_initialize/status/read/write/ioctl

6、编写测试代码

        最简读写:f_mount、f_open、f_write、f_read、f_close

FATFS代码解读(正点原子)

        除了FATFS模块已有代码,我们另外在FATFS文件夹下新建了一个exfuns文件夹,用于存放针对FATFS做的扩展代码。

        定义一些全局变量,方便FATFS的使用,实现磁盘容量获取等函数

        重新封装ff.c文件中的操作文件函数,供给USMART调用

        修改ffsystem.c和ff.c部分代码

总结:最后的使用比较少,可以直接查看正点原子的例程来做。做嵌入式则是有一些东西可以借鉴别人的来完目标。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Bwapp学习笔记

1.基本sql语句 #求绝对值 select abs(-1) from dual; #取余数 select mod(10,3); #验证show databases结果是取之于schemata表的 show databases; select schema_name from information_schema.schemata; #查询当前的数据库 select database(); -- 查询数据库版本 s…

Java研学-Servlet 基础

一 概述 1 介绍 Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据,生成动…

【数据结构】什么是树?

🦄个人主页:修修修也 🎏所属专栏:数据结构 ⚙️操作环境:Visual Studio 2022 目录 📌树的定义 📌树的相关概念 📌线性结构与树结构的对比 📌树的抽象数据类型 📌树的存储结构 &#x1f38…

叮咚,微信年度聊天报告(圣诞节版)请查收~丨GitHub star 16.8k+

微信年度聊天报告——圣诞节特别版,快发给心仪的ta吧~ 开源地址 GitHub开源地址:https://github.com/LC044/WeChatMsg 我深信有意义的不是微信,而是隐藏在对话框背后的一个个深刻故事。未来,每个人都能拥有AI的陪伴,…

Docker - 镜像 | 容器 日常开发常用指令 + 演示(一文通关)

目录 Docker 开发常用指令汇总 辅助命令 docker version docker info docker --help 镜像命令 查看镜像信息 下载镜像 搜索镜像 删除镜像 容器命令 查看运行中的容器 运行容器 停止、启动、重启、暂停、恢复容器 杀死容器 删除容器 查看容器日志 进入容器内部…

2024年【北京市安全员-B证】考试题库及北京市安全员-B证模拟试题

题库来源:安全生产模拟考试一点通公众号小程序 2024年【北京市安全员-B证】考试题库及北京市安全员-B证模拟试题,包含北京市安全员-B证考试题库答案和解析及北京市安全员-B证模拟试题练习。安全生产模拟考试一点通结合国家北京市安全员-B证考试最新大纲…

直接插入排序【从0-1学数据结构】

文章目录 💗 直接插入排序Java代码C代码JavaScript代码稳定性时间复杂度空间复杂度 我们先来学习 直接插入排序, 直接排序算是所有排序中最简单的了,代码也非常好实现,尽管直接插入排序很简单,但是我们依旧不可以上来就直接写代码,一定要分析之后才开始写,这样可以提…

手写线程池

手写线程池 线程池原理 线程池的组成主要分为3个部分,这三部分配合工作就可以得到一个完整的线程池: 任务队列,存储需要处理的任务,由工作的线程来处理这些任务 通过线程池提供的API函数,将一个待处理的任务添加到任…

从归并排序引申到排序链表-图解

从归并排序引申到排序链表 文章目录 从归并排序引申到排序链表归并排序递归版非递归版 排序链表递归版非递归版 归并排序 递归版 //合并排序public static void mergeSort(int[] nums) {mergeSortHelper(0, nums.length, nums); //没有-1}private static void mergeSortHelper…

python 使用 pip 安装第三方库 导入不成功

本文是什么意思呢? 就是你需要使用一些库安装老师或者网上说的 通过pip 安装下载了第三方库,但是使用 import xxx from xxx import xx ,pycharm ide 导入的下面还有红色波浪线,导入不成功。 这是什么原因? 这是pyc…

飞天使-k8s知识点5-kubernetes基础名词扫盲

文章目录 deploymentspodNodeserviceskubectl 实现应用伸缩kubectl 实现滚动更新kubernetes架构 deployments 中文文档 http://docs.kubernetes.org.cn/251.htmldeployment是用来创建和更新应用的,master 会负责将创建好的应用实例调度到集群中的各个节点 应用实例…

Qt 开源项目

Qt 开源项目 Omniverse View链接技术介绍 QuickQanava链接技术介绍QField链接技术介绍 AtomicDEX链接技术介绍 Status-desktop链接技术介绍 Librum链接技术介绍 A Simple Cross-Platform ReaderQPrompt链接技术介绍 GCompris链接技术介绍 Scrite链接技术介绍 QSkinny链接技术介…

力扣思维题——寻找重复数

题目链接:https://leetcode.cn/problems/find-the-duplicate-number/description/?envTypestudy-plan-v2&envIdtop-100-liked 这题的思维难度较大。一种是利用双指针法进行计算环的起点,这种方法在面试里很难说清楚,也很难想到。大致做…

银河麒麟v10 二进制安装包 安装mysql 8.35

银河麒麟v10 二进制安装包 安装mysql 8.35 1、卸载mariadb2、下载Mysql安装包3、安装Mysql 8.353.1、安装依赖包3.2、安装Mysql3.3、安装后配置 1、卸载mariadb 由于银河麒麟v10系统默认安装了mariadb 会与Mysql相冲突,因此首先需要卸载系统自带的mariadb 查看系统…

Quartz.NET 事件监听器

1、调度器监听器 调度器本身收到的一些事件通知,接口ISchedulerListener,如作业的添加、删除、停止、挂起等事件通知,调度器的启动、关闭、出错等事件通知,触发器的暂停、挂起等事件通知,接口部分定义如下&#xff1a…

面试题:JVM 对锁都进行了哪些优化?

文章目录 锁优化自旋锁和自适应自旋锁消除锁粗化逃逸分析方法逃逸线程逃逸通过逃逸分析,编译器对代码的优化 锁优化 jvm 在加锁的过程中,会采用自旋、自适应、锁消除、锁粗化等优化手段来提升代码执行效率。 自旋锁和自适应自旋 现在大多的处理器都是…

C++入门-【13-C++ 多维数组】

C 多维数组 C 支持多维数组。多维数组声明的一般形式如下: type name[size1][size2]...[sizeN]; 例如,下面的声明创建了一个三维 5 . 10 . 4 整型数组: int threedim[5][10][4]; 二维数组 多维数组最简单的形式是二维数组。一个二维数组&am…

超维空间S2无人机使用说明书——32、使用yolov7进行目标识别

引言:为了提高yolo识别的质量,提高了yolo的版本,改用yolov7进行物体识别,同时系统兼容了低版本的yolo,包括基于C的yolov3和yolov4,也有更高版本的yolov8。 简介,为了提高识别速度,系…

Android Studio各种Gradle常见报错问题及解决方案

大家好,我是咕噜铁蛋!在开发Android应用程序时,我们可能会遇到各种Gradle错误。这些错误可能来自不同的原因,例如依赖项问题、配置错误、版本冲突等。今天我通过搜索整理了一下,在这篇文章中,我将分享一些常…

AI 绘画StableDiffusionWebui图生图

介绍 stable-diffusion-webui AI绘画工具,本文介绍图生图,以一张图片做底图优化生成。 例如:上传一张真人照片,让AI把他改绘成动漫人物;上传画作线稿,让AI自动上色;上传一张黑白照&#xff0c…