FATFS文件系统剖析1:
FAT16:
system的头文件数据按照其不同的特点和作用大致可分为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。
              #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文件系统。
Diskio.h:底层驱动头文件,就一些状态宏的定义和底层驱动函数的申明,看源码一目了然。
    实现相应的 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 没实现 :
DWORD get_fattime (void)
{
return 0;
}
转自博客,供大家相互交流!
FATFS文件系统剖析2:
分析下ff.h和ff.c两个文件。
先来分析ff.h中定义的几个结构体:
typedef struct {
 BYTE fs_type;  //  系统类型,为0时系统没有被挂载
 BYTE drv;          //  物理磁盘驱动号
 BYTE csize;      //  每簇的扇区数目,  簇是文件数据分配的基本单位   
 BYTE n_fats;    //  文件分配表的数目,一般为两个(一个备份fat表)     
          //Fatfs文件系统应该是:引导扇区,文件分配表2个,根目录区,和数据区
     
 BYTE wflag;      //  文件活动窗体是否改动标志,为1要回写 

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。