/* Scheduler include files. */
#include "FreeRTOS.h"
#include "task.h"
/* Hardware specific headers */
#include "board.h"
/*Modules Header files*/
#include "rtc\rtcTask.h"
#include "fatfs\ff.h"
#include "fatfs\diskio.h"
/*Global const*/
/*Defines*/
/*Global vars*/
//Data for the demo task
xTaskHandle xFatFsDemoHandle;
//For the Filesystem
FATFS fs; // Work area (file system object) for logical drive
FIL fsrc, fdst; // file objects
FRESULT res; // FatFs function common result code
UINT br, bw; // File R/W count
portCHAR buffer[1000];
/*Functions and Tasks*/
static void prvSetupHardware( void );
static void vFatFsDemo( void *pvParameters );
/*Main Program*/
int main( void )
{
/* Setup the ports */
prvSetupHardware();
/*Start and Init RTC*/
vRtcTaskStart();
/*Tasks Start-up*/
xTaskCreate( vFatFsDemo, "FatFsDemo", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY + 1, &xFatFsDemoHandle );
/*Start the scheduler.
NOTE : Tasks run in system mode and the scheduler runs in Supervisor mode.
The processor MUST be in supervisor mode when vTaskStartScheduler is
called. The demo applications included in the FreeRTOS.org download switch
to supervisor mode prior to main being called. If you are not using one of
these demo application projects then ensure Supervisor mode is used here. */
vTaskStartScheduler();
/* Should never get here! */
return 0;
}
/*A Demo of the features in the Graphic LCD driver for FreeRTOS*/
static void vFatFsDemo( void *pvParameters )
{
for ( ; ; )
{
// Register a work area for logical drive 0
res = f_mount(0, &fs);
// Open source file
res = f_open(&fsrc, "srcfile.dat", FA_OPEN_EXISTING | FA_READ);
if (res) {goto vFatFsDemo_finish;}
// Create destination file
res = f_open(&fdst, "dstfile2.dat", FA_CREATE_ALWAYS | FA_WRITE);
if (res) {goto vFatFsDemo_close;}
// Copy source to destination
for ( ; ; )
{
res = f_read(&fsrc, buffer, sizeof(buffer), &br);
if (res > 0) {goto vFatFsDemo_close2;} // error
res = f_write(&fdst, buffer, br, &bw);
if (res || bw < br || (bw < sizeof(buffer))) {goto vFatFsDemo_close2;} // error or disk full
}
vFatFsDemo_close2:
// Close all files
f_close(&fdst);
vFatFsDemo_close:
f_close(&fsrc);
// Unregister a work area before discard it
f_mount(0, NULL);
vFatFsDemo_finish:
vTaskDelete(xFatFsDemoHandle);
}
}
static void prvSetupHardware( void )
{
/* When using the JTAG debugger the hardware is not always initialised to
the correct default state. This line just ensures that this does not
cause all interrupts to be masked at the start. */
AT91C_BASE_AIC->AIC_EOICR = 0;
/* Most setup is performed by the low level init function called from the
startup asm file.
*/
/* Enable the peripheral clock to the PIO */
AT91F_PMC_EnablePeriphClock(AT91C_BASE_PMC, 1 << AT91C_ID_PIOA);
}