FATFS系统剖析(全)

上传人:无*** 文档编号:181201045 上传时间:2023-01-11 格式:DOC 页数:12 大小:60.50KB
收藏 版权申诉 举报 下载
FATFS系统剖析(全)_第1页
第1页 / 共12页
FATFS系统剖析(全)_第2页
第2页 / 共12页
FATFS系统剖析(全)_第3页
第3页 / 共12页
资源描述:

《FATFS系统剖析(全)》由会员分享,可在线阅读,更多相关《FATFS系统剖析(全)(12页珍藏版)》请在装配图网上搜索。

1、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次

2、方。 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 :底层驱动头文件 f

3、f.h : 文件系统实现头文件,定义有文件系统所需的数据结构 ff.c: 文件系统的具体实现如下开始逐个文件加以分析:integer.h :仅实现数据类型重定义,增加系统的可移植性。ffconf.h : 文件系统配置-逐个配置,先配置实现一个最小的fat文件系统,下面来分析各配置选项: #define _FFCONF 8255/版本号 #define_FS_TINY 0/* 0:Normal or 1:Tiny */在这里与先前版本有些许变化,是通过配置头配置两种不同大小的文件系统 ,这里配置为 0。#define _FS_READONLY1 /定义文件系统只读,也就不能写修改,在此定义为 1

4、,这样文件系统会大大缩小,简化学习理解过程。 #define _FS_MINIMIZE3/* 0 to 3 */ 这个选项是用于过滤掉一些文件系统功能,为0时是全功能,3是功能实现最小 #define_USE_STRFUNC 0/* 0:Disable or 1/2:Enable */ 是否使用字符串文件接口,为0,不使用 #define_USE_MKFS0 /* 0:Disable or 1:Enable */ 制作文件系统,这个功能实现是还要_FS_READONLY=0#define_USE_FORWARD 0/* 0:Disable or 1:Enable */f_forward fun

5、ction实现还需_FS_TINY=1 #define_USE_FASTSEEK 0/* 0:Disable or 1:Enable */快速查找功能 #define _CODE_PAGE 936/ 936 - Simplified Chinese GBK (DBCS, OEM, Windows) #define_USE_LFN 0 /* 0 to 3 */ 0:不使用长文件名 #define_MAX_LFN 255 /* Maximum LFN length to handle (12 to 255) */ #define_LFN_UNICODE 0/* 0:ANSI/OEM or 1:Un

6、icode */ #define _FS_RPATH0/* 0 to 2 */ 不使用相对路径/*-/ Physical Drive Configurations/-*/ #define _VOLUMES 1 /* Number of volumes (logical drives) to be used. */ #define_MAX_SS 512/* 512, 1024, 2048 or 4096 */ 512字节每扇区#define_MULTI_PARTITION 0/* 0:Single partition or 1:Multiple partition */ 只有一个分区 #defi

7、ne_USE_ERASE 0/* 0:Disable or 1:Enable */* To enable sector erase feature, set _USE_ERASE to 1. */*-/ System Configurations/-*/ #define _WORD_ACCESS0/* 0 or 1 */ 0: Byte-by-byte access./* Include a header file here to define sync object types on the O/S */* #include , , or ohters. */ #define _FS_REE

8、NTRANT 0/* 0:Disable or 1:Enable */同步选项 #define _FS_TIMEOUT 1000/* Timeout period in unit of time ticks */ #define_SYNC_t HANDLE/* O/S dependent type of sync object. e.g. HANDLE, OS_EVENT*, ID and etc. */ #define_FS_SHARE0/* 0:Disable or =1:Enable */ 共享选项如上已经配置成了一个最小的fat文件系统。Diskio.h:底层驱动头文件,就一些状态宏的

9、定义和底层驱动函数的申明,看源码一目了然。实现相应的 diskio.c 。 根据我的配置:只需要根据不同的存储介质实现相应的 disk_initialize ,disk_status,disk_read三个函数就够了,我在这里实现上s3c2440上的SD卡驱动:DSTATUS disk_initialize (BYTE nDisk) return 1;DSTATUS disk_status (BYTE nDisk) return 1;DRESULT disk_read (BYTE nDisk, BYTE* b, DWORD c, BYTE d)return 0;编译报错 get_fattime

10、 没实现 :DWORD get_fattime (void)return 0;转自博客,供大家相互交流!FATFS文件系统剖析2:分析下ff.h和ff.c两个文件。先来分析ff.h中定义的几个结构体:typedef struct BYTEfs_type; / 系统类型,为0时系统没有被挂载BYTEdrv; / 物理磁盘驱动号BYTEcsize; / 每簇的扇区数目, 簇是文件数据分配的基本单位BYTEn_fats; / 文件分配表的数目,一般为两个(一个备份fat表) /Fatfs文件系统应该是:引导扇区,文件分配表2个,根目录区,和数据区BYTEwflag; / 文件活动窗体是否改动标志,为

11、1要回写BYTEfsi_flag; / 文件信息回写标志WORDid; / 文件系统加载id号WORDn_rootdir; / 根目录区目录项数目(针对FAT12/16,FAT32不使用)#if _MAX_SS != 512WORDssize; / 每扇区多少字节#endif#if _FS_REENTRANT_SYNC_tsobj; / 允许重入,则定义同步对象#endif#if !_FS_READONLYDWORDlast_clust; / 最新分配的簇DWORDfree_clust; / 空闲簇DWORDfsi_sector;/ 文件信息扇区(仅用于FAT32)#endif#if _FS_

12、RPATHDWORDcdir;/使用相对路径,文件系统的当前起始路径 0(root 路径)#endifDWORDn_fatent;/文件分配表占用的扇区n_fatent=数据簇数目+2DWORDfsize; /每FAT表有多少个扇区DWORDfatbase; /文件分配表开始扇区 DWORDdirbase; / 如果是FAT32,根目录开始扇区需要首先得到DWORDdatabase;/ 数据起始扇区DWORDwinsect; / win中当前指定的扇区BYTEwin_MAX_SS;/扇区操作缓存 FATFS;typedef struct FATFS*fs; / 指向的文件系统WORDid; /

13、 自身文件系统挂载id号 即 fs-idBYTEflag; / 文件状态BYTEpad1; /文件在簇里面扇区偏移(0-fs-csize)DWORDfptr;/文件当前读写指针位置,当文件打开时为0DWORDfsize;/文件大小(按字节计算)DWORDorg_clust;/ 文件起始簇 (0 when fsize=0)DWORDcurr_clust;/文件当前操作簇DWORDdsect;/ 文件当前操作扇区 #if !_FS_READONLYDWORDdir_sect;/ 包含路径入口的扇区号BYTE*dir_ptr; / 目录入口指针#endif#if _USE_FASTSEEKDWORD

14、*cltbl; /指向查找映射表的簇 (null on file open) #endif#if _FS_SHAREUINTlockid; / 文件锁 ID号 (index of file semaphore table)#endif#if !_FS_TINYBYTEbuf_MAX_SS; / 文件读写缓存 #endif FIL;typedef struct FATFS*fs; / 对应的文件系统WORDid; / 自身文件系统挂载id号 即 fs-idWORDindex; / 目前读写索引号/* Current read/write index number */DWORDsclust; /

15、 目录表起始簇 (0:Root dir)DWORDclust; / 目前处理的簇DWORDsect; / 目前簇里对应的扇区BYTE*dir;/指向当前在win中的短文件名入口项/* Pointer to the current SFN entry in the winBYTE*fn; /指向短文件名(in/out) file8,ext3,status1 #if _USE_LFNWCHAR*lfn; /指向长文件名缓冲/* Pointer to the LFN working buffer */WORDlfn_idx;/* Last matched LFN index number (0xFF

16、FF:No LFN) */#endif DIR;typedef struct /文件目录表项 大小=4+2+2+1+13DWORDfsize;/* File size */ WORDfdate; /* Last modified date */WORDftime; /* Last modified time */BYTEfattrib; /* Attribute */ / 文件属性TCHARfname13;/* Short file name (8.3 format) */#if _USE_LFN /长文件名支持TCHAR*lfname; /* Pointer to the LFN buffe

17、r */UINT lfsize; /* Size of LFN buffer in TCHAR */#endif FILINFO;结构是搞清楚了,但其里面的具体联系怎么也还收理不清楚。只有看ff.c来疏通了! 里面东西还是蛮多的,咋一看,3000多行类(太多,在这里就根据我的配置,进行逐个分析吧),从头到尾,一个一个来。首先是三个内存操作和以个字符查找处理函数,不说不解释。然后是:staticFRESULT move_window (FATFS *fs,/* File system object */DWORD sector/* Sector number to make appearance

18、 in the fs-win */)/* Move to zero only writes back dirty window */该函数就是把指定扇区sector中的数据读到fs-win里面DWORD clust2sect (/* !=0: Sector number, 0: Failed - invalid cluster# */FATFS *fs,/* File system object */DWORD clst/* Cluster# to be converted */)计算簇clst在对应文件系统fs里面的扇区号DWORD get_fat (/* 0xFFFFFFFF:Disk e

19、rror, 1:Internal error, Else:Cluster status */FATFS *fs,/* File system object */DWORD clst/* Cluster# to get the link information */)获取簇clst在文件系统fs中FAT表里面fat入口staticFRESULT dir_sdi (DIR *dj,/* Pointer to directory object */WORD idx/* Directory index number */)根据根目录索引号idx获取相应的目录信息存储到dj结构里面staticFRESU

20、LT dir_next (/* FR_OK:Succeeded, FR_NO_FILE:End of table, FR_DENIED:EOT and could not stretch */DIR *dj,/* Pointer to directory object */int stretch/* 0: Do not stretch table, 1: Stretch table if needed */)获取当前目录项的索引值+1 ,对应的目录项信息staticFRESULT dir_find (DIR *dj/* Pointer to the directory object linke

21、d to the file name */)在目录表中查找与dj-fn相同文件名的目录项staticFRESULT create_name (DIR *dj,/* Pointer to the directory object */const TCHAR *path/* Pointer to pointer to the segment in the path string */)创建一个文件名为 path指向的 dj目录项staticFRESULT follow_path (/* FR_OK(0): successful, !=0: error code */DIR *dj,/* Direc

22、tory object to return last directory and found object */const TCHAR *path/* Full-path string to find a file or directory */)获取文件路径path对应的目录项填入dj里面staticBYTE check_fs (/* 0:The FAT BR, 1:Valid BR but not an FAT, 2:Not a BR, 3:Disk error */FATFS *fs,/* File system object */DWORD sect/* Sector# (lba) t

23、o check if it is an FAT boot record or not */)读取文件系统fs的一号扇区,进行MBR 检查,文件系统类型区分staticFRESULT chk_mounted (/* FR_OK(0): successful, !=0: any error occurred */const TCHAR *path,/* Pointer to pointer to the path name (drive number) */FATFS *rfs,/* Pointer to pointer to the found file system object */BYTE

24、 chk_wp/* !=0: Check media write protection for write access */)测试文件系统是否已挂在,如没有,就进行挂载,文件系统结构初始化staticFRESULT validate (/* FR_OK(0): The object is valid, !=0: Invalid */FATFS *fs,/* Pointer to the file system object */WORD id/* Member id of the target object to be checked */)检测文件系统是否可用如下是现配置好的文件系统引出的

25、四个接口函数: FRESULT f_mount ( /挂在一个逻辑的文件系统 BYTE vol,/* Logical drive number to be mounted/unmounted */FATFS *fs/* Pointer to new file system object (NULL for unmount)*/)系统挂载FRESULT f_open (FIL *fp,/* Pointer to the blank file object */const TCHAR *path,/* Pointer to the file name */BYTE mode/* Access mo

26、de and file open mode flags */)文件打开, 包括(真正的文件系统初始化,系统检测)FRESULT f_read (FIL *fp, /* Pointer to the file object */void *buff,/* Pointer to data buffer */UINT btr,/* Number of bytes to read */UINT *br/* Pointer to number of bytes read */)文件读FRESULT f_close (FIL *fp/* Pointer to the file object to be closed */)文件关闭转自博客,供大家相互交流!

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!