FatFs详解

最近做的spi flash,本打算弄个文件系统,由于之前用过了JFFSYAFFSTrueFFS,代码量都相当的大,这次想款代码量不那么吓人的,学习一下,听说配置会相对复杂一些。选来选去,最终选定了FatFS,代码量足够的小,最新的R0.09版本只有1.c文件(当然,还有一个底层的要自己写,option文件夹里的无视),老点版本就更小了。而且更新很频繁,用户量也够大,就选定它了。尽管最后由于硬件和项目原因未能实际的移植它到vxWorks,但学过的还是要记录下。
    在这里/fsw/ff/00index_e.html下载源码,只有800K,小的可怜,还可以下载示例程序,有AVRWin32lpc等多平台已实现的方案。打开看src文件夹,一个option文件夹、diskio.hff.cff.hffconf.hinterger.h。移植时需要修改的文件主要包括ffconf.hinterger.h,后者是在它的定义与目标平台上的有冲突,或者用的不习惯时修改的。
    在做具体修改之前,先大概阅读下FatFS的源代码,可以先读integer.h,了解所用的数据类型,然后是ff.h,了解文件系统所用的数据结构和各种函数声明,再就是diskio.h,了解与介质相关的数据结构和操作函数。ff.c这个文件相对较大,可以在最后将所实现的函数大致扫描一
遍,之后根据用户应用层程序调用函数的次序仔细阅读相关代码。各个文件都可以直接用记事本打开查阅,非常方便。ff.h中的几个结构体十分重要,列举如下,首先是最基础的文件系统结构体
1. /* File system object structure (FATFS) */ 
2. typedef struct { 
3.     BYTE    fs_type;        /* FAT子类型,一般在mount时用,置0表示未挂载*/ 
4.     BYTE    drv;            /* 物理驱动号,一般为0*/ 
5.     BYTE    csize;          /* 每个簇的扇区数目(1,128) */ 
6.     BYTE    n_fats;         /* 文件分配表的数目(1,2) */ 
卤素管取暖器7.     /*FAT文件系统依次为:引导扇区、两个文件分配表、根目录区和数据区*/ 
8.     BYTE    wflag;          /* 标记文件是否被改动过,为1时要回写*/ 
9. 科室牌设计    BYTE    fsi_flag;       /* 标记文件系统信息是否被改动过,为1时要回写*/ 
10.     WORD    id;             /* 文件系统挂载ID */ 
11.     WORD    n_rootdir;      /* 根目录区入口(目录项)的个数(用于FAT12/16)*/ 
12. #if _MAX_SS != 512   
13.     WORD    ssize;          /* 每扇区的字节数(用于扇区大于512Byteflash) */ 
14. #endif   
15. #if _FS_REENTRANT   
16.     _SYNC_t sobj;           /* 允许重入,即定义同步对象,用在tiny*/ 
17. #endif   
18. #if !_FS_READONLY   
19.     DWORD   last_clust;     /* 最后一个被分配的簇*/ 
20.     DWORD   free_clust;     /* 空闲簇的个数*/ 
21.     DWORD   fsi_sector;     /* 存放fsinfo的扇区(用于FAT32) */ 
22. #endif   
23. #if _FS_RPATH   
24.     DWORD   cdir;           /* 允许相对路径时用,存储当前目录起始簇(0:root)*/ 
25. #endif   
26.     DWORD   n_fatent;       /* FAT入口数(簇的数目 + 2)*/ 
27.     DWORD   fsize;          /* 每个FAT所占扇区*/ 
28.     DWORD   fatbase;        /* FAT起始扇区*/ 
29.     DWORD   dirbase;        /* 根目录起始扇区(FAT32:Cluster#) */ 
30.     DWORD   database;       /* 数据目录起始扇区*/ 
31.     DWORD   winsect;        /* 当前缓冲区中存储的扇区号*/ 
32.     BYTE    win[_MAX_SS];   /* 单个扇区缓存*/ 
33. } FATFS; 
 然后是与之相关的文件和文件夹结构体,附上具体注释:
1. /* File object structure (FIL) */ 
2. typedef struct { 
3.     FATFS*  fs;             /* 所在的fs指针*/ 
4.     WORD    id;             /* 所在的fs挂载编号*/ 
5.     BYTE    flag;           /* 文件状态*/  社区搜索
6.     BYTE    pad1;           /* 不知道含义,也未见程序使用*/ 
7.     DWORD   fptr;           /* 文件读写指针*/ 
8.     DWORD   fsize;          /* 大小*/ 
9.     DWORD   sclust;         /* 文件起始簇(fsize=0时为0) */ 
10.     DWORD   clust;          /* 当前簇*/ 
11.     DWORD   dsect;          /* 当前数据扇区*/ 
12. #if !_FS_READONLY   
13.     DWORD   dir_sect;       /* 包含目录项的扇区 */ 
14.     BYTE*   dir_ptr;        /* Ponter to the directory entry in the window */ 
15. #endif   
16. #if _USE_FASTSEEK   
17.     DWORD*  cltbl;          /*指向簇链接映射表的指针*/ 
18. #endif   
19. #if _FS_SHARE   
20.     UINT    lockid;         /* File lock ID (index of file semaphore table) */ 
21. #endif   
22. #if !_FS_TINY   
23.     BYTE    buf[_MAX_SS];   /* File data read/write buffer */ 
24. #endif   
25. } FIL; 
 下面是目录的:
1. /* Directory object structure (DIR) */ 
2. typedef struct { 
3.     FATFS*  fs;             /* 同上*/ 
4.     WORD    id; 
5.     WORD    index;          /* 当前读写索引号 */ 
6.     DWORD   sclust;         /* 文件数据区开始簇*/ 
7.     DWORD   clust;          /* 当前簇*/ 
8.     DWORD   sect;           /* 当前扇区*/ 
9.     BYTE*   dir;            /* 扇区缓存中当前SFN入口指针,SFN含义未知,猜测和LFN类似,与文件名相关*/ 
10.     BYTE*   fn;             /* Pointer to the SFN (in/out) {file[8],ext[3],status[1]} */ 
11. #if _USE_LFN   
12.     WCHAR*  lfn;            /* Pointer to the LFN working buffer */ 
13.     WORD    lfn_idx;        /* Last matched LFN index number (0xFFFF:No LFN) */ 
14. #endif   
15. } DIR; 
    其他类似f_mountf_open等接口API就不细说了,在挂载的时候其实真正起作用的是chk_mounted函数,在这里才会将挂载分区的相关信息分配到FatFS结构体中;还有一个get_fat函数,也比较重要,在f_open和许多目录操作的函数中都有用到,而且FAT入口这个表达也十分晦涩,而它又调用了一个move_window的函数,也是十分晦涩难懂,可能是我英语太烂的缘故吧。实际上,move_window的作用是改变文件系统的当前工作扇区,如果要迁移到的是当前扇区,直接返回,如果不是,就将原扇区写回,若是FAT表,还要写进备份区。
    熟悉了代码结构后,现在开始作修改了,首先修改ffconf.h文件配置与硬件相关的文件系统特性,然后自己添加一套底层操作即可。先看ffconf.h,里面定义了很多宏,可以根据自己需要一一配置:
    先看功能配置:
_FS_TINY:文件系统为标准的还是微型的,默认为标准的(0)
_FS_READONLY:文件系统是否为只读,默认为可读写(0),若只读则f_writef_sync f_unlinkf_mkdirf_chmodf_renamef_truncatef_getfree不可用;
_FS_MINIMIZE:裁剪文件系统的功能,默认为全部功能(0),若为12则会移除大部分链接、目录等功能;
_USE_STRFUNC:是否允许字符串操作,默认为不允许(0),这个看个人需求,一般情况下设置为1即可,如果工作在windows下,为保证文件兼容性(如换行符’\n磁流变阻尼器’和回车符’\r碱式氧化锰)建议将此项设置为2

本文发布于:2024-09-22 13:33:15,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/3/315195.html

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

标签:文件   扇区   相关   默认
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议