FATFS深入理解
fatfs文件系统函数

fatfs文件系统函数FatFs 文件系统函数详解导语:FatFs 是一个跨平台、开源的文件系统实现,广泛应用于嵌入式设备。
本文将详细介绍 FatFs 文件系统函数的使用方法和实现原理。
第一节:FatFs 是什么?1.1 背景介绍嵌入式设备通常需要一个文件系统来管理储存和访问数据,而 FatFs 就是一个能够在 flash、SD 卡等储存介质上运行的文件系统实现。
1.2 FatFs 的功能FatFs 提供了一系列的文件系统函数,包括文件的创建、删除、读取、写入,目录的创建、删除、改名等。
同时,FatFs 还提供了簇管理、簇链、簇链索引的功能,以及对文件系统的格式化、检查、优化等操作。
第二节:FatFs 的使用方法2.1 环境配置在开始使用 FatFs 之前,首先要配置开发环境。
基本的配置包括硬件平台的选择和文件系统的选择。
FatFs 支持多种平台,如ARM、AVR、PIC、STM32等,并且支持多种文件系统类型,如FAT12、FAT16、FAT32等。
2.2 创建文件系统对象在使用 FatFs 的文件系统函数之前,需要先创建一个文件系统对象,并为其指定一个驱动器号。
驱动器号可以认为是一个逻辑卷,可以是实体存储介质上的一个分区或一个逻辑卷。
2.3 挂载文件系统在文件系统对象创建之后,需要通过调用 f_mount 函数来将文件系统对象挂载到系统中。
挂载文件系统的过程中,需要指定文件系统类型、逻辑卷号等参数。
2.4 文件的创建、打开和关闭通过使用文件系统函数可以创建、打开和关闭文件。
使用 f_open 函数可以创建一个新文件或打开一个已有的文件,指定打开的方式(读、写、追加等)和文件名。
使用 f_close 函数可以关闭一个已打开的文件。
2.5 文件的读取和写入文件系统函数提供了对文件的读取和写入操作。
通过 f_read 函数可以从文件中读取数据,指定读取的缓冲区和读取的大小。
通过 f_write 函数可以向文件中写入数据,指定写入的缓冲区和写入的大小。
fatfs 读写模式解析

fatfs 读写模式解析摘要:1.FATFS 简介2.FATFS 的读写模式3.FATFS 读写模式的解析4.FATFS 读写模式的应用正文:【1.FATFS 简介】FATFS,全称File Allocation Table File System,是一种适用于嵌入式系统的文件系统。
它主要用于管理闪存存储设备上的文件和数据,为开发者提供了简单易用的文件操作接口。
FATFS 文件系统是基于FAT(File Allocation Table)文件分配表的,具有较好的容错性和可靠性。
【2.FATFS 的读写模式】FATFS 的读写模式主要包括两种:顺序读写和随机读写。
(1)顺序读写:顺序读写是一种按照文件的物理存储顺序进行读写的方式。
这种读写模式适用于对数据顺序要求较高的场景,如音频、视频播放等。
(2)随机读写:随机读写是一种根据文件的逻辑地址进行读写的方式。
这种读写模式允许开发者直接定位到文件的某个位置进行读写,提高了数据访问的效率。
【3.FATFS 读写模式的解析】(1)顺序读写模式的解析:在顺序读写模式下,FATFS 会按照文件的物理存储顺序进行读写操作。
这种模式的优点在于顺序读写时,闪存设备的写入性能较高,且不容易产生碎片。
缺点是读写效率受到物理存储顺序的限制,可能会降低数据访问速度。
(2)随机读写模式的解析:在随机读写模式下,FATFS 会根据文件的逻辑地址进行读写操作。
这种模式的优点在于可以提高数据访问速度,尤其是在随机访问频繁的场景下。
缺点是可能会导致闪存设备产生碎片,降低写入性能。
【4.FATFS 读写模式的应用】FATFS 的读写模式在嵌入式系统中具有广泛的应用。
根据不同的应用场景,开发者可以选择合适的读写模式以满足性能和存储需求的平衡。
fatfs 详解

fatfs 详解摘要:I.什么是FATFS?A.FATFS 的定义B.FATFS 的作用II.FATFS 的历史A.FATFS 的起源B.FATFS 的发展历程III.FATFS 的文件系统结构A.FATFS 的目录结构B.FATFS 的文件分配表IV.FATFS 的操作A.FATFS 的文件操作1.打开文件2.读取文件3.写入文件4.关闭文件B.FATFS 的目录操作1.打开目录2.读取目录3.创建目录4.删除目录5.改变目录C.FATFS 的磁盘操作1.格式化磁盘2.挂载磁盘3.卸载磁盘V.FATFS 的应用A.FATFS 在嵌入式系统中的应用B.FATFS 在移动设备中的应用C.FATFS 在其他领域的应用正文:FATFS(File Allocation Table File System,文件分配表文件系统) 是一种通用的文件系统,被广泛应用于嵌入式系统、移动设备等领域。
FATFS 具有良好的可移植性和兼容性,支持大容量存储设备,并且具有高效的数据管理能力。
本文将对FATFS 进行详细的介绍和解析。
FATFS 最早由Microsoft 公司于1977 年开发,用于MS-DOS 操作系统中。
随着技术的发展,FATFS 不断地得到改进和完善,现在已经成为了一个功能强大、稳定性高、可移植性好的文件系统。
FATFS 的作用是将磁盘分成多个逻辑块,并为每个逻辑块分配唯一的标识符,以便对磁盘中的数据进行高效的管理和访问。
FATFS 的文件系统结构包括目录结构、文件分配表等。
其中,目录结构用于存储文件的元数据,如文件名、大小、创建时间等;文件分配表则用于记录磁盘中的空闲块和已分配块的位置,以便进行磁盘空间的分配和管理。
FATFS 支持多种操作,包括文件操作、目录操作和磁盘操作。
文件操作包括打开文件、读取文件、写入文件和关闭文件等;目录操作包括打开目录、读取目录、创建目录、删除目录和改变目录等;磁盘操作包括格式化磁盘、挂载磁盘和卸载磁盘等。
FATFS文件系解释

• 以写模式打开一个只读文件。
FR_INT_ERR 由于一个错误的 FAT 结构或一个内部错误,而
• 由于存在一个同名的只读文件或目录,而导致文件 导致该函数失败。
无法被创建。
FR_NOT_ENABLED 逻辑驱动器没有工作区。
FR_NO_FILESYSTEM 磁盘上没有有效地 FAT 卷。
4
描述
应用程序接口
FatFs 模块为应用程序提供了下列函数,这些函数描述了 FatFs 能对 FAT 卷执行哪些操作。
f_mount
在 FatFs 模块上注册/注销一个工作区(文件系统对象)
FRESULT f_mount (
BYTE Drive,
/* 逻辑驱动器号 */
FATFS* FileSystemObject /* 工作区指针 */
DWORD last_clust;
/* 最后一个被分配的簇*/
DWORD free_clust;
/* 空闲簇数目*/
DWORD fsi_sector;
/* 存放 fsinfo 的扇区(用于 FAT32) */
#endif
#if _FS_RPATH
DWORD cdir; /* 允许相对路径时用,存储当前目录起始簇(0:root)*/
typedef struct {
BYTE fs_type; /* FAT 子类型,一般在 mount 时用,置 0 表示未挂载*/
BYTE drv; /* 物理驱动器号,一般为 0*/
BYTE csize; /*每个簇的扇区数目(1,2,4...128) */
BYTE n_fats; /* 文件分配表的数目(1,2) ,FAT 文件系统依次为:引导扇区、两个文件分配表、
FATFS深入理解

FATFS深⼊理解⼀、通过格式化命令-看磁盘⽂件系统的建⽴过程1、添加format命令,单步调试所有的底层驱动函数都已经准备好。
添加格式化命令format后,编译下载。
Format命令的执⾏主要是调⽤f_mkfs()函数,下⾯进⾏单步调试。
以下主要列出函数的主要执⾏步骤:res=f_mkfs( 0, 1, 4096 ); //1表⽰不需要引导扇区。
4096是8个扇区。
进⼊f_mkfs()函数,这⾥只列出主要执⾏步骤:if (disk_ioctl(drv, GET_SECTOR_COUNT, &n_part) != RES_OK || n_part < MIN_SECTOR)return FR_MKFS_ABORTED;这个函数调⽤后,n_part=0x000F,3400 = 996 352,这是SD的总块数。
allocsize /= SS(fs); 等于8/*Number of sectors per cluster */n_clst = n_part / allocsize; //等于0x1E680 = 124 544 簇。
if (n_clst >= 0xFFF5) fmt = FS_FAT32; 所以⽂件系统确定为FAT32类型。
n_fat = ((n_clst * 4) + 8 + SS(fs) - 1) / SS(fs); 等于0x3CE = 974,表⽰FAT要占据974个扇区。
n_rsv = 33 - partition; 保留扇区32个。
n_dir = 0;b_fat = b_part + n_rsv; /* FATs start sector 32扇区*/b_dir = b_fat + n_fat * N_FATS; /* Directory start sector 0x3EE =1006,由于FAT表个数设为1个,所以⽬录区=FAT起始+FAT 占⽤扇区数*/b_data = b_dir + n_dir; /* Data start sector */以上三项确定FAT区域、根⽬录区、数据区的起始扇区。
fatfs 详解

fatfs 详解(实用版)目录1.FATFS 简介2.FATFS 的特点3.FATFS 的文件系统4.FATFS 的应用领域5.FATFS 的未来发展正文【1.FATFS 简介】FATFS,全称 File Allocation Table File System,是一种基于文件分配表的文件系统,主要用于管理闪存设备上的文件和数据。
FATFS 起源于 DOS 时代,由微软公司开发,后来逐渐被广泛应用于各种嵌入式系统和物联网设备中。
【2.FATFS 的特点】FATFS 具有以下特点:1) 文件分配表:FATFS 通过文件分配表来管理文件的分配和释放,使得文件管理更加灵活和高效。
2) 适用于闪存设备:FATFS 主要针对闪存设备进行优化,具有较好的性能和稳定性。
3) 支持多种存储介质:FATFS 支持多种存储介质,如闪存、硬盘、软盘等。
4) 兼容性:FATFS 具有良好的兼容性,可兼容多种操作系统和设备。
【3.FATFS 的文件系统】FATFS 的文件系统主要包括以下几个部分:1) 文件分配表:用于记录文件的分配情况,包括文件的起始簇号、文件长度等信息。
2) 簇:FATFS 将闪存设备划分为多个簇,每个簇可容纳多个文件。
3) 根目录:FATFS 的根目录包含所有文件和子目录的入口。
4) 短文件名:FATFS 支持短文件名,使得文件查找更加方便。
【4.FATFS 的应用领域】FATFS 广泛应用于各种嵌入式系统和物联网设备中,如:1) 智能家居:FATFS 可用于管理智能家居设备中的文件和数据。
2) 工业控制:FATFS 可用于工业控制设备中的数据存储和管理。
3) 消费电子:FATFS 可用于各种消费电子产品中的文件管理。
【5.FATFS 的未来发展】随着物联网和嵌入式系统的快速发展,FATFS 将继续保持其在闪存设备文件管理领域的优势。
同时,FATFS 也在不断进行技术创新和升级,以适应新时期的市场需求。
fatfs 读写模式解析

fatfs 读写模式解析摘要:1.FATFS 文件系统概述2.FATFS 文件系统的读写模式3.FATFS 文件系统的优缺点正文:【FATFS 文件系统概述】FATFS(File Allocation Table File System) 是一种常见的文件系统,常用于存储设备中,例如硬盘、U 盘、SD 卡等。
FATFS 文件系统采用表格方式来存储文件的分配表,从而实现对文件的读写管理。
FATFS 文件系统支持多种设备,并且具有较好的兼容性,因此被广泛使用。
【FATFS 文件系统的读写模式】FATFS 文件系统的读写模式分为三种:只读模式、读写模式和写保护模式。
1.只读模式:在只读模式下,用户只能读取文件,不能修改文件。
该模式通常用于只读设备,例如CD-ROM、DVD-ROM 等。
2.读写模式:在读写模式下,用户既可以读取文件,也可以修改文件。
该模式通常用于可读写设备,例如硬盘、U 盘、SD 卡等。
3.写保护模式:在写保护模式下,用户只能读取文件,不能修改文件。
该模式通常用于防止数据被误删除或修改的场景,例如某些设备的启动盘等。
【FATFS 文件系统的优缺点】FATFS 文件系统的优点包括:1.兼容性好:FATFS 文件系统可以支持多种设备,并且具有较好的兼容性,可以实现不同设备之间的数据共享。
2.稳定性好:FATFS 文件系统采用表格方式来存储文件的分配表,从而实现对文件的读写管理,具有较好的稳定性。
3.支持大容量存储:FATFS 文件系统支持大容量存储,可以满足不同设备的存储需求。
FATFS 文件系统的缺点包括:1.存储效率低:FATFS 文件系统采用表格方式来存储文件的分配表,导致存储效率较低。
2.安全性差:FATFS 文件系统采用明文方式来存储文件名和数据,容易导致数据泄露和安全问题。
3.不支持高级功能:FATFS 文件系统不支持高级功能,例如文件加密、压缩等。
【结论】FATFS 文件系统是一种常见的文件系统,采用表格方式来存储文件的分配表,实现对文件的读写管理。
fatfs 读写模式解析

fatfs 读写模式解析摘要:1.FATFS 简介2.FATFS 读模式解析3.FATFS 写模式解析4.FATFS 的应用场景正文:【1.FATFS 简介】FATFS(File Allocation Table File System)是一种适用于嵌入式系统的文件系统,主要用于管理闪存或其他非易失性存储设备上的文件。
FATFS 具有易于实现、可靠性高、兼容性好等特点,因此在嵌入式系统中得到了广泛应用。
【2.FATFS 读模式解析】FATFS 的读模式主要包括以下几种:(1)FATFS_RDONLY:只读模式,用于读取已经存在的文件。
在此模式下,用户只能读取文件的内容,而不能修改文件。
该模式适用于只需要读取文件内容的应用场景。
(2)FATFS_READWRITE:读写模式,用于读取和写入文件。
在此模式下,用户既可以读取文件内容,也可以修改文件。
该模式适用于需要对文件进行读写操作的应用场景。
(3)FATFS_WRITE:只写模式,用于向文件中写入数据。
在此模式下,用户只能向文件中写入数据,而不能读取文件内容。
该模式适用于只需要向文件中写入数据的应用场景。
【3.FATFS 写模式解析】FATFS 的写模式主要包括以下几种:(1)FATFS_CREATE:创建文件模式,用于在FATFS 文件系统中创建新文件。
在此模式下,用户可以指定文件名、文件大小等信息,然后写入文件内容。
(2)FATFS_APPEND:追加文件模式,用于在文件末尾追加数据。
在此模式下,用户可以向文件中追加数据,而不会覆盖文件中原有的内容。
(3)FATFS_WRITE:覆盖文件模式,用于覆盖文件中原有的内容。
在此模式下,用户可以修改文件的内容,但需要注意与只写模式的区别。
【4.FATFS 的应用场景】FATFS 在嵌入式系统中有广泛的应用,例如:(1)存储系统配置信息:FATFS 可用于存储系统的配置信息,如IP 地址、端口号等,方便系统启动时读取配置信息。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、通过格式化命令-看磁盘文件系统的建立过程1、添加format命令,单步调试所有的底层驱动函数都已经准备好。
添加格式化命令format后,编译下载。
Format命令的执行主要是调用f_mkfs()函数,下面进行单步调试。
以下主要列出函数的主要执行步骤:res=f_mkfs( 0, 1, 4096 ); //1表示不需要引导扇区。
4096是8个扇区。
进入f_mkfs()函数,这里只列出主要执行步骤:if (disk_ioctl(drv, GET_SECTOR_COUNT, &n_part) != RES_OK || n_part < MIN_SECTOR)return FR_MKFS_ABORTED;这个函数调用后,n_part=0x000F,3400 = 996 352,这是SD的总块数。
allocsize /= SS(fs); 等于8/*Number of sectors per cluster */n_clst = n_part / allocsize; //等于0x1E680 = 124 544 簇。
if (n_clst >= 0xFFF5) fmt = FS_FAT32; 所以文件系统确定为FAT32类型。
n_fat = ((n_clst * 4) + 8 + SS(fs) - 1) / SS(fs); 等于0x3CE = 974,表示FAT要占据974个扇区。
n_rsv = 33 - partition; 保留扇区32个。
n_dir = 0;b_fat = b_part + n_rsv; /* FATs start sector 32扇区*/b_dir = b_fat + n_fat * N_FATS; /* Directory start sector 0x3EE =1006,由于FAT表个数设为1个,所以目录区=FAT起始+FAT占用扇区数*/b_data = b_dir + n_dir; /* Data start sector */以上三项确定FAT区域、根目录区、数据区的起始扇区。
disk_ioctl(drv, GET_BLOCK_SIZE, &n) != RES_OK,这个函数调用没有正确返回可擦出扇区的总数。
接下来程序会出错,因此退出,修改disk_ioctl()函数后,再次分析。
把这个函数返回值直接改为32。
并且把FAT表的个数定义为2.N_FATS改为2后,根目录区、数据区的起始扇区的起始扇区变为0x7BC=1980扇区。
继续往下执行。
n = (b_data + n - 1) & ~(n - 1);n_fat += (n - b_data) / N_FATS;这两句话对fat所占扇区数进行了修正,保证擦除时,以32个扇区为一个单位。
n_clst = (n_part - n_rsv - n_fat * N_FATS - n_dir) / allocsize; =0x1E588。
tbl = fs->win; /* Clear buffer */mem_set(tbl, 0, SS(fs)); 清零文件系统缓冲区。
mem_set(tbl, 0, SS(fs));ST_DWORD(tbl+BS_jmpBoot, 0x90FEEB); /* Boot code (jmp $, nop) */ST_WORD(tbl+BPB_BytsPerSec, SS(fs)); /* Sector size */tbl[BPB_SecPerClus] = (BYTE)allocsize; /* Sectors per cluster */ST_WORD(tbl+BPB_RsvdSecCnt, n_rsv); /* Reserved sectors */上面的工作主要是填充引导扇区缓冲区,也就是常说的DBR扇区缓冲,等所有的参数写好,就可以写回磁盘。
ST_WORD(tbl+BS_55AA, 0xAA55); /* Signature */if (disk_write(drv, tbl, b_part+0, 1) != RES_OK)return FR_DISK_ERR; //这就是在写有效引导标志sec[510]=0x55, sec[511]=0xAA。
if (fmt == FS_FAT32)disk_write(drv, tbl, b_part+6, 1); //FAT32在第六扇区有个备份引导扇区。
for (m = 0; m < N_FATS; m++) {mem_set(tbl, 0, SS(fs)); /* 1st sector of the FAT */if (fmt != FS_FAT32) {n = (fmt == FS_FAT12) ? 0x00FFFF00 : 0xFFFFFF00;n |= partition;ST_DWORD(tbl, n); /* Reserve cluster #0-1 (FAT12/16) */} else {ST_DWORD(tbl+0, 0xFFFFFFF8); /* Reserve cluster #0-1 (FAT32) */ST_DWORD(tbl+4, 0xFFFFFFFF);ST_DWORD(tbl+8, 0x0FFFFFFF);/* Reserve cluster #2 for root dir */ } //簇0和簇1保留,簇2分配给根目录区。
if (disk_write(drv, tbl, b_fat++, 1) != RES_OK)return FR_DISK_ERR;mem_set(tbl, 0, SS(fs)); /* Following FAT entries are filled by zero */ //接下来所有的扇区都清0,表示该簇未被占用。
for (n = 1; n < n_fat; n++) {if (disk_write(drv, tbl, b_fat++, 1) != RES_OK)return FR_DISK_ERR;} //第一次是写从0x21扇区开始,总共0x3CF个扇区(第一个扇区已经写了)。
第二次开始时是备份引导扇区,0x20+0x3D0=0x3F0。
同理,第一扇区与0x21扇区相同,后面都清零。
Format命令要执行较长的时间,主要就是FAT表接近2000个扇区要清零。
m = (BYTE)((fmt == FS_FAT32) ? allocsize : n_dir); m=8,每簇8扇区。
do {if (disk_write(drv, tbl, b_fat++, 1) != RES_OK)return FR_DISK_ERR;} while (--m); //以上部分是将根目录区的8个扇区清零,表示目录项未被占用。
if (fmt == FS_FAT32) {ST_WORD(tbl+BS_55AA, 0xAA55);ST_DWORD(tbl+FSI_LeadSig, 0x41615252);ST_DWORD(tbl+FSI_StrucSig, 0x61417272);ST_DWORD(tbl+FSI_Free_Count, n_clst - 1); //根目录区已经用掉了一簇。
ST_DWORD(tbl+FSI_Nxt_Free, 0xFFFFFFFF);disk_write(drv, tbl, b_part+1, 1); //分别写入1号和7号扇区。
disk_write(drv, tbl, b_part+7, 1);} //这是写FAT32文件系统的FSI扇区,包括空闲簇总数和上次分配的簇号。
FAT32文件系统的格式化到此完成。
2、再以Fdisk的方式格式化一次,这时候格式系统要写MBR扇区,FAT引导扇区不在0号扇区了。
同时MBR要建立分区表,以找到DBR引导扇区。
其过程与上述差不多,只是多执行了以下代码,详细过程就不叙述了。
if (!partition) {DWORD n_disk = b_part + n_part;mem_set(fs->win, 0, SS(fs));tbl = fs->win+MBR_Table; //分区表从0x1BE开始。
ST_DWORD(tbl, 0x00010180); /*Partition start in CHS */ Table[0x1BE] =0x80,表明该分区是活动扇区。
00表示开始柱面,01、01表示开始扇区、开始磁头。
if (n_disk < 63UL * 255 * 1024) { /* Partition end in CHS */n_disk = n_disk / 63 / 255;tbl[7] = (BYTE)n_disk; //表示结束的柱面。
tbl[6] = (BYTE)((n_disk >> 2) | 63); //结束的扇区。
} else {ST_WORD(&tbl[6], 0xFFFF); //}tbl[5] = 254; //结束的磁头。
if (fmt != FS_FAT32) /* System ID */tbl[4] = (n_part < 0x10000) ? 0x04 : 0x06;elsetbl[4] = 0x0c; // 表示该分区类型为win95 FAT32ST_DWORD(tbl+8, 63); /*起始扇区0x3F in LBA */ST_DWORD(tbl+12, n_part); /*分区的大小,总扇区数减去MBR及其占据的一个柱面。
*/ST_WORD(tbl+64, 0xAA55); /* Signature */if (disk_write(drv, fs->win, 0, 1) != RES_OK)return FR_DISK_ERR;partition = 0xF8; //MBR标志。
} else {partition = 0xF0;}3、观察在有MBR区域的情况下,如何检查文件系统fmt = check_fs(fs, bsect = 0); /*检查0扇区的时候,没有发现FAT文件系统扇区,但是有0x55 0xAA标志,说明这是有效磁盘,但是返回1. */if (fmt == 1) { /* 表明可能存在分区*//* Check a partition listed in top of the partition table */tbl = &fs->win[MBR_Table + LD2PT(vol) * 16]; /* Partition table */if (tbl[4]) { 实际这里应该是0x0c,表示FAT32系统。