现在的位置: 首页 > 综合 > 正文

Fatfs文件系统分析(1)-Fatfs

2018年08月24日 ⁄ 综合 ⁄ 共 4050字 ⁄ 字号 评论关闭

Fatfs文件系统分析(1)

 

1、文件系统

    文件系统应该具备的功能:

        1) 
创建以及删除文件

        2) 
控制文件存取

        3) 
使用符号名字识别文件,而不是磁盘上的物理位置

        4) 
共享文件的能力

       5) 
能够列出已经存在的文件

      6) 
能够在软件或者硬件崩溃的时候保护文件

 

 

2、Fatfs文件系统

              FatFS是一个为小型嵌入式系统设计的通用FAT(File
Allocation Table)
文件系统模块。FatFs 的编写遵循ANSI C,并且完全与磁盘I/O层分开,如图1。因此,它独立(不依赖)于硬件架构。它可以被嵌入到低成本的微控制器中,如AVR,
8051, PIC, ARM, Z80, 68K
等等,而不需要做任何修改。Fatfs文件系统里文件格式,分fat12,fat16,fat32:

                   
                                         图1

 

    1)FAT12:

     Fat12文件系统的限制:
      1)文件名:只能是8.3格式的文件名。
     2)磁盘容量:最多8M。(4096clusters×4sectors/clusters×512bytes、sectors)
     3)文件碎片严重。(只在磁盘上不存储在不连续的簇内。)

网上有篇很好的介绍:http://blog.csdn.net/b2b160/archive/2009/07/30/4394907.aspx

 

      2)FAT16:

   数据按照其不同的特点和作用大致可分为5部分:MBR区、DBR区、FAT区、DIR区和DATA区,相比fat12多了DBR区

   MBR( Main boot record):(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区:实际文件内容存放区。

    3)FAT32:略

 

3、源码分析

        从网上下载到新版fatfs  --  http://elm-chan.org/fsw/ff/00index_e.html

       包含有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

              #define _FS_READONLY   1   //定义文件系统只读,也就不能写修改,在此定义为
1
,这样文件系统会大大缩小,简化学习理解过程。

             #define _FS_MINIMIZE     3 /* 0 to 3 */  这个选项是用于过滤掉一些文件系统功能,为0时是全功能,3是功能实现最小

              #define _USE_STRFUNC   0 /* 0:Disable or 1/2:Enable */ 是否使用字符串文件接口,为0,不使用

              #define _USE_MKFS         0 /* 0:Disable or 1:Enable */  制作文件系统,这个功能实现是还要_FS_READONLY=0

              #define _USE_FORWARD  0  /* 0:Disable or 1:Enable */  f_forward function  实现还需_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:Unicode */

 

              #define _FS_RPATH   0  /* 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 */  只有一个分区

         #define _USE_ERASE    0 /* 0:Disable or 1:Enable */
         /* To enable sector erase feature, set _USE_ERASE to 1. */

 

/*---------------------------------------------------------------------------/
/ System Configurations
/----------------------------------------------------------------------------*/

           #define _WORD_ACCESS 0 /* 0 or 1 */   0: Byte-by-byte access.

 

/* Include a header file here to define sync object types on the O/S */
/* #include <windows.h>, <ucos_ii.h.h>, <semphr.h> or ohters. */          

           #define _FS_REENTRANT    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_SHARE       0 /* 0:Disable or >=1:Enable */ 共享选项

      如上已经配置成了一个最小的fat文件系统。

 

抱歉!评论已关闭.