]> git.sur5r.net Git - freertos/blobdiff - FreeRTOS/Demo/CORTEX_M4_ATSAM4E_Atmel_Studio/src/main_full.c
Add graphics to the SAM4E demo.
[freertos] / FreeRTOS / Demo / CORTEX_M4_ATSAM4E_Atmel_Studio / src / main_full.c
index 34a0c5f7f72fb3e7aa41ff7d958fc23ba6de0eec..e6a5ff01b82669bc8e07f8193c28337f9b0fb490 100644 (file)
 \r
 /* FreeRTOS+UDP includes. */\r
 #include "FreeRTOS_UDP_IP.h"\r
+#include "FreeRTOS_Sockets.h"\r
 \r
-/* Demo application includes. */\r
+/* UDP demo includes. */\r
 #include "UDPCommandInterpreter.h"\r
+#include "TwoEchoClients.h"\r
+\r
+/* Standard demo includes. */\r
+#include "partest.h"\r
+#include "blocktim.h"\r
+#include "flash_timer.h"\r
+#include "semtest.h"\r
+#include "GenQTest.h"\r
+#include "QPeek.h"\r
+#include "IntQueue.h"\r
+#include "countsem.h"\r
+#include "dynamic.h"\r
+#include "QueueOverwrite.h"\r
+#include "QueueSet.h"\r
+#include "recmutex.h"\r
+\r
+/* The period after which the check timer will expire, in ms, provided no errors\r
+have been reported by any of the standard demo tasks.  ms are converted to the\r
+equivalent in ticks using the portTICK_RATE_MS constant. */\r
+#define mainCHECK_TIMER_PERIOD_MS                      ( 3000UL / portTICK_RATE_MS )\r
+\r
+/* The period at which the check timer will expire, in ms, if an error has been\r
+reported in one of the standard demo tasks.  ms are converted to the equivalent\r
+in ticks using the portTICK_RATE_MS constant. */\r
+#define mainERROR_CHECK_TIMER_PERIOD_MS        ( 200UL / portTICK_RATE_MS )\r
+\r
+/* The priorities of the various demo application tasks. */\r
+#define mainSEM_TEST_PRIORITY                          ( tskIDLE_PRIORITY + 1 )\r
+#define mainBLOCK_Q_PRIORITY                           ( tskIDLE_PRIORITY + 2 )\r
+#define mainCOM_TEST_PRIORITY                          ( tskIDLE_PRIORITY + 2 )\r
+#define mainINTEGER_TASK_PRIORITY           ( tskIDLE_PRIORITY )\r
+#define mainGEN_QUEUE_TASK_PRIORITY                    ( tskIDLE_PRIORITY )\r
+#define mainQUEUE_OVERWRITE_TASK_PRIORITY      ( tskIDLE_PRIORITY )\r
+\r
+/* The LED controlled by the 'check' software timer. */\r
+#define mainCHECK_LED                                          ( 2 )\r
+\r
+/* The number of LEDs that should be controlled by the flash software timer\r
+standard demo.  In this case it is only 1 as the starter kit has three LEDs, one\r
+of which is controlled by the check timer and one of which is controlled by the\r
+ISR triggered task. */\r
+#define mainNUM_FLASH_TIMER_LEDS                       ( 1 )\r
+\r
+/* Misc. */\r
+#define mainDONT_BLOCK                                         ( 0 )\r
 \r
 /* Note:  If the application is started without the network cable plugged in \r
 then ipconfigUDP_TASK_PRIORITY should be set to 0 in FreeRTOSIPConfig.h to\r
@@ -86,14 +132,23 @@ passed into the network event hook is eNetworkUp). */
 #define mainDISCONNECTED_IP_TASK_PRIORITY      ( tskIDLE_PRIORITY )\r
 \r
 /* UDP command server task parameters. */\r
-#define mainUDP_CLI_TASK_PRIORITY                                      ( tskIDLE_PRIORITY )\r
-#define mainUDP_CLI_PORT_NUMBER                                                ( 5001UL )\r
-#define mainUDP_CLI_TASK_STACK_SIZE                                    ( configMINIMAL_STACK_SIZE * 2U )\r
+#define mainUDP_CLI_TASK_PRIORITY                      ( tskIDLE_PRIORITY )\r
+#define mainUDP_CLI_PORT_NUMBER                                ( 5001UL )\r
+#define mainUDP_CLI_TASK_STACK_SIZE                    ( configMINIMAL_STACK_SIZE * 2U )\r
 \r
-/* Simple toggles an LED to show the program is running. */\r
-static void prvFlashTimerCallback( xTimerHandle xTimer );\r
+/* Set to 1 to include the UDP echo client tasks. */\r
+#define mainINCLUDE_ECHO_CLIENT_TASKS          1\r
 \r
-/* Creates a set of sample files on a RAM disk. */\r
+/*-----------------------------------------------------------*/\r
+\r
+/*\r
+ * The check timer callback function, as described at the top of this file.\r
+ */\r
+static void prvCheckTimerCallback( xTimerHandle xTimer );\r
+\r
+/* \r
+ * Creates a set of sample files on a RAM disk. \r
+ */\r
 extern void vCreateAndVerifySampleFiles( void );\r
 \r
 /*\r
@@ -106,6 +161,16 @@ extern void vRegisterSampleCLICommands( void );
  */\r
 extern void vRegisterFileSystemCLICommands( void );\r
 \r
+/*\r
+ * Register the UDP related commands that can be used with FreeRTOS+CLI.\r
+ */\r
+extern void vRegisterUDPCLICommands( void );\r
+\r
+/*\r
+ * Initialise the LCD and output a bitmap.\r
+ */\r
+extern void vInitialiseLCD( void );\r
+\r
 /*-----------------------------------------------------------*/\r
 \r
 /* The default IP and MAC address used by the demo.  The address configuration\r
@@ -125,7 +190,10 @@ const uint8_t ucMACAddress[ 6 ] = { configMAC_ADDR0, configMAC_ADDR1, configMAC_
 /*-----------------------------------------------------------*/\r
 int main_full( void )\r
 {\r
-xTimerHandle xFlashTimer;\r
+xTimerHandle xTimer = NULL;\r
+\r
+       /* Initialise the LCD and output the bitmap. */\r
+       vInitialiseLCD();\r
 \r
        /* If the file system is only going to be accessed from one task then\r
        F_FS_THREAD_AWARE can be set to 0 and the set of example files are created\r
@@ -143,21 +211,11 @@ xTimerHandle xFlashTimer;
        }\r
        #endif\r
 \r
-       /* Register generic commands with the FreeRTOS+CLI command interpreter. */\r
+       /* Register example generic, file system related and UDP related CLI \r
+       commands respectively. */\r
        vRegisterSampleCLICommands();\r
-\r
-       /* Register file system related commands with the FreeRTOS+CLI command\r
-       interpreter. */\r
        vRegisterFileSystemCLICommands();\r
-\r
-       /* Create the timer that just toggles an LED to indicate that the \r
-       application is running. */\r
-       xFlashTimer = xTimerCreate( ( const signed char * const ) "Flash", 200 / portTICK_RATE_MS, pdTRUE, NULL, prvFlashTimerCallback );\r
-       configASSERT( xFlashTimer );\r
-       \r
-       /* Start the timer.  As the scheduler is not running a block time cannot be\r
-       used and is set to 0. */\r
-       xTimerStart( xFlashTimer, 0 );\r
+       vRegisterUDPCLICommands();\r
 \r
        /* Initialise the network interface.  Tasks that use the network are\r
        created in the network event hook when the network is connected and ready\r
@@ -167,6 +225,31 @@ xTimerHandle xFlashTimer;
        ipconfigFREERTOS_PLUS_NABTO is set to 1 in FreeRTOSIPConfig.h. */\r
        FreeRTOS_IPInit( ucIPAddress, ucNetMask, ucGatewayAddress, ucDNSServerAddress, ucMACAddress );\r
 \r
+       /* Create all the other standard demo tasks. */\r
+       vStartLEDFlashTimers( mainNUM_FLASH_TIMER_LEDS );\r
+       vCreateBlockTimeTasks();\r
+       vStartSemaphoreTasks( mainSEM_TEST_PRIORITY );\r
+       vStartGenericQueueTasks( mainGEN_QUEUE_TASK_PRIORITY );\r
+       vStartQueuePeekTasks();\r
+       vStartCountingSemaphoreTasks();\r
+       vStartDynamicPriorityTasks();\r
+       vStartQueueOverwriteTask( mainQUEUE_OVERWRITE_TASK_PRIORITY );\r
+       vStartQueueSetTasks();\r
+       vStartRecursiveMutexTasks();\r
+\r
+       /* Create the software timer that performs the 'check' functionality, as\r
+       described at the top of this file. */\r
+       xTimer = xTimerCreate(  ( const signed char * ) "CheckTimer",/* A text name, purely to help debugging. */\r
+                                                       ( mainCHECK_TIMER_PERIOD_MS ),          /* The timer period, in this case 3000ms (3s). */\r
+                                                       pdTRUE,                                                         /* This is an auto-reload timer, so xAutoReload is set to pdTRUE. */\r
+                                                       ( void * ) 0,                                           /* The ID is not used, so can be set to anything. */\r
+                                                       prvCheckTimerCallback );                        /* The callback function that inspects the status of all the other tasks. */\r
+\r
+       if( xTimer != NULL )\r
+       {\r
+               xTimerStart( xTimer, mainDONT_BLOCK );\r
+       }\r
+\r
        /* Start the scheduler itself. */\r
        vTaskStartScheduler();\r
 \r
@@ -179,14 +262,71 @@ xTimerHandle xFlashTimer;
 }\r
 /*-----------------------------------------------------------*/\r
 \r
-static void prvFlashTimerCallback( xTimerHandle xTimer )\r
+static void prvCheckTimerCallback( xTimerHandle xTimer )\r
 {\r
-       /* The parameter is not used. */\r
+static long lChangedTimerPeriodAlready = pdFALSE;\r
+unsigned long ulErrorOccurred = pdFALSE;\r
+\r
+       /* Avoid compiler warnings. */\r
        ( void ) xTimer;\r
-       \r
-       /* Timer callback function that does nothing other than toggle an LED to\r
-       indicate that the application is still running. */\r
-       ioport_toggle_pin_level( LED0_GPIO );\r
+\r
+       /* Have any of the standard demo tasks detected an error in their\r
+       operation? */\r
+       if( xAreGenericQueueTasksStillRunning() != pdTRUE )\r
+       {\r
+               ulErrorOccurred |= ( 0x01UL << 3UL );\r
+       }\r
+       else if( xAreQueuePeekTasksStillRunning() != pdTRUE )\r
+       {\r
+               ulErrorOccurred |= ( 0x01UL << 4UL );\r
+       }\r
+       else if( xAreBlockTimeTestTasksStillRunning() != pdTRUE )\r
+       {\r
+               ulErrorOccurred |= ( 0x01UL << 5UL );\r
+       }\r
+       else if( xAreSemaphoreTasksStillRunning() != pdTRUE )\r
+       {\r
+               ulErrorOccurred |= ( 0x01UL << 6UL );\r
+       }\r
+       else if( xAreCountingSemaphoreTasksStillRunning() != pdTRUE )\r
+       {\r
+               ulErrorOccurred |= ( 0x01UL << 8UL );\r
+       }\r
+       else if( xAreDynamicPriorityTasksStillRunning() != pdTRUE )\r
+       {\r
+               ulErrorOccurred |= ( 0x01UL << 9UL );\r
+       }\r
+       else if( xIsQueueOverwriteTaskStillRunning() != pdTRUE )\r
+       {\r
+               ulErrorOccurred |= ( 0x01UL << 10UL );\r
+       }\r
+       else if( xAreQueueSetTasksStillRunning() != pdTRUE )\r
+       {\r
+               ulErrorOccurred |= ( 0x01UL << 11UL );\r
+       }\r
+       else if( xAreRecursiveMutexTasksStillRunning() != pdTRUE )\r
+       {\r
+               ulErrorOccurred |= ( 0x01UL << 12UL );\r
+       }\r
+\r
+       if( ulErrorOccurred != pdFALSE )\r
+       {\r
+               /* An error occurred.  Increase the frequency at which the check timer\r
+               toggles its LED to give visual feedback of the potential error\r
+               condition. */\r
+               if( lChangedTimerPeriodAlready == pdFALSE )\r
+               {\r
+                       lChangedTimerPeriodAlready = pdTRUE;\r
+\r
+                       /* This call to xTimerChangePeriod() uses a zero block time.\r
+                       Functions called from inside of a timer callback function must\r
+                       *never* attempt to block as to do so could impact other software\r
+                       timers. */\r
+                       xTimerChangePeriod( xTimer, ( mainERROR_CHECK_TIMER_PERIOD_MS ), mainDONT_BLOCK );\r
+               }\r
+       }\r
+\r
+       vParTestToggleLED( mainCHECK_LED );\r
 }\r
 /*-----------------------------------------------------------*/\r
 \r
@@ -194,6 +334,9 @@ static void prvFlashTimerCallback( xTimerHandle xTimer )
 void vApplicationIPNetworkEventHook( eIPCallbackEvent_t eNetworkEvent )\r
 {\r
 static long lTasksAlreadyCreated = pdFALSE;\r
+const unsigned long ulXCoord = 3, ulYCoord = 3, ulIPAddressOffset = 45;\r
+unsigned long ulIPAddress;\r
+char cIPAddress[ 20 ];\r
 \r
        /* Note:  If the application is started without the network cable plugged in\r
        then ipconfigUDP_TASK_PRIORITY should be set to 0 in FreeRTOSIPConfig.h to\r
@@ -205,14 +348,27 @@ static long lTasksAlreadyCreated = pdFALSE;
        passed into the network event hook is eNetworkUp). */\r
        if( eNetworkEvent == eNetworkUp )\r
        {\r
-               vTaskPrioritySet( NULL, mainCONNECTED_IP_TASK_PRIORITY );\r
-\r
                if( lTasksAlreadyCreated == pdFALSE )\r
                {               \r
                        /* Create the task that handles the CLI on a UDP port.  The port number\r
                        is set using the configUDP_CLI_PORT_NUMBER setting in FreeRTOSConfig.h. */\r
                        vStartUDPCommandInterpreterTask( mainUDP_CLI_TASK_STACK_SIZE, mainUDP_CLI_PORT_NUMBER, mainUDP_CLI_TASK_PRIORITY );\r
+                       \r
+                       #if( mainINCLUDE_ECHO_CLIENT_TASKS == 1 )\r
+                       {\r
+                               vStartEchoClientTasks( configMINIMAL_STACK_SIZE, tskIDLE_PRIORITY );\r
+                       }\r
+                       #endif\r
                }\r
+               \r
+               /* Obtain the IP address, convert it to a string, then display. */\r
+               FreeRTOS_GetAddressConfiguration( &ulIPAddress, NULL, NULL, NULL );\r
+               FreeRTOS_inet_ntoa( ulIPAddress, cIPAddress );\r
+               ili93xx_draw_string( ulXCoord, ulYCoord, ( uint8_t * ) "IP: " );\r
+               ili93xx_draw_string( ulXCoord + ulIPAddressOffset, ulYCoord, ( uint8_t * ) cIPAddress );\r
+               \r
+               /* Set the IP task up to the desired priority now it has connected. */\r
+               vTaskPrioritySet( NULL, mainCONNECTED_IP_TASK_PRIORITY );\r
        }\r
 \r
        if( eNetworkEvent == eNetworkDown )\r
@@ -245,7 +401,24 @@ void vFullDemoIdleHook( void )
        }\r
        #endif\r
 }\r
+/*-----------------------------------------------------------*/\r
 \r
+void vFullDemoTickHook( void )\r
+{\r
+       /* Call the periodic queue overwrite from ISR demo. */\r
+       vQueueOverwritePeriodicISRDemo();\r
 \r
+       /* Call the queue set ISR test function. */\r
+       vQueueSetAccessQueueSetFromISR();\r
+}\r
+/*-----------------------------------------------------------*/\r
 \r
+/* Called automatically when a reply to an outgoing ping is received. */\r
+void vApplicationPingReplyHook( ePingReplyStatus_t eStatus, uint16_t usIdentifier )\r
+{\r
+       /* This demo has nowhere to output any information so does nothing. */\r
+       ( void ) usIdentifier;\r
+       ( void ) eStatus;\r
+}\r
+/*-----------------------------------------------------------*/\r
 \r