原创 深入理解文件系统(八)

2010-4-3 10:37 3524 5 5 分类: MCU/ 嵌入式

 


<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 


八、FatFS的其它特性和新进展


 


1、支持重入功能


在多任务操作系统中,各个任务是并发的。当它们要同时访问文件系统时,先要获得同步对象。比如在ucos中,可以采用互斥信号量来同步。在f_mount()时,创建同步对象,在check_mount()和validate()函数调用时,先申请同步对象,若是其它任务在使用文件系统,则在同步对象上等待。任务完成后,再释放同步对象。


这个功能与操作系统的任务同步特性相关,以后如果要使用这个特性的话在详细分析。


 


2、支持文件的共享打开(主要是多次以读的方式打开)


这是FatFs作者在3月份新上传的R008 Rev1版本里新增加的功能


ffconf.h中增加了_FS_SHARE共享数目定义


ff.h增加了:文件共享信息结构体定义,并在文件系统结构体中使用。


typedef struct _FILESEM_ {


      DWORD clu;                   /* File ID 1, directory */


      WORD idx;               /* File ID 2, index in the directory */


      WORD ctr;                /* File open counter, 0:none, 0x01..0xFF:read open count, 0x100:in write open */


} FILESEM;


 


ff.c中增加了四个函数


FRESULT chk_lock (     /* 检查文件是否可以被访问 */


      DIR* dj,              /* Directory object pointing the file to be checked */


      int acc                 /* Desired access (0:Read, 1:Write, 2:Delete/Rename) */


)


BOOL enq_lock (     /* 为一个新文件找到可用的文件共享结构体 */


      FATFS* fs    /* File system object */


)


UINT inc_lock (       /* Increment file open counter and returns its index (0:int error) */


      DIR* dj,       /* Directory object pointing the file to increment */


      int acc          /* Desired access mode (0:Read, !0:Write) */


)


FRESULT dec_lock (      /* Decrement file open counter */


      FATFS* fs,          /* File system object */


      UINT i                /* Semaphore index */


)


主要调用的地方是f_open()和f_close()函数


3、支持文件的快速定位。


这是FatFs作者在3月份新上传的R008 Rev1版本里新增加的功能


ffconf.h 定义了_USE_FASTSEEK,用于支持文件的快速定位。


FRESULT f_lseek (


      FIL *fp,        /* Pointer to the file object */


      DWORD ofs,            /* File pointer from top of file */


      DWORD *tbl            /* Pointer to cluster link map table */


)


说明是这样描述的:


The f_lseek function has been changed to implement fast seek feature. But the additional 3rd argument is ignored unless fast seek feature is enabled (_USE_FASTSEEK == 1). To use this feature, give a pointer to the working buffer to store the cluster link map to the 3rd argument.


主要意思是在内存中划一块缓冲区用于存储 文件的簇链映射图,以方便查找簇链。稍微阅读了以下源代码,其实现方法是这样的:当给出参数ofs == CREATE_LINKMAP的时候,在tbl所指向的内存区域建立新的簇链映射。


表的第一项是整个映射表的长度,以后每两项为一对前者存储相邻簇的数目,后者存储相邻簇的起始簇号。举个例子,某个文件占据56781516177个簇,则需要两对表项。分别是45)和(315两项。


以后就可以利用该簇链映射图实现文件的快速定位了,不用沿着簇链一项一项找下去,最后实现定位。


4、支持长文件名缓冲区的动态分配。


这是FatFs作者在3月份新上传的R008 Rev1版本里新增加的功能


这个主要靠运行时系统动态内存分配,这里就不再详细叙述了。


 


以上的功能实现和使用,我都会一直关注。如果以后学习过程中需要用到或者我的开发板满足使用要求了,再去实验这些功能。


 


 


 


 


 

文章评论0条评论)

登录后参与讨论
我要评论
0
5
关闭 站长推荐上一条 /2 下一条