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

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

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CAS机制

Java中提供了很多原子操作类来保证共享变量操作的原子性。这些原子操作的底层原理都是使用了CAS机制。在使用一门技术之前,了解这个技术的底层原理是非常重要的,所以本篇文章就先来讲讲什么是CAS机制,CAS机制存在的一些问题以及在Java中怎么使…

基于thinkphp+vue的大学生校园生活服务平台sb00r

大学生一体化服务平台可以提高大学生综合服务信息管理问题的解决效率,优化大学生综合服务信息处理流程,保证大学生综合服务信息数据的安全,它是一个非常可靠,非常安全的应用程序。 运行环境:phpstudy/wamp/xammp等 开发语言&#…

多款实用个人年终总结模板,助力你的年度汇报!

临近年末,相信很多职场人这阵子都在忙着撰写个人年终总结,这份材料是对自己过去一年的工作进行的回顾和总结。撰写年终总结,其实也是一个非常重要的自我反思过程,可以帮助我们明确自己的目标,找出需要改进的地方&#…

云闪付支付:一种新型的移动支付方式

随着科技的发展,我们的生活方式也在不断地改变。其中,移动支付已经成为我们生活中不可或缺的一部分。而在这个领域中,云闪付支付无疑是一种新型的、高效便捷的支付方式。那么,云闪付支付究竟是什么,它又有哪些特点呢&a…

雄雄的小课堂微信机器人流程图

大家好,我是雄雄,欢迎关注微信公众号:雄雄的小课堂。 最近改造了下微信机器人,新版本还未上线,预计下周一(12.25)左右能上线第一版。 下面是改造之后的流程图 大家可以看看,有疑问可…

大数据求职心得

........................................................................................................................................................... 大数据求职心得 ...................................................................................…

深入理解Linux下的任务管理,守护进程

文章目录 1. 任务管理1.1 进程的基本概念ps 命令字段含义ps auxps axj 1.2 进程组,作业,会话概念解释1. 进程组(Process Group)2. 作业(Job)2.1 jobs命令状态标记 ([], -, ): 在方括号中的数字是作业的编号…

计算机组成原理第4章-(Cache)【下】

高速缓冲存储器 我们首先要搞清楚,为什么要引入高速缓冲存储器呢? 首先,在多体并行存储系统中,I/O设备对于主存的使用权大于CPU对于主存的使用权,这也就造 成了CPU可能在一段时间内不能使用主存,从而浪费…

045.Python包和模块_初识包和模块

我 的 个 人 主 页:👉👉 失心疯的个人主页 👈👈 入 门 教 程 推 荐 :👉👉 Python零基础入门教程合集 👈👈 虚 拟 环 境 搭 建 :👉&…

【工具使用-有道云笔记】如何在有道云笔记中插入目录

一,简介 本文主要介绍如何在有道云笔记中插入目录,方便后续笔记的查看,供参考。 二,具体步骤 分为两个步骤:1,设置标题格式;2,插入标题。非常简单~ 2.1 设置标题格式 鼠标停在标…

解决PyCharm打开出现Cannot load settings from file错误

解决PyCharm打开出现Cannot load settings from file错误 背景 pycharm打开过的项目,关闭项目或者IDE后再次打开,右下角会出现cannot load settings from file,如图1所示。 图1 随后,我浏览许多国内外的论坛,帖子&…

linux中playbook的控制语句

本章主要介绍 playbook中的控制语句。 使用 when 判断语句 block-rescue判断 循环语句 一个play中可以包含多个task,如果不想所有的task全部执行,可以设置只有满足某个 条件才执行这个task,不满足条件则不执行此task。本章主要讲解when 和 …