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文件系统的基本原理最近做的spi flash,本打算弄个文件系统,由于之前用过了JFFS、YAFFS和TrueFFS,代码量都相当的大,这次想找款代码量不那么吓人的,学习一下,听说配置会相对复杂一些。
选来选去,最终选定了FatFS,代码量足够的小,最新的R0.09版本只有1个.c文件(当然,还有一个底层的要自己写,option文件夹里的无视),老点版本就更小了。
而且更新很频繁,用户量也够大,就选定它了。
尽管最后由于硬件和项目原因未能实际的移植它到vxWorks,但学过的还是要记录下。
在这里http://elm-chan/fsw/ff/00index_el下载源码,只有800多K,小的可怜,还可以下载示例程序,有A VR、Win32、lpc等多平台已实现的方案。
打开看src文件夹,一个opTIon 文件夹、00readme.txt、diskio.h、ff.c、ff.h、ffconf.h和interger.h。
移植时需要修改的文件主要包括ffconf.h和interger.h,后者是在它的定义与目标平台上的有冲突,或者用的不习惯时修改的。
在做具体修改之前,先大概阅读下FatFS的源代码,可以先读integer.h,了解所用的数据类型,然后是ff.h,了解文件系统所用的数据结构和各种函数声明,再就是diskio.h,了解与介质相关的数据结构和操作函数。
ff.c这个文件相对较大,可以在最后将所实现的函数大致扫描一遍,之后根据用户应用层程序调用函数的次序仔细阅读相关代码。
各个文件都可以直接用记事本打开查阅,非常方便。
ff.h中的几个结构体十分重要,列举如下,首先是最基础的文件系统结构体:view plaincopy to clipboardprint?/* File system object structure (FATFS) */typedef struct {BYTE fs_type; /* FAT子类型,一般在mount时用,置0表示未挂载*/BYTE drv; /* 物理驱动号,一般为0*/BYTE csize; /* 每个簇的扇区数目(1,2,4...128) */BYTE n_fats; /* 文件分配表的数目(1,2) */。
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、添加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区域、根⽬录区、数据区的起始扇区。
STM32笔记(六)SD卡的读写和FatFS文件系统

STM32笔记(六)SD卡的读写和FatFS文件系统因为要用,学习了一下SPI操作SD卡,同时移植了一个免费开源的FAT文件系统:FatFS。
感觉挺好,在单片机上实现了读写文件的操作,接下来就可以解释我的G代码咯!我的SD卡底层操作参考了网上几种常见的代码,但又对其结构做了一定的优化,至少看起来用起来比较方便。
既可以作为文件系统的diskio使用,也可以直接使用底层函数,把SD卡作为一块flash读写。
FatFs文件系统体积蛮小,6-7K足矣,对于128Kflash的STM32来说很合适,代价不大。
同时可移植性很高,最少只需要4个函数修改既可以实现文件系统的移植。
相关文件系统的介绍请看这里。
这里给一套比较完整的参考资料,包括fatfs文件系统的原版资料、几个重要的手册和网上下载的代码。
/bbs/bbs_content.jsp?bbs_sn=3210864&bbs_page_no=1&bbs_id=3020 下面是我的代码:其中底层的SPI总线对SD卡的操作在SPI_SD_driver.c/h中,而FATFS的移植文件diskio.c中对磁盘的操作函数中将调用底层的操作函数。
下面是一些底层操作函数:u8 SPI_ReadWriteByte(u8 TxData); //SPI总线读写一个字节u8 SD_WaitReady(void); //等待SD卡就绪u8 SD_SendCommand(u8 cmd, u32 arg, u8 crc); //SD卡发送一个命令u8 SD_SendCommand_NoDeassert(u8 cmd, u32 arg, u8 crc); //SD卡发送一个命令,不断线u8 SD_Init(void); //SD卡初始化u8 SD_ReceiveData(u8 *data, u16 len, u8 release); //SD卡读数据u8 SD_GetCID(u8 *cid_data); //读SD卡CIDu8 SD_GetCSD(u8 *csd_data); //读SD卡CSDu32 SD_GetCapacity(void); //取SD卡容量u8 SD_ReadSingleBlock(u32 sector, u8 *buffer); //读一个sectoru8 SD_WriteSingleBlock(u32 sector, const u8 *buffer); //写一个sectoru8 SD_ReadMultiBlock(u32 sector, u8 *buffer, u8 count); //读多个sectoru8 SD_WriteMultiBlock(u32 sector, const u8 *data, u8 count); //写多个sector这是diskio.c中的一段代码,在disk初始化中,我们调用了SPI_SD_driver.c中的SD卡初始化函数。
FAT文件系统部分摘记

FAT文件系统部分摘记FAT文件系统部分摘记1、磁道当磁盘在旋转时,磁头若保持在一个位置上,则每个磁头都会在磁盘表面划出一个圆形轨迹,这些圆形轨迹就叫做磁道。
每张盘片上的磁道由外向内依次从“0”开始进行编号。
虽然磁道的编号是“由外向内依次从“0”开始进行编号”,但这并不意味着“0”磁道是位于磁盘片的最外沿的。
固件区的物理位置有的位于比“0”磁道更靠近磁盘片的外缘的磁道上。
有的位于磁盘片的中部。
2、扇区磁盘上的每个磁道被等分为若干个弧段,这些弧段便是磁盘的扇区。
每个扇区大小为512字节。
扇区从“1”开始编号。
3、DOC分区虽然我们的存储介质没有分区(你的u盘,sd卡等小容量存储介质肯定没有分区的吧)。
但是在文件系统初始化的开始我们必须通过MBR获取分区表项的数据,以获得CHS、LBA参数以及分区大小扇区数,否则就无法知道你文件系统的起始物理扇区号Microsoft将使用DOC分区体系的磁盘称为“主引导记录(Mas ter Boot recorder,MBR)”磁盘,这是对于使用“全局ID分区表(GUID Partition T able, GPT)磁盘”而言的。
4、主引导记录扇区使用“DOC分区”体系时,磁盘的第一个——也就是0号扇区被称为主引导记录扇区,也称为主引导记录MBR(Master Boot record er,MBR)。
MBR由446个字节的引导代码、64字节的主分区(4个)表及两个字节的签名值“55 AA”组成。
5、FAT文件系统简介文件系统会在你把文件存放到某个目录下时记录下你文件的信息(文件存放的起始簇号,文件大小,文件创建、修改、访问、保存的时间等等),当你下次要打开那个文件时,文件系统就根据已知的文件信息去寻找它,找到后,你就又可以读,写,修改,移动你的文件了,并且文件系统会同时更新。
文件系统会在你把文件存放到某个目录下时记录下你文件的信息(文件存放的起始簇号,文件大小,文件创建、修改、访问、保存的时间等等),当你下次要打开那个文件时,文件系统就根据已知的文件信息去寻找它,找到后,你就又可以读,写,修改,移动你的文件了,并且文件系统会同时更新。
FATFS文件系统剖析(全)要点

FATFS文件系统剖析1:FAT16:数据按照其不同的特点和作用大致可分为5部分:MBR区、DBR区、FAT区、DIR区和DATA区,相比fat12多了DBR区Main boot record: MBR(0--1bdh)磁盘参数存放DPT(1beh--1fdh)磁盘分区表55,aa 分区结束标志DBR(Dos Boot Record)是操作系统引导记录区的意思FAT区(有两个,一个备份):对于fat16,每一个fat项16位,所以可寻址的簇项数为65535(2的16次方)。
而其每簇大小不超过32k,所以其每个分区最大容量为2G。
fat32,每一个fat项32位,可寻址簇数目为2的32次方。
DIR区(根目录区):紧接着第二FAT表(即备份的FAT表)之后,记录着根目录下每个文件(目录)的起始单元,文件的属性等。
定位文件位置时,操作系统根据DIR中的起始单元,结合FAT表就可以知道文件在硬盘中的具体位置和大小了。
DATA区:实际文件内容存放区。
FAT32:暂时放在这里,不讨论!Fatfs:嵌入式fat文件系统,支持fat16,fat32。
包含有ff.h,diskio.h,integer.h,ffconf.h 四个头文件以及ff.c 文件系统实现。
当然要实现具体的应用移植,自己要根据diskio.h实现其diskio。
c 底层驱动。
diskio.h : 底层驱动头文件ff.h : 文件系统实现头文件,定义有文件系统所需的数据结构ff.c : 文件系统的具体实现如下开始逐个文件加以分析:integer.h :仅实现数据类型重定义,增加系统的可移植性。
ffconf.h : 文件系统配置---逐个配置,先配置实现一个最小的fat文件系统,下面来分析各配置选项:#define _FFCONF 8255 //版本号#define _FS_TINY 0 /* 0:Normal or 1:Tiny */ //在这里与先前版本有些许变化,是通过配置头配置两种不同大小的文件系统,这里配置为0。
STM32之FATFS文件系统(SPI方式)笔记

STM32之FATFS文件系统(SPI方式)笔记BY:T7Date:20171202At:YSU_B307开发环境:uVision: V5.12.0.0STM32F103V8T6库版本: STM32F10x_StdPeriph_Lib_V3.5.0FATSF : ff13a工程版本:FATFS_V1日期:20171130硬件连接:SPI1_CS -> PA4 SPI1_CLK -> PA5 SPI1_MISO -> PA6 SPI1_MOSI -> PA7工程功能:建立在SPI_SD的基础上,完成文件系统的初步接触。
一、FATFS文件系统1.使用开源的FAT文件系统模块,其源代码的获取从官网:目前最新版本是:ff13a2.解压后得到两个文件:其中,documents相当于STM32的固件库使用手册,介绍FATFS系统的函数使用方法,source 中则是需要用到的源代码。
因为FATFS使用SD卡,所以FATFS的基础是SD卡的正常读写,这里采用SPI模式。
二、STM32之SD卡_SPI模式1.硬件连接:SPI1_CS -> PA4 SPI1_CLK -> PA5 SPI1_MISO -> PA6 SPI1_MOSI -> PA72.SPI模式下STM32读写SD卡的工程结构在确定STM32使用SPI模式读写SD卡没有问题后,进入FATSF文件系统的实验,另源代码在文档最后。
三、FATSF文件系统移植1.配置工程环境1)STM32读写SD卡-SPI模式成功2)将解压后的ff13a整个文件夹赋值到工程目录下,如图:3)返回到MDK界面下,添加ff13a项目组,并把ff13a\source\目录下ff.c,diskio.c,ffunicode.c,ffsystem.c添加到项目组中,如下列图:4)在Target Options的C++编译器选项中添加文件包含路径,如下列图四、为FATSF文件系统添加底层驱动〔一〕在diskio.c中添加函数代码1.DSTATUS disk_status (BYTE pdrv); 添加完成后如下列图2.DSTATUS disk_initialize (BYTE pdrv); 添加完成后如下列图3.DRESULT disk_read (BYTE pdrv, BYTE* buff, DWORD sector, UINT count);4.DRESULT disk_write (BYTE pdrv, const BYTE* buff, DWORD sector, UINT count);5.DRESULT disk_ioctl (BYTE pdrv, BYTE cmd, void* buff);6.DWORD get_fattime (void);注意:在diskio.c中DEV_MMC的宏定义要为0,如下列图(二)打开Ffconf.h函数1.改变FF_CODE_PAGE的值如下2.改变FF_USE_LFN的值如下五、Main主函数Main.c函数如下代码:#include "main.h"#define ONE_BLOCK 512#define TWO_BLOCK 1024uint8_t sd_RxBuf[TWO_BLOCK];//SD卡数据j接收缓存区uint8_t sd_TxBuf[TWO_BLOCK] = {0};//SD卡数据j接收缓存区FRESULT res;//读写文件的返回值FIL FileSyatemSrc,FileSystemDst;//文件系统结构体,包含文件指针等成员UINT br,bw;//Fil R/W countBYTE FileRxBuffer[ONE_BLOCK];//FILE COPY BUFFER//BYTE TxFileBuffer[] = "This is the FATFS System!\r\n";BYTE TxFileBuffer[] = "中文文件系统实验!\r\n";static const char * FR_Table[]={"FR_OK:成功", /* (0) Succeeded */"FR_DISK_ERR:底层硬件错误", /* (1) A hard error occurred in the low level disk I/O layer */"FR_INT_ERR:断言失败", /* (2) Assertion failed */"FR_NOT_READY:物理驱动没有工作", /* (3) The physicaldrive cannot work */"FR_NO_FILE:文件不存在", /* (4) Could not find the file */"FR_NO_PATH:路径不存在", /* (5) Could not find the path */"FR_INVALID_NAME:无效文件名", /* (6) The path name format is invalid */"FR_DENIED:由于禁止访问或者目录已满访问被拒绝", /* (7) Access denied due to prohibited access or directory full */"FR_EXIST:由于访问被禁止访问被拒绝", /* (8) Access denied due to prohibited access */"FR_INVALID_OBJECT:文件或者目录对象无效", /* (9) The file/directory object is invalid */"FR_WRITE_PROTECTED:物理驱动被写保护", /* (10) The physical drive is write protected */"FR_INVALID_DRIVE:逻辑驱动号无效", /* (11) The logical drive number is invalid */"FR_NOT_ENABLED:卷中无工作区", /* (12) The volume has no work area */"FR_NO_FILESYSTEM:没有有效的FAT卷", /* (13) There is no valid FAT volume */"FR_MKFS_ABORTED:由于参数错误f_mkfs()被终止", /* (14) The f_mkfs() aborted due to any parameter error */"FR_TIMEOUT:在规定的时间内无法获得访问卷的许可", /* (15) Could not get a grant to access the volume within defined period */"FR_LOCKED:由于文件共享策略操作被拒绝", /* (16) The operation is rejected according to the file sharing policy */"FR_NOT_ENOUGH_CORE:无法分配长文件名工作区", /* (17) LFN working buffer could not be allocated */"FR_TOO_MANY_OPEN_FILES:当前打开的文件数大于_FS_SHARE", /* (18) Number of open files > _FS_SHARE */"FR_INVALID_PARAMETER:参数无效" /* (19) Given parameter is invalid */};int main(void){int i = 0;FATFS fs;//记录文件系统盘符信息的结构体LED_Init();USARTx_Init();/* 调用f_mount()创建一个工作区,另一个功能是调用了底层的disk_initialize()函数,进行SDIO借口的初始化*/res = f_mount(&fs, "0:", 1 );if (res != FR_OK){printf("挂载文件系统失败(%s)\r\n", FR_Table[res]);}else{printf("挂载文件系统成功(%s)\r\n", FR_Table[res]);}/* 调用f_open()函数在刚刚开辟的工作区的盘符0下打开一个名为Demo.TXT的文件,以创建新文件或写入的方式打开(参数"FA_CREATE_NEW | FA_WRITE"),如果不存在的话则创建这个文件。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2. 在对文件的f_read和f_write过程中(不考虑f_lseek的情况),只有需要读写的最后一个扇区(内容小于512字节) 才会被暂存到buffer中,而前面的扇区内容是直接通过磁盘驱动disk_read/disk_write在用户缓冲区和物理磁盘之间进 行交互的。
注意:FatFs 0.01与最新的版本还是不少差异的,如在0.01中,buffer只是个指针,需要用户自己定义文件缓冲区,并 将buffer指向该缓冲区。而最新版本中,FIL已经有自己的buf[_MAX_SS]。在0.01中没有f_mount()函数,所以需要手动 将全局指针FatFs指向自己定义的变量fs。具体的操作流程可参考官网上的示例代码。
……
扇区B
四、源码注释 本人在不破坏源码逻辑的前提下,对FatFs 0.01源代码进行了中文注释,个别函数重新修改了排版布局,以方便阅 读。结合以上示意图即伪代码,相信大家会很快理解FatFs 0.01的核心思想及架构。 源码如下:
ff
ff
FatFs学习笔记 Page 6
FatFs学习笔记 Page 3
文件实际大小 ……
用户源缓冲区 512的整数倍
不足 1个扇区的内容
FatFs文件系统
SD卡物理空间
系统缓冲区
文件对应的 目录项
win[]
2 move _window()
3
文件目录项对应的扇区
扇区0 扇区1
……
第n簇
文件缓冲区
不足 1个扇区的内容
1 disk_write()
三、关键函数总结:
1. f_open f_open() {
1. 初始化SD卡,初始化FATFS对象; 2. 查找文件的目录项; 3. 填充文件结构体FIL。 }
2. f_read f_read() {
1. 从物理磁盘直接读取所需扇区到用户缓冲区,这个过程中未使用buffer缓冲区; 2. 如果最后一扇区要读取的字节数少于512,则先将最后一扇区读到buffer中,然后再从buffer拷贝需要的字节 到用户缓冲区中。
fs_type files sects_clust n_fats n_rootdir dirtyflag = 0 pad1 sects_fat max_clust fatbase dirbase database winsect = B win[512]
扇区B
SD卡物理空间
扇区A (Modified)
FatFs 0.01学习笔记
2014年2月14日 9:20
——何小龙 博客:/hexiaolong2009
一、介绍: 本文以网上开源文件系统FatFs 0.01为研究对象,剖析FatFs文件系统的核心操作。FatFs目前最新版本已更新到0.10a版 本,而我之所以选择0.01版本,是因为这是最早的发布版本,与最新的版本相比,去掉了很多高级应用,且代码量 相对较小,宏开关也少了许多,易于阅读和理解,用来研究它的雏形再合适不过了,所以笔者选择 0.01版本进行剖 析。当大家了解了0.01的核心思想后,再回去看最新的版本,也就容易理解多了。
FatFs历史版本下载:/fsw/ff/00index_e.html 在官网的最下面,能找到所有版本的下载链接。
二、重点:
1. FatFs中有两个重要的缓冲区:win[]和buffer。win[]在FATFS结构体中,buffer在FIL结构体中。 win[]:系统缓冲区。当操作MBR,DBR,FAT表,根目录区时,使用该缓冲区; buffer:文件缓冲区。当对文件的内容进行操作时,如读、写、修改时,才使用该缓冲区。
扇区A (Modified)
SD卡物理空间
2 disk_write
扇区A ……
disk_read 3
扇区B
调用后:
FatFs学习笔记 Page 5
FATFS *FatFs
FATFS fs;
BYTE BYTE BYTE BYTE WORD BYTE BYTE DWORD DWORD DWORD DWORD DWORD DWORD BYTE
fs_type files sects_clust n_fats n_rootdir dirtyflag = 1 pad1 sects_fat max_clust fatbase dirbase database winsect = A win[512]
扇区A (Modified)
SD卡物理空间
扇区A …… 扇区B
2 读取最后一扇区 到buffer
buffer
扇区0 扇区1
……
第n簇
扇区0 扇区1
……
第n+1簇
扇区0 扇区1 ……
第n+2簇
……
3. f_write f_write() {
1. 从用户缓冲区直接写入到物理磁盘,这个过程中未使用buffer缓冲区; 2. 如果要写入的最后一扇区内容少于512字节,则先从物理磁盘读取最后一扇区的内容到buffer中,然后修改 buffer中的相应内容,并设置回写标记,这样下次调用f_close/f_write时,就会将buffer回写到物理磁盘中。 }
}
FatFs学习笔记 Page 1
文件实际大小 ……
FatFs文件系统
SD卡物理空间
用户缓冲区 大小由用户定义
系统缓冲区
move _window ()
文件目录项对应的扇区
512Bytes
win[] 1 由disk_read直接 读取连续扇区
文件缓冲区
3 再从buffer拷贝 到用户缓冲区
512Bytes
文件缓冲区
buffer
先读取最后一扇 区到buffer中2Βιβλιοθήκη 扇区0 扇区1……
第n簇
扇区0 扇区1
……
第n+1簇
扇区0 扇区1 ……
第n+2簇
……
4. f_close 关键是调用了f_sync函数。
5. f_sync f_sync() {
1. 将buffer回写到物理磁盘中; 2. 读取文件对应的目录项到win[]中,更新参数,并回写。 }
执行中:
FATFS *FatFs
FATFS fs;
1 判断是否修改过
BYTE BYTE BYTE BYTE WORD BYTE BYTE DWORD DWORD DWORD DWORD DWORD DWORD BYTE
fs_type files sects_clust n_fats n_rootdir dirtyflag = 1 pad1 sects_fat max_clust fatbase dirbase database winsect = A win[512]
FatFs学习笔记 Page 2
文件实际大小 ……
FatFs文件系统
SD卡物理空间
用户源缓冲区 512的整数倍
不足 1个扇区的内容
系统缓冲区
move _window ()
文件目录项对应的扇区
512Bytes
win[] 1 由disk_write直 接写入连续扇区
再从源缓冲区拷 3 贝到buffer中
buffer
扇区0 扇区1
……
第n+1簇
扇区0 扇区1 ……
第n+2簇
……
5. move_window move_window专用于操作win[]系统缓冲区。
move_window(B); 调用前:
FatFs学习笔记 Page 4
FATFS *FatFs
FATFS fs;
BYTE BYTE BYTE BYTE WORD BYTE BYTE DWORD DWORD DWORD DWORD DWORD DWORD BYTE