I am trying to set up FAT SL filesystem to run in the FLASH memory of the MPC5748G – I am using a block with a size of 32KB. Initializing, and formatting seem to run fine (the functions return 0), however when I try to create a file using f_open(), it returns a NULL pointer.
What I don’t understand is that the pxFILE struct, that gets returned has other variables filled out, and they seem correct. I’m including a picture from the debugger.
I’m really stuck and don’t understand why this is happening, since the formatting and initializing the system seem to work. I would be grateful for any suggestions.
My code follows.
Main.c:
(...)
xTaskCreate(vfileSystemTestTask, "vfileSystemTestTask", 1024U, NULL, 3, NULL);
vRegisterFileSystemCLICommands();
vTaskStartScheduler();
(...)
fileTasks.c:
void vfileSystemTestTask(void* pvParameters){
status_t ret = STATUS_SUCCESS;
unsigned char ucStatus;
vTaskDelay(500);
// Flash Initialization
ret = FLASH_DRV_Init();
DEV_ASSERT(ret == STATUS_SUCCESS);
vTaskDelay(1500);
// First create the volume.
ucStatus = f_initvolume( flash_initfunc );
// It is expected that the volume is not formatted.
if( ucStatus == F_ERR_NOTFORMATTED ){
// Format the created volume.
ucStatus = f_format( F_FAT12_MEDIA );
UARTPrint("Formatting returns: %d", ucStatus); //returns 0
}
if( ucStatus == F_NO_ERROR ){
UARTPrint("Filesystem already intialised and formatted. ");
}
vTaskDelete(NULL); //tried also with a while loop here. seems to make no difference
}
CLIFuncs.c
(...)
BaseType_t prvTOUCHCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString ){
const char *pcParameter;
BaseType_t xParameterStringLength;
unsigned char ucReturned;
char cFileName[ fsMAX_FILE_NAME_LEN ];
F_FILE *pxFile;
// This function assumes xWriteBufferLen is large enough!
( void ) xWriteBufferLen;
// Obtain the parameter string.
pcParameter = FreeRTOS_CLIGetParameter(
pcCommandString, // The command string itself.
1, // Return the first parameter.
&xParameterStringLength // Store the parameter string length.
);
// Sanity check something was returned.
configASSERT( pcParameter );
// check if the file name isn't tooo big
if (xParameterStringLength < fsMAX_FILE_NAME_LEN){
// Attempt to create the file.
pxFile = f_open( pcParameter, "w" ); //THIS POINTER IS 0x00!!!
sprintf( pcWriteBuffer, "File has been created.");
f_close(pxFile);
}else{
//print that error msg
sprintf( pcWriteBuffer, "Filename too long. Max allowed filename length: %d", fsMAX_FILE_NAME_LEN);
}
strcat( pcWriteBuffer, cliNEW_LINE );
return pdFALSE;
}
(...)
Filesystem specific:
#define F_FLASH_DRIVE0 0
enum
{
MDRIVER_FLASH_NO_ERROR
, MDRIVER_FLASH_ERR_SECTOR = 101
, MDRIVER_FLASH_ERR_NOTAVAILABLE
};
(...)
#define MDRIVER_FLASH_SECTOR_SIZE 512 /* Sector size */
#define MDRIVER_FLASH_VOLUME0_SIZE (512 * 64) /* defintion for size of flashdrive*/
#define MDRIVER_MEM_LONG_ACCESS 0 /* set this value to 1 if 32bit access available WAS 1 */
(...)
F_DRIVER * flash_initfunc ( unsigned long driver_param ){
( void ) driver_param;
if( in_use )
return NULL;
(void)psp_memset( &t_driver, 0, sizeof( F_DRIVER ) );
t_driver.readsector = flash_readsector;
t_driver.writesector = flash_writesector;
t_driver.getphy = flash_getphy;
t_driver.release = flash_release;
t_driver.getstatus = flash_getstatus;
in_use = 1;
return &t_driver;
} // flash_initfunc
FreeRTOSConfig.h:
#define configUSE_PREEMPTION 1
#define configUSE_PORT_OPTIMISED_TASK_SELECTION 1
#define configCPU_CLOCK_HZ ( 40000000UL )
#define configTICK_RATE_HZ ( ( TickType_t ) 1000 )
#define configMAX_PRIORITIES ( 8 )
#define configMINIMAL_STACK_SIZE ( ( unsigned short ) 512 )
#define configMAX_TASK_NAME_LEN ( 12 )
#define configUSE_16_BIT_TICKS 0
#define configIDLE_SHOULD_YIELD 1
#define configUSE_TASK_NOTIFICATIONS 1
#define configUSE_MUTEXES 1
#define configUSE_RECURSIVE_MUTEXES 1
#define configUSE_COUNTING_SEMAPHORES 1
#define configQUEUE_REGISTRY_SIZE 0
#define configUSE_QUEUE_SETS 0
#define configUSE_TIME_SLICING 1
#define configUSE_NEWLIB_REENTRANT 0
#define configENABLE_BACKWARD_COMPATIBILITY 1
#define configNUM_THREAD_LOCAL_STORAGE_POINTERS 2
#define configUSE_APPLICATION_TASK_TAG 0
/* Memory allocation related definitions. */
#define configSUPPORT_STATIC_ALLOCATION 0
#define configSUPPORT_DYNAMIC_ALLOCATION 1
#define configTOTAL_HEAP_SIZE ( ( size_t ) 98304 )
#define configAPPLICATION_ALLOCATED_HEAP 0
/* Hook function related definitions. */
#define configUSE_IDLE_HOOK 0
#define configUSE_TICK_HOOK 0
#define configCHECK_FOR_STACK_OVERFLOW 0
#define configUSE_MALLOC_FAILED_HOOK 0
#define configUSE_DAEMON_TASK_STARTUP_HOOK 1
/* Run time and task stats gathering related definitions. */
#define configGENERATE_RUN_TIME_STATS 0
#define configUSE_TRACE_FACILITY 1
#define configUSE_STATS_FORMATTING_FUNCTIONS 1
/* Co-routine related definitions. */
#define configUSE_CO_ROUTINES 0
#define configMAX_CO_ROUTINE_PRIORITIES ( 2 )
/* Software timer related definitions. */
#define configUSE_TIMERS 1
#define configTIMER_TASK_PRIORITY ( 7 )
#define configTIMER_QUEUE_LENGTH 5
#define configTIMER_TASK_STACK_DEPTH 1024
/* Optional functions - most linkers will remove unused functions anyway. */
#define INCLUDE_vTaskPrioritySet 1
#define INCLUDE_uxTaskPriorityGet 1
#define INCLUDE_vTaskDelete 1
#define INCLUDE_vTaskSuspend 1
#define INCLUDE_vTaskDelayUntil 1
#define INCLUDE_vTaskDelay 1
#define INCLUDE_xTaskGetSchedulerState 1
#define INCLUDE_xTaskGetCurrentTaskHandle 1
#define INCLUDE_uxTaskGetStackHighWaterMark 1
#define INCLUDE_xTaskGetIdleTaskHandle 0
#define INCLUDE_eTaskGetState 1
#define INCLUDE_xEventGroupSetBitFromISR 1
#define INCLUDE_xTimerPendFunctionCall 1
#define INCLUDE_xTaskAbortDelay 1
#define INCLUDE_xTaskGetHandle 1
#define INCLUDE_xTaskResumeFromISR 1
#define INCLUDE_xQueueGetMutexHolder 1
I adapted the CLI functions from the example (‘FreeRTOS_Plus_FAT_SL_with_CLI’), and also noticed that when I run the ‘dir’ command for the first time, it show the message: “Error: f_findfirst() failed.”. Next time I call the function this error message disappears.