]> git.sur5r.net Git - freertos/blobdiff - Demo/PC/main.c
Configure release configuration for the Win32 lwIP project.
[freertos] / Demo / PC / main.c
index c0998dd0c8d43c817aef9b6f304dd54d7d0237c5..0250b1267c9bd4c6b55577a559dcfc349e2c1462 100644 (file)
@@ -1,37 +1,54 @@
 /*\r
-       FreeRTOS.org V4.7.0 - Copyright (C) 2003-2007 Richard Barry.\r
-\r
-       This file is part of the FreeRTOS.org distribution.\r
-\r
-       FreeRTOS.org is free software; you can redistribute it and/or modify\r
-       it under the terms of the GNU General Public License as published by\r
-       the Free Software Foundation; either version 2 of the License, or\r
-       (at your option) any later version.\r
-\r
-       FreeRTOS.org is distributed in the hope that it will be useful,\r
-       but WITHOUT ANY WARRANTY; without even the implied warranty of\r
-       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
-       GNU General Public License for more details.\r
-\r
-       You should have received a copy of the GNU General Public License\r
-       along with FreeRTOS.org; if not, write to the Free Software\r
-       Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\r
-\r
-       A special exception to the GPL can be applied should you wish to distribute\r
-       a combined work that includes FreeRTOS.org, without being obliged to provide\r
-       the source code for any proprietary components.  See the licensing section \r
-       of http://www.FreeRTOS.org for full details of how and when the exception\r
-       can be applied.\r
-\r
-       ***************************************************************************\r
-       See http://www.FreeRTOS.org for documentation, latest information, license \r
-       and contact details.  Please ensure to read the configuration and relevant \r
-       port sections of the online documentation.\r
-\r
-       Also see http://www.SafeRTOS.com a version that has been certified for use\r
-       in safety critical systems, plus commercial licensing, development and\r
-       support options.\r
-       ***************************************************************************\r
+    FreeRTOS V7.0.2 - Copyright (C) 2011 Real Time Engineers Ltd.\r
+       \r
+\r
+    ***************************************************************************\r
+     *                                                                       *\r
+     *    FreeRTOS tutorial books are available in pdf and paperback.        *\r
+     *    Complete, revised, and edited pdf reference manuals are also       *\r
+     *    available.                                                         *\r
+     *                                                                       *\r
+     *    Purchasing FreeRTOS documentation will not only help you, by       *\r
+     *    ensuring you get running as quickly as possible and with an        *\r
+     *    in-depth knowledge of how to use FreeRTOS, it will also help       *\r
+     *    the FreeRTOS project to continue with its mission of providing     *\r
+     *    professional grade, cross platform, de facto standard solutions    *\r
+     *    for microcontrollers - completely free of charge!                  *\r
+     *                                                                       *\r
+     *    >>> See http://www.FreeRTOS.org/Documentation for details. <<<     *\r
+     *                                                                       *\r
+     *    Thank you for using FreeRTOS, and thank you for your support!      *\r
+     *                                                                       *\r
+    ***************************************************************************\r
+\r
+\r
+    This file is part of the FreeRTOS distribution.\r
+\r
+    FreeRTOS is free software; you can redistribute it and/or modify it under\r
+    the terms of the GNU General Public License (version 2) as published by the\r
+    Free Software Foundation AND MODIFIED BY the FreeRTOS exception.\r
+    >>>NOTE<<< The modification to the GPL is included to allow you to\r
+    distribute a combined work that includes FreeRTOS without being obliged to\r
+    provide the source code for proprietary components outside of the FreeRTOS\r
+    kernel.  FreeRTOS is distributed in the hope that it will be useful, but\r
+    WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\r
+    or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for\r
+    more details. You should have received a copy of the GNU General Public\r
+    License and the FreeRTOS license exception along with FreeRTOS; if not it\r
+    can be viewed here: http://www.freertos.org/a00114.html and also obtained\r
+    by writing to Richard Barry, contact details for whom are available on the\r
+    FreeRTOS WEB site.\r
+\r
+    1 tab == 4 spaces!\r
+\r
+    http://www.FreeRTOS.org - Documentation, latest information, license and\r
+    contact details.\r
+\r
+    http://www.SafeRTOS.com - A version that is certified for use in safety\r
+    critical systems.\r
+\r
+    http://www.OpenRTOS.com - Commercial support, development, porting,\r
+    licensing and training services.\r
 */\r
 \r
 /**\r
 #define mainSEMAPHORE_TASK_PRIORITY    ( tskIDLE_PRIORITY + 1 )\r
 #define mainGENERIC_QUEUE_PRIORITY     ( tskIDLE_PRIORITY )\r
 \r
-#define mainPRINT_STACK_SIZE           ( ( unsigned portSHORT ) 512 )\r
-#define mainDEBUG_LOG_BUFFER_SIZE      ( ( unsigned portSHORT ) 20480 )\r
+#define mainPRINT_STACK_SIZE           ( ( unsigned short ) 512 )\r
+#define mainDEBUG_LOG_BUFFER_SIZE      ( ( unsigned short ) 20480 )\r
 \r
 /* The number of flash co-routines to create. */\r
 #define mainNUM_FLASH_CO_ROUTINES      ( 8 )\r
@@ -127,11 +144,11 @@ static void       prvCheckForKeyPresses( void );
 /* Buffer used by the trace visualisation utility so only needed if the trace\r
 being used. */\r
 #if configUSE_TRACE_FACILITY == 1\r
-       static portCHAR pcWriteBuffer[ mainDEBUG_LOG_BUFFER_SIZE ];\r
+       static char pcWriteBuffer[ mainDEBUG_LOG_BUFFER_SIZE ];\r
 #endif\r
 \r
 /* Constant definition used to turn on/off the pre-emptive scheduler. */\r
-static const portSHORT sUsingPreemption = configUSE_PREEMPTION;\r
+static const short sUsingPreemption = configUSE_PREEMPTION;\r
 \r
 /* Start the math tasks appropriate to the build.  The Borland port does\r
 not yet support floating point so uses the integer equivalent. */\r
@@ -140,9 +157,17 @@ static void prvStartMathTasks( void );
 /* Check which ever tasks are relevant to this build. */\r
 static portBASE_TYPE prvCheckMathTasksAreStillRunning( void );\r
 \r
+/* Used to demonstrate the "task switched in" callback function. */\r
+static portBASE_TYPE prvExampleTaskHook( void * pvParameter );\r
+\r
+/* Just used to count the number of times the example task callback function is\r
+called, and the number of times a queue send passes. */\r
+static unsigned long long uxCheckTaskHookCallCount = 0;\r
+static unsigned long long uxQueueSendPassedCount = 0;\r
+\r
 /*-----------------------------------------------------------*/\r
 \r
-portSHORT main( void )\r
+short main( void )\r
 {\r
        /* Initialise hardware and utilities. */\r
        vParTestInitialise();\r
@@ -187,18 +212,53 @@ portSHORT main( void )
 }\r
 /*-----------------------------------------------------------*/\r
 \r
+static portBASE_TYPE prvExampleTaskHook( void * pvParameter )\r
+{\r
+       if( pvParameter != ( void * ) 0xabcd )\r
+       {\r
+               /* The parameter did not contain the value we expected, so cause an\r
+               error to be detected by setting the call count back to zero. */\r
+               uxCheckTaskHookCallCount = 0;\r
+       }\r
+       else\r
+       {\r
+               /* Simply increment a number so we know the callback has been executed. */\r
+               uxCheckTaskHookCallCount++;\r
+       }\r
+\r
+       return 0;\r
+}\r
+/*-----------------------------------------------------------*/\r
+\r
+void vMainQueueSendPassed( void )\r
+{\r
+       /* This is just an example implementation of the "queue send" trace hook. */\r
+       uxQueueSendPassedCount++;\r
+}\r
+/*-----------------------------------------------------------*/\r
+\r
 static void vErrorChecks( void *pvParameters )\r
 {\r
 portTickType xExpectedWakeTime;\r
 const portTickType xPrintRate = ( portTickType ) 5000 / portTICK_RATE_MS;\r
-const portLONG lMaxAllowableTimeDifference = ( portLONG ) 0;\r
+const long lMaxAllowableTimeDifference = ( long ) 0;\r
 portTickType xWakeTime;\r
-portLONG lTimeDifference;\r
-const portCHAR *pcReceivedMessage;\r
-const portCHAR * const pcTaskBlockedTooLongMsg = "Print task blocked too long!\r\n";\r
+long lTimeDifference;\r
+const char *pcReceivedMessage;\r
+const char * const pcTaskBlockedTooLongMsg = "Print task blocked too long!\r\n";\r
+const char * const pcUnexpectedHookValueMsg = "Task hook has unexpected value!\r\n";\r
 \r
        ( void ) pvParameters;\r
 \r
+       /* Register our callback function. */\r
+       vTaskSetApplicationTaskTag( NULL, prvExampleTaskHook );\r
+       \r
+       /* Just for test purposes. */\r
+       if( xTaskGetApplicationTaskTag( NULL ) != prvExampleTaskHook )\r
+       {\r
+               vPrintDisplayMessage( &pcUnexpectedHookValueMsg );\r
+       }\r
+\r
        /* Loop continuously, blocking, then checking all the other tasks are still\r
        running, before blocking once again.  This task blocks on the queue of\r
        messages that require displaying so will wake either by its time out expiring,\r
@@ -225,11 +285,11 @@ const portCHAR * const pcTaskBlockedTooLongMsg = "Print task blocked too long!\r
                        time we should have unblocked. */\r
                        if( xWakeTime > xExpectedWakeTime )\r
                        {\r
-                               lTimeDifference = ( portLONG ) ( xWakeTime - xExpectedWakeTime );\r
+                               lTimeDifference = ( long ) ( xWakeTime - xExpectedWakeTime );\r
                        }\r
                        else\r
                        {\r
-                               lTimeDifference = ( portLONG ) ( xExpectedWakeTime - xWakeTime );\r
+                               lTimeDifference = ( long ) ( xExpectedWakeTime - xWakeTime );\r
                        }\r
 \r
                        if( lTimeDifference > lMaxAllowableTimeDifference )\r
@@ -263,7 +323,7 @@ const portCHAR * const pcTaskBlockedTooLongMsg = "Print task blocked too long!\r
 \r
 static void    prvCheckForKeyPresses( void )\r
 {\r
-portSHORT sIn;\r
+short sIn;\r
 \r
        taskENTER_CRITICAL();\r
                #ifdef DEBUG_BUILD\r
@@ -292,7 +352,7 @@ portSHORT sIn;
                                                        break;\r
 \r
                                case 'e' :      {\r
-                                                               unsigned portLONG ulBufferLength;\r
+                                                               unsigned long ulBufferLength;\r
                                                                ulBufferLength = ulTaskEndTrace();\r
                                                                vWriteBufferToDisk( pcWriteBuffer, ulBufferLength );\r
                                                        }\r
@@ -308,7 +368,8 @@ portSHORT sIn;
 \r
 static void prvCheckOtherTasksAreStillRunning( void )\r
 {\r
-static portSHORT sErrorHasOccurred = pdFALSE;\r
+static short sErrorHasOccurred = pdFALSE;\r
+static unsigned long long uxLastHookCallCount = 0, uxLastQueueSendCount = 0;\r
 \r
        if( prvCheckMathTasksAreStillRunning() != pdTRUE )\r
        {\r
@@ -424,6 +485,32 @@ static portSHORT sErrorHasOccurred = pdFALSE;
                sErrorHasOccurred = pdTRUE;\r
        }\r
 \r
+       /* The hook function associated with this task is called each time the task\r
+       is switched in.  We therefore expect the number of times the callback \r
+       function has been executed to have increrment since the last time this \r
+       function executed. */\r
+       if( uxCheckTaskHookCallCount <= uxLastHookCallCount )\r
+       {\r
+               vDisplayMessage( "Error in task hook call count!\r\n" );\r
+               sErrorHasOccurred = pdTRUE;\r
+       }\r
+       else\r
+       {\r
+               uxLastHookCallCount = uxCheckTaskHookCallCount;\r
+       }\r
+\r
+       /* We would expect some queue sending to occur between calls of this \r
+       function. */\r
+       if( uxQueueSendPassedCount <= uxLastQueueSendCount )\r
+       {\r
+               vDisplayMessage( "Error in queue send hook call count!\r\n" );\r
+               sErrorHasOccurred = pdTRUE;\r
+       }\r
+       else\r
+       {\r
+               uxLastQueueSendCount = uxQueueSendPassedCount;\r
+       }\r
+\r
        if( sErrorHasOccurred == pdFALSE )\r
        {\r
                vDisplayMessage( "OK " );\r