]> git.sur5r.net Git - freertos/blobdiff - Demo/PC/main.c
Configure release configuration for the Win32 lwIP project.
[freertos] / Demo / PC / main.c
index 3bd08d5867055284b286a941e240977b5c84a8cc..0250b1267c9bd4c6b55577a559dcfc349e2c1462 100644 (file)
@@ -1,33 +1,54 @@
 /*\r
-       FreeRTOS.org V4.0.5 - Copyright (C) 2003-2006 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
+    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
  * <HR>\r
  */\r
 \r
-/*\r
-Changes from V1.00:\r
-\r
-       + Prevent the call to kbhit() for debug builds as the debugger seems to\r
-         have problems stepping over the call.\r
-\r
-Changes from V1.2.3\r
-\r
-       + The integer and comtest tasks are now used when the cooperative scheduler \r
-         is being used.  Previously they were only used with the preemptive\r
-         scheduler.\r
-\r
-Changes from V1.2.6\r
-\r
-       + Create new tasks as defined by the new demo application file dynamic.c.\r
-\r
-Changes from V2.0.0\r
-\r
-       + Delay periods are now specified using variables and constants of\r
-         portTickType rather than unsigned portLONG.\r
-\r
-Changes from V3.1.1\r
-\r
-       + The tasks defined in the new file "events.c" are now created and \r
-         monitored for errors. \r
-\r
-Changes from V3.2.4\r
-\r
-       + Now includes the flash co-routine demo rather than the flash task demo.\r
-         This is to demonstrate the co-routine functionality.\r
-*/\r
-\r
 #include <stdlib.h>\r
 #include <conio.h>\r
 #include "FreeRTOS.h"\r
@@ -116,6 +105,14 @@ Changes from V3.2.4
 #include "mevents.h"\r
 #include "crhook.h"\r
 #include "blocktim.h"\r
+#include "AltBlock.h"\r
+#include "GenQTest.h"\r
+#include "QPeek.h"\r
+#include "countsem.h"\r
+#include "AltQTest.h"\r
+#include "AltPollQ.h"\r
+#include "AltBlckQ.h"\r
+#include "RecMutex.h"\r
 \r
 /* Priority definitions for the tasks in the demo application. */\r
 #define mainLED_TASK_PRIORITY          ( tskIDLE_PRIORITY + 1 )\r
@@ -125,9 +122,10 @@ Changes from V3.2.4
 #define mainQUEUE_BLOCK_PRIORITY       ( tskIDLE_PRIORITY + 3 )\r
 #define mainCOM_TEST_PRIORITY          ( tskIDLE_PRIORITY + 2 )\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
@@ -146,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
@@ -159,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
@@ -173,11 +179,18 @@ portSHORT main( void )
        vStartPolledQueueTasks( mainQUEUE_POLL_PRIORITY );\r
        vStartBlockingQueueTasks( mainQUEUE_BLOCK_PRIORITY );\r
        vCreateBlockTimeTasks();\r
-       \r
+       vStartGenericQueueTasks( mainGENERIC_QUEUE_PRIORITY );\r
        vStartSemaphoreTasks( mainSEMAPHORE_TASK_PRIORITY );\r
        vStartDynamicPriorityTasks();\r
        vStartMultiEventTasks();\r
-\r
+       vStartQueuePeekTasks();\r
+       vStartCountingSemaphoreTasks();\r
+       vStartAltGenericQueueTasks( mainGENERIC_QUEUE_PRIORITY );\r
+       vCreateAltBlockTimeTasks();\r
+       vStartAltBlockingQueueTasks( mainQUEUE_BLOCK_PRIORITY );        \r
+       vStartAltPolledQueueTasks( mainQUEUE_POLL_PRIORITY );\r
+       vStartRecursiveMutexTasks();\r
+               \r
        /* Create the "Print" task as described at the top of the file. */\r
        xTaskCreate( vErrorChecks, "Print", mainPRINT_STACK_SIZE, NULL, mainPRINT_TASK_PRIORITY, NULL );\r
 \r
@@ -199,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
@@ -237,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
@@ -275,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
@@ -304,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
@@ -320,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
@@ -340,12 +389,24 @@ static portSHORT sErrorHasOccurred = pdFALSE;
                sErrorHasOccurred = pdTRUE;\r
        }\r
 \r
+       if( xAreAltBlockingQueuesStillRunning() != pdTRUE )\r
+       {\r
+               vDisplayMessage( "Alt blocking queues count unchanged!\r\n" );\r
+               sErrorHasOccurred = pdTRUE;\r
+       }\r
+\r
        if( xArePollingQueuesStillRunning() != pdTRUE )\r
        {\r
                vDisplayMessage( "Polling queue count unchanged!\r\n" );\r
                sErrorHasOccurred = pdTRUE;\r
        }\r
 \r
+       if( xAreAltPollingQueuesStillRunning() != pdTRUE )\r
+       {\r
+               vDisplayMessage( "Alt polling queue count unchanged!\r\n" );\r
+               sErrorHasOccurred = pdTRUE;\r
+       }\r
+\r
        if( xIsCreateTaskStillRunning() != pdTRUE )\r
        {\r
                vDisplayMessage( "Incorrect number of tasks running!\r\n" );\r
@@ -388,6 +449,68 @@ static portSHORT sErrorHasOccurred = pdFALSE;
                sErrorHasOccurred = pdTRUE;\r
        }\r
 \r
+       if( xAreAltBlockTimeTestTasksStillRunning() != pdTRUE )\r
+       {\r
+               vDisplayMessage( "Error in fast block time test tasks!\r\n" );\r
+               sErrorHasOccurred = pdTRUE;\r
+       }\r
+\r
+       if( xAreGenericQueueTasksStillRunning() != pdTRUE )\r
+       {\r
+               vDisplayMessage( "Error in generic queue test task!\r\n" );\r
+               sErrorHasOccurred = pdTRUE;             \r
+       }\r
+\r
+       if( xAreAltGenericQueueTasksStillRunning() != pdTRUE )\r
+       {\r
+               vDisplayMessage( "Error in fast generic queue test task!\r\n" );\r
+               sErrorHasOccurred = pdTRUE;             \r
+       }\r
+\r
+       if( xAreQueuePeekTasksStillRunning() != pdTRUE )\r
+       {\r
+               vDisplayMessage( "Error in queue peek test task!\r\n" );\r
+               sErrorHasOccurred = pdTRUE;\r
+       }\r
+\r
+       if( xAreCountingSemaphoreTasksStillRunning() != pdTRUE )\r
+       {\r
+               vDisplayMessage( "Error in counting semaphore demo task!\r\n" );\r
+               sErrorHasOccurred = pdTRUE;\r
+       }\r
+\r
+       if( xAreRecursiveMutexTasksStillRunning() != pdTRUE )\r
+       {\r
+               vDisplayMessage( "Error in recursive mutex tasks!\r\n" );\r
+               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