| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170 | /*------------------------------------------------------------------------*//* Sample Code of OS Dependent Functions for FatFs                        *//* (C)ChaN, 2018                                                          *//*------------------------------------------------------------------------*/#include "ff.h"#if FF_USE_LFN == 3	/* Dynamic memory allocation *//*------------------------------------------------------------------------*//* Allocate a memory block                                                *//*------------------------------------------------------------------------*/void* ff_memalloc (	/* Returns pointer to the allocated memory block (null if not enough core) */	UINT msize		/* Number of bytes to allocate */){	return malloc(msize);	/* Allocate a new memory block with POSIX API */}/*------------------------------------------------------------------------*//* Free a memory block                                                    *//*------------------------------------------------------------------------*/void ff_memfree (	void* mblock	/* Pointer to the memory block to free (nothing to do if null) */){	free(mblock);	/* Free the memory block with POSIX API */}#endif#if FF_FS_REENTRANT	/* Mutal exclusion *//*------------------------------------------------------------------------*//* Create a Synchronization Object                                        *//*------------------------------------------------------------------------*//* This function is called in f_mount() function to create a new/  synchronization object for the volume, such as semaphore and mutex./  When a 0 is returned, the f_mount() function fails with FR_INT_ERR.*///const osMutexDef_t Mutex[FF_VOLUMES];	/* Table of CMSIS-RTOS mutex */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 */){	/* Win32 */	*sobj = CreateMutex(NULL, FALSE, NULL);	return (int)(*sobj != INVALID_HANDLE_VALUE);	/* uITRON *///	T_CSEM csem = {TA_TPRI,1,1};//	*sobj = acre_sem(&csem);//	return (int)(*sobj > 0);	/* uC/OS-II *///	OS_ERR err;//	*sobj = OSMutexCreate(0, &err);//	return (int)(err == OS_NO_ERR);	/* FreeRTOS *///	*sobj = xSemaphoreCreateMutex();//	return (int)(*sobj != NULL);	/* CMSIS-RTOS *///	*sobj = osMutexCreate(&Mutex[vol]);//	return (int)(*sobj != NULL);}/*------------------------------------------------------------------------*//* 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 an error */	FF_SYNC_t sobj		/* Sync object tied to the logical drive to be deleted */){	/* Win32 */	return (int)CloseHandle(sobj);	/* uITRON *///	return (int)(del_sem(sobj) == E_OK);	/* uC/OS-II *///	OS_ERR err;//	OSMutexDel(sobj, OS_DEL_ALWAYS, &err);//	return (int)(err == OS_NO_ERR);	/* FreeRTOS *///  vSemaphoreDelete(sobj);//	return 1;	/* CMSIS-RTOS *///	return (int)(osMutexDelete(sobj) == osOK);}/*------------------------------------------------------------------------*//* Request Grant to Access the Volume                                     *//*------------------------------------------------------------------------*//* This function is called on entering file functions to lock the volume./  When a 0 is returned, the file function fails with FR_TIMEOUT.*/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 */){	/* Win32 */	return (int)(WaitForSingleObject(sobj, FF_FS_TIMEOUT) == WAIT_OBJECT_0);	/* uITRON *///	return (int)(wai_sem(sobj) == E_OK);	/* uC/OS-II *///	OS_ERR err;//	OSMutexPend(sobj, FF_FS_TIMEOUT, &err));//	return (int)(err == OS_NO_ERR);	/* FreeRTOS *///	return (int)(xSemaphoreTake(sobj, FF_FS_TIMEOUT) == pdTRUE);	/* CMSIS-RTOS *///	return (int)(osMutexWait(sobj, FF_FS_TIMEOUT) == osOK);}/*------------------------------------------------------------------------*//* Release Grant to Access the Volume                                     *//*------------------------------------------------------------------------*//* This function is called on leaving file functions to unlock the volume.*/void ff_rel_grant (	FF_SYNC_t sobj	/* Sync object to be signaled */){	/* Win32 */	ReleaseMutex(sobj);	/* uITRON *///	sig_sem(sobj);	/* uC/OS-II *///	OSMutexPost(sobj);	/* FreeRTOS *///	xSemaphoreGive(sobj);	/* CMSIS-RTOS *///	osMutexRelease(sobj);}#endif
 |