下载地址

http://elm-chan.org/fsw/ff/00index_e.html

解压后

doc
src

文档

在doc中有相关介绍文档,提示我们需要不同这六个函数

disk_status
disk_initialize
disk_read
disk_write
disk_ioctl
get_fattime

在src中有readme文件

里面介绍了每个文件的内容

系统

非常重要的问题,在系统中使用需要考虑线程安全问题,在syscall.c中给出了相关的解决方式

使用系统

必须添加syscall.c

不使用系统

只需要添加ff.c和diskio.c

修改文件

diskio.c diskio中的文件进行补全

disk_status,可直接返回0

disk_initialize,写入初始化,如果已经初始化过设备可以直接返回0

disk_read,读函数,需要注意,读指的是读一个block,即512个字节,在设备中需要区分

disk_write,写函数,同上

disk_ioct1,命令相关,该函数需要注意,在配置文件中不一样的配置需要不一样的内容,具体可查看http://elm-chan.org/fsw/ff/doc/dioctl.html

get_fattime,该函数可直接返回0,可添加该函数,如果_FS_NORTC=1不必提供

syscall.c 这里使用了FreeRTOS系统,需要进行修改

在ffconf.h中,需要使能_FS_REENTRANT

#define _FS_REENTRANT	0
#define _FS_TIMEOUT		1000
#define	_SYNC_t			HANDLE
/* The _FS_REENTRANT option switches the re-entrancy (thread safe) of the FatFs
/  module itself. Note that regardless of this option, file access to different
/  volume is always re-entrant and volume control functions, f_mount(), f_mkfs()
/  and f_fdisk() function, are always not re-entrant. Only file/directory access
/  to the same volume is under control of this feature.
/
/   0: Disable re-entrancy. _FS_TIMEOUT and _SYNC_t have no effect.
/   1: Enable re-entrancy. Also user provided synchronization handlers,
/      ff_req_grant(), ff_rel_grant(), ff_del_syncobj() and ff_cre_syncobj()
/      function, must be added to the project. Samples are available in
/      option/syscall.c.
/
/  The _FS_TIMEOUT defines timeout period in unit of time tick.
/  The _SYNC_t defines O/S dependent sync object type. e.g. HANDLE, ID, OS_EVENT*,
/  SemaphoreHandle_t and etc.. A header file for O/S definitions needs to be
/  included somewhere in the scope of ff.c. */

按照提示修改

#define _SYNC_t SemaphoreHandle_t

并且在添加头文件

#include "FreeRTOS.h"
#include "queue.h"
#include "semphr.h"

接下来修改函数部分

按照提示取消FreeTROS屏蔽

// *sobj = xSemaphoreCreateMutex(); /* FreeRTOS */
// ret = (int)(*sobj != NULL);