FATFS学习之——多任务支持

FATFS学习之——多任务支持
    新版本的FATFS提供对多任务(RTOS)的支持,FATFS作为对设备操作的函数集,而设备在RTOS环境下作为一种临界资源,必然引入同步和互斥的开概念。
    下载最新FATFS V0.10b版本源码, option目录下有一个syscall.c文件,是对RTOS提供的同步和互斥机制的封装。

一、多任务环境支持的配置ffconf.h中,相关定义如下:
#define _FS_REENTRANT	1		/* 0:Disable or 1:Enable */
#define _FS_TIMEOUT	1000		/* Timeout period in unit of time tick */
#define	_SYNC_t		HANDLE	        /* O/S dependent sync object type. e.g. HANDLE, OS_EVENT*, ID, SemaphoreHandle_t and etc.. */
/* The _FS_REENTRANT option switches the re-entrancy (thread safe) of the FatFs module.
/
/   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.
*/
_SYNC_t作为异步操作对像类型,在RAW-OS中定义为mutex,当然也可以定义为信号量,但这样会引入优先级反转问题。

二、syscall.c源文件中对sync object的实现:
    1. 创建一个异步对像
/*------------------------------------------------------------------------*/
/* Create a Synchronization Object
/*------------------------------------------------------------------------*/
/* This function is called by f_mount() function to create a new
/  synchronization object, such as semaphore and mutex. When a 0 is
/  returned, the f_mount() function fails with FR_INT_ERR.
*/
int ff_cre_syncobj (	/* 1:Function succeeded, 0:Could not create due to any error */
	BYTE vol,	/* Corresponding logical drive being processed */
	_SYNC_t* sobj	/* Pointer to return the created sync object */
)
{
	int ret;
	*sobj = CreateMutex(NULL, FALSE, NULL);		/* Win32 */
	ret = (int)(*sobj != INVALID_HANDLE_VALUE);

//	*sobj = SyncObjects[vol];		
//	ret = 1;

//	*sobj = OSMutexCreate(0, &err);	
//	ret = (int)(err == OS_NO_ERR);

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

	return ret;
}
从上面可以看出,对我们熟知的uC/OS-II来讲,异步对像是一个mutex。该函数返回1表示创建成功。

    2. 同理删除一个同步对像如下所示:
/*------------------------------------------------------------------------*/
/* Delete a Synchronization Object                                        */
/*------------------------------------------------------------------------*/
/* This function is called in f_mount() function to delete a synchronization
/  object that created with ff_cre_syncobj() function. When a 0 is
/  returned, the f_mount() function fails with FR_INT_ERR.
*/
int ff_del_syncobj (	/* 1:Function succeeded, 0:Could not delete due to any error */
	_SYNC_t sobj	/* Sync object tied to the logical drive to be deleted */
)
{
	int ret;
	ret = CloseHandle(sobj);	/* Win32 */
//	ret = 1;					/* uITRON (nothing to do) */

//	OSMutexDel(sobj, OS_DEL_ALWAYS, &err);	/* uC/OS-II */
//	ret = (int)(err == OS_NO_ERR);

//      xSemaphoreDelete(sobj);		/* FreeRTOS */
//	ret = 1;
	return ret;
}

    3. 请求同步对像资源可用
/*------------------------------------------------------------------------*/
/* Request Grant to Access the Volume                                     */
/*------------------------------------------------------------------------*/
/* This function is called on entering file functions to lock the volume.
/  When a FALSE is returned, the file function fails with FR_TIMEOUT.
*/
int ff_req_grant (	/* TRUE:Got a grant to access the volume, FALSE:Could not get a grant */
	_SYNC_t sobj	/* Sync object to wait */
)
{
	int ret;
	ret = (int)(WaitForSingleObject(sobj, _FS_TIMEOUT) == WAIT_OBJECT_0);	/* Win32 */

//	ret = (int)(wai_sem(sobj) == E_OK);			/* uITRON */

//	OSMutexPend(sobj, _FS_TIMEOUT, &err));		/* uC/OS-II */
//	ret = (int)(err == OS_NO_ERR);

//	ret = (int)(xSemaphoreTake(sobj, _FS_TIMEOUT) == pdTRUE); /* FreeRTOS */

	return ret;
}
    从uC/OS-II来看,就是带超时阻塞在一个mutex上,超时时间为_FS_TIMEOUT,它在配置中定义为1000,即1000个OS_Tick。

    4. 释放同步对像供别的任务所用。
/*------------------------------------------------------------------------*/
/* Release Grant to Access the Volume                                     */
/*------------------------------------------------------------------------*/
/* This function is called on leaving file functions to unlock the volume.
*/
void ff_rel_grant (
	_SYNC_t sobj	/* Sync object to be signaled */
)
{
	ReleaseMutex(sobj);		/* Win32 */

//	sig_sem(sobj);			/* uITRON */

//	OSMutexPost(sobj);		/* uC/OS-II */

//	xSemaphoreGive(sobj);/* FreeRTOS */
}

三、 RAW-OS下FATFS多任务支持的代码实现
    1. 配置
#define _FS_REENTRANT	1<span style="white-space:pre">		</span>/* 0:Disable or 1:Enable */
#define _FS_TIMEOUT	100             /* Timeout period in unit of time ticks */
#define	_SYNC_t		RAW_MUTEX *	/* O/S dependent sync object type. e.g. HANDLE, OS_EVENT*, ID and etc.. */

    2. 创建同步对像
int ff_cre_syncobj (	/* TRUE:Function succeeded, FALSE:Could not create due to any error */
	BYTE vol,	/* Corresponding logical drive being processed */
	_SYNC_t *sobj	/* Pointer to return the created sync object */
)
{
	RAW_U16  ret = 0;
	*sobj = mem_4_malloc(sizeof(RAW_MUTEX));/* 为同步对像申请内存空间 */
	ret = raw_mutex_create(*sobj, (RAW_U8 *)"fatfs_lock", RAW_MUTEX_INHERIT_POLICY, 0);

	if (ret == RAW_SUCCESS) {
		ret = 1;
	}	
	return ret;
}
    3. 删除同步对像   
int ff_del_syncobj (	/* TRUE:Function succeeded, FALSE:Could not delete due to any error */
	_SYNC_t sobj	/* Sync object tied to the logical drive to be deleted */
)
{
	RAW_U16  ret = 0;
	ret = raw_mutex_delete(sobj);
	mem_4_free(sobj);
	if (ret == RAW_SUCCESS) {
		ret = 1;
	}	
	return ret;
}
    4. 申请资源可用
int ff_req_grant (	/* TRUE:Got a grant to access the volume, FALSE:Could not get a grant */
	_SYNC_t sobj	/* Sync object to wait */
)
{
	RAW_U16  ret = 0;
	ret = raw_mutex_get(sobj, RAW_WAIT_FOREVER);  /* 阻塞直到资源可用 */ 
	if (ret == RAW_SUCCESS) {
		ret = 1;
	}
	return ret;
}
    4. 释放资源
void ff_rel_grant (
	_SYNC_t sobj	/* Sync object to be signaled */
)
{
	RAW_U16 ret;	
	ret = raw_mutex_put(sobj);
	if (ret != RAW_SUCCESS) {
		RAW_ASSERT(0);
	}
}



 








  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: FATFS是一个文件系统库,主要用于控制闪存设备(如SD卡)。它支持FAT12,FAT16和FAT32文件系统,其中FAT32文件系统是FATFS最大支持的。 FAT32文件系统的容量有一定的限制,单个文件最大支持4GB,单个分区最大支持2TB。但是,FATFS本身还有一些限制,例如最大支持的文件数量和最大支持的文件名长度。因此,FATFS的实际容量可能会低于FAT32文件系统的容量。 希望这个回答能帮到你!如果你有其他问题,请随时联系我。 ### 回答2: FATFS是一种文件系统,它是用于在嵌入式系统中管理存储设备的一种解决方案。FATFS最大支持的容量取决于FAT文件系统的版本和使用的簇大小。 在FAT16文件系统中,最大支持2GB的容量。这是因为FAT16文件系统使用16位的文件表项来管理磁盘上的文件和目录,每个簇的大小固定为32KB。在这种情况下,总的簇数可以用16位表示,而不超过65,536个,每个簇的大小乘以簇的数量就是文件系统的总容量。 然而,在FAT32文件系统中,最大支持的容量增加到了2TB。FAT32文件系统使用32位的文件表项来管理磁盘上的文件和目录,每个簇的大小可以根据需要进行调整,从4KB到32KB不等。因此,可以通过使用更多的簇来扩大文件系统的总容量。 总而言之,FATFS最大支持的容量在FAT16文件系统下是2GB,在FAT32文件系统下是2TB。选择适当的文件系统和簇大小可以根据实际需求来进行存储设备的管理。需要注意的是,实际可用的容量可能会有所偏差,因为文件系统本身需要使用一些存储空间来存储元数据和管理信息。 ### 回答3: FATFS是一个用于嵌入式系统的文件系统,通常用于支持闪存设备、SD卡等外部存储介质。FATFS最大支持的容量取决于使用的FAT文件系统版本。 在FAT16文件系统下,FATFS能够支持最大2GB的容量。这是由于FAT16文件系统中,簇号被限制在16位无符号整数,最大能够表示的簇号数量为65535个,每个簇对应的存储单元大小为32KB,乘以簇号数量得到的最大容量为2GB。 然而,更现代的FAT32文件系统能够支持更大容量的存储设备。FAT32的最大容量取决于簇号的位数。例如,在使用28位簇号的情况下,FAT32能够支持最大的容量为256GB。但是,FAT32文件系统仍然有一些限制,例如单个文件的最大尺寸受到4GB的限制。 总的来说,FATFS能够支持的最大容量取决于所使用的FAT文件系统版本及簇号的位数。随着技术的发展,文件系统的容量限制也在不断提升,但需要根据具体的实际应用情况来选择合适的文件系统版本以支持所需的存储容量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值