Giter VIP home page Giter VIP logo

fatfs's People

Contributors

abbrev avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

fatfs's Issues

R0.14 : Volume mutex dead-loked => transfer to FatFs forum

Transfer to : http://elm-chan.org/fsw/ff/bd/?show=3629

Hello,

We are using fatFs R0.14 with freeRtos 10.3.1

At boot, we have a locked volume, the function lock_fs fails. The mutex is locked by one of our task, but this task is not blocked and we have more than 70% of idle. So, we made sure that this task has taken the mutex and have not been blocked (in fopen or fclose) before releasing the mutex. The task which locks the mutex have done some fopen and fclose and it seems that fatFs is not releasing the mutex. This trouble only happens very rarely, otherwise our device boots fine. For information, at boot, many tasks access the filesystem.

The first error code, on our console, is an fclose error (9). But it may be the cause or the first symptom.

To interface fatFs with freeRtos we are using this file (compilation with portENTER_CRITICAL and FF_FS_REENTRANT defined):

/*------------------------------------------------------------------------*/
/* Sample Code of OS Dependent Functions for FatFs                        */
/* (C)ChaN, 2018                                                          */
/*------------------------------------------------------------------------*/


#include "fatFs/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 */
)
{
#if defined portENTER_CRITICAL
  return pvPortMalloc(msize);
#else
	return malloc(msize);	/* Allocate a new memory block with POSIX API */
#endif
}


/*------------------------------------------------------------------------*/
/* Free a memory block                                                    */
/*------------------------------------------------------------------------*/

void ff_memfree (
	void* mblock	/* Pointer to the memory block to free (nothing to do if null) */
)
{
#if defined portENTER_CRITICAL
  vPortFree(mblock);
#else
	free(mblock);	/* Free the memory block with POSIX API */
#endif
}

#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 */
)
{
#if defined(_WIN32) /* Win32 */
	*sobj = CreateMutex(NULL, FALSE, NULL);
	return (int)(*sobj != INVALID_HANDLE_VALUE);
#endif

	/* 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);

#if defined(portENTER_CRITICAL)   /* FreeRTOS */
	(void)vol;
	*sobj = xSemaphoreCreateMutex();
	return (int)(*sobj != NULL);
#endif

#if defined(osCMSIS) /* CMSIS-RTOS */
	*sobj = osMutexCreate(&Mutex[vol]);
	return (int)(*sobj != NULL);
#endif
}


/*------------------------------------------------------------------------*/
/* 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 */
)
{
#if defined(_WIN32) /* Win32 */
	return (int)CloseHandle(sobj);
#endif

	/* 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);

#if defined(portENTER_CRITICAL)   /* FreeRTOS */
  vSemaphoreDelete(sobj);
	return 1;
#endif

#if defined(osCMSIS) /* CMSIS-RTOS */
	return (int)(osMutexDelete(sobj) == osOK);
#endif
}


/*------------------------------------------------------------------------*/
/* 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 */
)
{
#if defined(_WIN32) /* Win32 */
	return (int)(WaitForSingleObject(sobj, FF_FS_TIMEOUT) == WAIT_OBJECT_0);
#endif

	/* 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);

#if defined(portENTER_CRITICAL)   /* FreeRTOS */
	return (int)(xSemaphoreTake(sobj, FF_FS_TIMEOUT) == pdTRUE);
#endif

#if defined(osCMSIS) /* CMSIS-RTOS */
	return (int)(osMutexWait(sobj, FF_FS_TIMEOUT) == osOK);
#endif
}


/*------------------------------------------------------------------------*/
/* 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 */
)
{
#if defined(_WIN32) /* Win32 */
	ReleaseMutex(sobj);
#endif

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

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

#if defined(portENTER_CRITICAL)   /* FreeRTOS */
	xSemaphoreGive(sobj);
#endif

#if defined(osCMSIS) /* CMSIS-RTOS */
	osMutexRelease(sobj);
#endif
}

#endif

Can't compile FATFS

When I try to compile my project I get all of these errors:
/usr/bin/ld: diskio.o: in function `disk_status': diskio.c:(.text+0x31): undefined reference to `MMC_disk_status' /usr/bin/ld: diskio.c:(.text+0x41): undefined reference to `RAM_disk_status' /usr/bin/ld: diskio.c:(.text+0x51): undefined reference to `USB_disk_status' /usr/bin/ld: diskio.o: in function `disk_initialize': diskio.c:(.text+0x91): undefined reference to `MMC_disk_initialize' /usr/bin/ld: diskio.c:(.text+0xa1): undefined reference to `RAM_disk_initialize' /usr/bin/ld: diskio.c:(.text+0xb1): undefined reference to `USB_disk_initialize' /usr/bin/ld: diskio.o: in function `disk_read': diskio.c:(.text+0x100): undefined reference to `MMC_disk_read' /usr/bin/ld: diskio.c:(.text+0x128): undefined reference to `RAM_disk_read' /usr/bin/ld: diskio.c:(.text+0x150): undefined reference to `USB_disk_read' /usr/bin/ld: diskio.o: in function `disk_write': diskio.c:(.text+0x1b0): undefined reference to `MMC_disk_write' /usr/bin/ld: diskio.c:(.text+0x1d8): undefined reference to `RAM_disk_write' /usr/bin/ld: diskio.c:(.text+0x200): undefined reference to `USB_disk_write' /usr/bin/ld: ff.o: in function `f_open': ff.c:(.text+0x1a1c): undefined reference to `get_fattime' /usr/bin/ld: ff.o: in function `f_sync': ff.c:(.text+0x20f3): undefined reference to `get_fattime' /usr/bin/ld: ff.o: in function `f_mkdir': ff.c:(.text+0x2e10): undefined reference to `get_fattime' /usr/bin/ld: ff.c:(.text+0x2f01): undefined reference to `get_fattime' /usr/bin/ld: ff.c:(.text+0x2f1d): undefined reference to `get_fattime' /usr/bin/ld: ff.o:ff.c:(.text+0x2f31): more undefined references to `get_fattime' follow collect2: error: ld returned 1 exit status ld: diskio.o: in function `disk_status': diskio.c:(.text+0x31): undefined reference to `MMC_disk_status' ld: diskio.c:(.text+0x41): undefined reference to `RAM_disk_status' ld: diskio.c:(.text+0x51): undefined reference to `USB_disk_status' ld: diskio.o: in function `disk_initialize': diskio.c:(.text+0x91): undefined reference to `MMC_disk_initialize' ld: diskio.c:(.text+0xa1): undefined reference to `RAM_disk_initialize' ld: diskio.c:(.text+0xb1): undefined reference to `USB_disk_initialize' ld: diskio.o: in function `disk_read': diskio.c:(.text+0x100): undefined reference to `MMC_disk_read' ld: diskio.c:(.text+0x128): undefined reference to `RAM_disk_read' ld: diskio.c:(.text+0x150): undefined reference to `USB_disk_read' ld: diskio.o: in function `disk_write': diskio.c:(.text+0x1b0): undefined reference to `MMC_disk_write' ld: diskio.c:(.text+0x1d8): undefined reference to `RAM_disk_write' ld: diskio.c:(.text+0x200): undefined reference to `USB_disk_write' ld: ff.o: in function `f_open': ff.c:(.text+0x1a1c): undefined reference to `get_fattime' ld: ff.o: in function `f_sync': ff.c:(.text+0x20f3): undefined reference to `get_fattime' ld: ff.o: in function `f_mkdir': ff.c:(.text+0x2e10): undefined reference to `get_fattime' ld: ff.c:(.text+0x2f01): undefined reference to `get_fattime' ld: ff.c:(.text+0x2f1d): undefined reference to `get_fattime' ld: ff.o:ff.c:(.text+0x2f31): more undefined references to `get_fattime' follow
I have tried changing the ffconf.h file but I still get the same results every time.
Is there something I am missing?
Thank you for the help in advanced!

exFat, 128GB, f_mkfs->F_INT_ERR

Test Enviroment:

128GB TF card; freespace: 20GB; 1000 files in root directory, 100MB for each file; exFat

Issue:

  1. try to create a new directory with f_mkfs, and it returns FR_INT_ERR
  2. tracked the code, it has been found that the FR_INT_ERR was from the function load_xdir(). And according to the code comments, there is an invalid order which result in the FR_INT_ERR.

Question:

Is there some parameter must be configured, or some parameter must be given a specific value?

fatfs can't recognize FAT32 image (32MB) created by shell command

i just create empty FAT32 image file with raspberry pi, the command bellow:

$ dd if=/dev/zero of=img.bin bs=1M count=32
$ mkfs -t vfat -F 32 -n BOOT img.bin > /dev/null 2>&1
$ mount -t vfat img.bin  /mnt                # mount it sucessfully!

then, i modify diskio.c to read image, the code just like that:

DRESULT disk_read (
	BYTE pdrv,		/* Physical drive nmuber to identify the drive */
	BYTE *buff,		/* Data buffer to store read data */
	LBA_t sector,	/* Start sector in LBA */
	UINT count		/* Number of sectors to read */
)
{
    FILE* fp = fopen("img.bin", "rb");
    fseek(fp, sector * FF_MIN_SS, SEEK_SET);
    fread(buff, FF_MIN_SS, count, fp);
    fclose(fp);
    return 0;
}

when i call “f_mount(&fatfs, "0:", 1);”,it return 13, so i debug it with codeblocks. the source code bellow make me confused:

static FRESULT mount_volume (){    # file: ff.c,  line: 33323
    ...
		nclst = (tsect - sysect) / fs->csize;			/* Number of clusters */
		if (nclst == 0) return FR_NO_FILESYSTEM;
		fmt = 0;
		if (nclst <= MAX_FAT32) fmt = FS_FAT32;        
		if (nclst <= MAX_FAT16) fmt = FS_FAT16;   // my image size  is 32MB, it set fmt equal to FS_FAT16
		if (nclst <= MAX_FAT12) fmt = FS_FAT12;
		if (fmt == 0) return FR_NO_FILESYSTEM;
               ...
		if (fmt == FS_FAT32) {
			if (ld_word(fs->win + BPB_FSVer32) != 0) return FR_NO_FILESYSTEM;
			if (fs->n_rootdir != 0) return FR_NO_FILESYSTEM;    // logic different, in other cases(FAT16?)
			fs->dirbase = ld_dword(fs->win + BPB_RootClus32);	
			szbfat = fs->n_fatent * 4;					
		} else {
			if (fs->n_rootdir == 0)	return FR_NO_FILESYSTEM;   // touch here, then return 13, means mount failed 
			fs->dirbase = fs->fatbase + fasize;		
			szbfat = (fmt == FS_FAT16) ?				
				fs->n_fatent * 2 : fs->n_fatent * 3 / 2 + (fs->n_fatent & 1);
		}
    ...
}

my image file is 32MB, i guess this procedure recognize type with img size?howerver, the logic "fs->n_rootdir == 0" is different between FS_FAT32 case and NON FS_FAT32 cases。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.