abbrev / fatfs Goto Github PK
View Code? Open in Web Editor NEWFatFs - Generic FAT File System Module
License: Other
FatFs - Generic FAT File System Module
License: Other
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
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!
Test Enviroment:
128GB TF card; freespace: 20GB; 1000 files in root directory, 100MB for each file; exFat
Issue:
Question:
Is there some parameter must be configured, or some parameter must be given a specific value?
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。
Building the FatFS library generates a bunch of errors because there are implicit declarations for some methods: I propose adding the following patch that fixes these issues:
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.