1、ffconf.h
#define FF_FS_REENTRANT 1
#include <os.h> // O/S definitions */
#define FF_FS_TIMEOUT 1000
#define FF_SYNC_t OS_MUTEX
2、ff.h
FF_SYNC_t sobj改为指针参数:FF_SYNC_t *sobj
/* Sync functions */
#if FF_FS_REENTRANT
int ff_cre_syncobj (BYTE vol, FF_SYNC_t* sobj); /* Create a sync object */
int ff_req_grant (FF_SYNC_t *sobj); /* Lock sync object */
void ff_rel_grant (FF_SYNC_t *sobj); /* Unlock sync object */
int ff_del_syncobj (FF_SYNC_t *sobj); /* Delete a sync object */
#endif
3、ffsytem.c
int ff_cre_syncobj ( /* 1:Function succeeded, 0:Could not create the sync object */
BYTE vol, /* Corresponding volume (logical drive number) */
FF_SYNC_t* sobj /* Pointer to return the created sync object */
)
{
memset(sobj, 0, sizeof(OS_MUTEX));
OSMutexCreate(sobj,"fatfs", &err);
return (int)(err == OS_ERR_NONE);
}
int ff_del_syncobj ( /* 1:Function succeeded, 0:Could not delete due to an error */
FF_SYNC_t *sobj /* Sync object tied to the logical drive to be deleted */
)
{
/* uC/OS-II */
OS_ERR err;
OSMutexDel(sobj, OS_OPT_DEL_ALWAYS, &err);
return (int)(err == OS_ERR_NONE);
}
int ff_req_grant ( /* 1:Got a grant to access the volume, 0:Could not get a grant */
FF_SYNC_t *sobj /* Sync object to wait */
)
{
/* uC/OS-II
请求互斥型信号量
timeout:指定等待互斥信号量的超时时间(时钟节拍数),
如果在指定的时间内互斥信号量没有释放,
则允许任务恢复执行。该值设置为0的话,
表示任务将会一直等待下去,
直到信号量被释放掉*/
OS_ERR err;
OSMutexPend(sobj, FF_FS_TIMEOUT,OS_OPT_PEND_BLOCKING,0,&err);
return (int)(err == OS_ERR_NONE);
}
void ff_rel_grant (
FF_SYNC_t *sobj /* Sync object to be signaled */
)
{
/* uC/OS-II 发送互斥信号量
通过调用函数OSMutexPost()来释放互斥型信号量,
只有之前调用过函数OSMutexPend()获取互斥信号量,
才需要调用OSMutexPost()函数来释放这个互斥信号量*/
OS_ERR err;
OSMutexPost(sobj,OS_OPT_POST_NONE,&err);
}