FATFS文件系统

news2025/1/23 9:10:13

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

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部分代码

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

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

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

相关文章

大模型托管平台Replicate,获2.9元B轮融资

大模型开源平台Replicate在官网宣布,获得4000万美元(近2.9亿元)B轮融资。本次由a16z领投,英伟达、Y Combinator等跟投。 Replicate的开源平台提供了超过25,000个模型,涵盖文本、图片、视频、音频、3D模型等领域。典型…

60.乐理基础-打拍子-V字打拍法

前置内容: 文字版 https://note.youdao.com/s/6FSSvGBf (顺序参考:下方的视频版里面目录顺序) 视频版 【四川音乐学院作曲硕士】教你零基础自学乐理保姆级教学-学习视频教程-腾讯课堂 文字版还有下图红框中三个专栏里的内容&a…

freemarkEngine文件ftl的可视化编辑

在做导出word文件功能时,需要准备ftl模板,设置一些通配符,之后通过相关编码,即可以实现业务数据渲染后导出word的功能。但是ftl文件一般我们看不太懂,所以可视化创建和修改就非常合适。 1、安装office2016版本&#x…

【Linux】权限篇(二)

权限目录 1. 前言2. 权限2.1 修改权限2.2 有无权限的对比2.3 另外一个修改权限的方法2.3.1 更改用户角色2.3.2 修改文件权限属性 3. 第一个属性列4. 目录权限5. 默认权限 1. 前言 在之前的一篇博客中分享了关于权限的一些知识,这次紧接上次的进行,有需要…

中国数字化进程简史(1980-2022)之二基础网络雏形

20世纪80年代数字化政策扶持信息化技术基础研究,一大批科研成果在90年代开始市场转化,随着中国大陆向外向型经济转型,1993年3月12日朱镕基副总理主持会议部署建设国家公用经济信息网为起点,拉开了一系列“金”字号工程规划建设的序…

LLM漫谈(一)| LLM可以取代数据分析师吗?

我想,在过去的一年里,我们每个人都不止一次想知道ChatGPT是否(或者更确切地说,何时)能够取代你的工作。 我们有一个共识,即Generative AI最近的突破将极大地影响我们每个人生活和工作。然而,我们…

使用OpenCV4实现工业缺陷检测的六种方法

目录 1 机器视觉2 缺陷检测3 工业上常见缺陷检测方法 1 机器视觉 机器视觉是使用各种工业相机,结合传感器跟电气信号实现替代传统人工,完成对象识别、计数、测量、缺陷检测、引导定位与抓取等任务。其中工业品的缺陷检测极大的依赖人工完成,…

DPDK单步跟踪(3)-如何利用visual studio 2019和visual gdb来单步调试dpdk

准备工作 因为时间的关系,我想到哪说到哪,可能没那么高的完成度。 但其实有心的人,看到这个标题,就关了本文自己能做了。 why和how to build debug version DPDK,见前两篇。这里我们准备开始。 首先,你有一台linux机…

【游戏篇】Scratch之饥饿的鱼

【作品展示】饥饿的鱼 操作:点击小绿旗,按下键盘方向或者利用鼠标移动,躲避大鱼的同时还要想办法吃到小鱼。

SecureCRT连接vmware虚拟机的centos系统配置

软件版本:VMware10.0.3,centos 7,securecrt 8.7.2 1,虚拟网络编辑器选择桥接模式, 2,如果不小心删除网络,centos关机状态下,选择恢复默认设置。 3,进入linux系统&#…

DRF之引入

目录 一、web应用模式 【1】前后端混合开发 【2】前后端分离 二、API接口 三、接口测试工具:Postman 四、RESTful API规范 【1】什么是RESTful 【2】RESTful API的规范 2.1 数据的安全保障 2.2 接口特征表现 2.3 多数据版本共存 2.4 数据即是资源&#…

助力硬件测试工程师之EMC项目测试。

1:更新该系列的目的 接下来的一个月内,将更新硬件测试工程师的其中测试项目--EMC项目,后续将会出安规等项目,助力测试工程师的学习。 2:如何高效率的展现项目的基础以及一些细节知识点 通过思维导图以及标准的规定进行…

【ubuntu 22.04】安装中文版系统、中文语言包和中文输入法

在系统安装中的键盘布局选择时,选择Chinese - Chinese,此时会自动安装所有的中文语言包和ibus中文输入法系统安装成功重启后,点击设置 - 区域和语言 - 管理已安装的语言 * 根据提示安装更新后,将汉语(中国)…

蚂蚁集团5大开源项目获开放原子 “2023快速成长开源项目”

12月16日,在开放原子开源基金会主办的“2023开放原子开发者大会”上,蚂蚁集团主导开源的图数据库TuGraph、时序数据库CeresDB、隐私计算框架隐语SecretFlow、前端框架OpenSumi、数据域大模型开源框架DB-GPT入选“2023快速成长开源项目”。 (图…

simulink代码生成(一)——环境搭建

一、安装C2000的嵌入式环境; 点击matlab附加功能, 然后搜索C2000,安装嵌入式硬件支持包;点击安装即可;(目前还不知道破解版的怎么操作,目前我用的是正版的这样,完全破解的可能操作…

LeetCode刷题--- 目标和

个人主页:元清加油_【C】,【C语言】,【数据结构与算法】-CSDN博客 个人专栏 力扣递归算法题 http://t.csdnimg.cn/yUl2I 【C】 http://t.csdnimg.cn/6AbpV 数据结构与算法 http://t.csdnimg.cn/hKh2l 前言:这个专栏主要讲述递归递归、搜…

常用单片机认识

单片机有哪些类型: 51单片机 AVR 单片机 MSP430 STM8 STM32 DSP Linux FPGA

pip : 无法将“pip”项识别为 cmdlet、函数、脚本文件或可运行程序的名称及pip安装

问题原因 通常出现这种情况是因为cmd(终端)无法识别pip指令,环境变量中缺失pip程序路径,因此需要手动将pip所在路径添加到环境变量 确保环境中包含pip 通常情况下,配置的环境中都会默认包含pip,本文采用…

STM32的以太网外设+PHY(LAN8720)使用详解(6):以太网数据接收及发送

0 工具准备 1.野火 stm32f407霸天虎开发板 2.LAN8720数据手册 3.STM32F4xx中文参考手册1 以太网数据接收及发送 1.1 以太网数据接收(轮询) 1.1.1 检查是否接收到一帧完整报文 使用轮询的方式接收以太网数据是一种简单但是效率低下的方法,…

(十七)Flask之大型项目目录结构示例【二扣蓝图】

大型项目目录结构: 问题引入: 在上篇文章讲蓝图的时候我给了一个demo项目,其中templates和static都各自只有一个,这就意味着所有app的模板和静态文件都放在了一起,如果项目比较大的话,这就非常乱&#xf…