X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=Demo%2FWIN32-MSVC%2Fmain.c;h=f067143e18b250a23f0987c96c0077060d2db6fb;hb=1e29c3a095310fe360325ef6fbb5c9cd9af709da;hp=a8f09742dde1efa9ecc69a9412499ca930125232;hpb=7ec5fa3c6821260f50df706993e68ece686cdbbd;p=freertos diff --git a/Demo/WIN32-MSVC/main.c b/Demo/WIN32-MSVC/main.c index a8f09742d..f067143e1 100644 --- a/Demo/WIN32-MSVC/main.c +++ b/Demo/WIN32-MSVC/main.c @@ -1,38 +1,38 @@ /* - FreeRTOS V6.1.0 - Copyright (C) 2010 Real Time Engineers Ltd. + FreeRTOS V7.1.0 - Copyright (C) 2011 Real Time Engineers Ltd. + *************************************************************************** - * * - * If you are: * - * * - * + New to FreeRTOS, * - * + Wanting to learn FreeRTOS or multitasking in general quickly * - * + Looking for basic training, * - * + Wanting to improve your FreeRTOS skills and productivity * - * * - * then take a look at the FreeRTOS books - available as PDF or paperback * - * * - * "Using the FreeRTOS Real Time Kernel - a Practical Guide" * - * http://www.FreeRTOS.org/Documentation * - * * - * A pdf reference manual is also available. Both are usually delivered * - * to your inbox within 20 minutes to two hours when purchased between 8am * - * and 8pm GMT (although please allow up to 24 hours in case of * - * exceptional circumstances). Thank you for your support! * - * * + * * + * FreeRTOS tutorial books are available in pdf and paperback. * + * Complete, revised, and edited pdf reference manuals are also * + * available. * + * * + * Purchasing FreeRTOS documentation will not only help you, by * + * ensuring you get running as quickly as possible and with an * + * in-depth knowledge of how to use FreeRTOS, it will also help * + * the FreeRTOS project to continue with its mission of providing * + * professional grade, cross platform, de facto standard solutions * + * for microcontrollers - completely free of charge! * + * * + * >>> See http://www.FreeRTOS.org/Documentation for details. <<< * + * * + * Thank you for using FreeRTOS, and thank you for your support! * + * * *************************************************************************** + This file is part of the FreeRTOS distribution. FreeRTOS is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License (version 2) as published by the Free Software Foundation AND MODIFIED BY the FreeRTOS exception. - ***NOTE*** The exception to the GPL is included to allow you to distribute - a combined work that includes FreeRTOS without being obliged to provide the - source code for proprietary components outside of the FreeRTOS kernel. - FreeRTOS is distributed in the hope that it will be useful, but WITHOUT - ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + >>>NOTE<<< The modification to the GPL is included to allow you to + distribute a combined work that includes FreeRTOS without being obliged to + provide the source code for proprietary components outside of the FreeRTOS + kernel. FreeRTOS is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License and the FreeRTOS license exception along with FreeRTOS; if not it can be viewed here: http://www.freertos.org/a00114.html and also obtained @@ -56,12 +56,7 @@ * -NOTE- The Win32 port is a simulation (or is that emulation?) only! Do not * expect to get real time behaviour from the Win32 port or this demo * application. It is provided as a convenient development and demonstration - * test bed only. Also, at the time of writing, a method of deleting theads - * has not been implemented, although doing so would be trivial so this - * functionality might be added in at a later date. At present, calling - * vTaskDelete() will delete the real time task from FreeRTOS but not the Win32 - * thread in which the task was executing. DO NOT CALL vTaskDelete() when using - * the Win32 port! This was tested using Windows XP on a dual core laptop. + * test bed only. This was tested using Windows XP on a dual core laptop. * * - READ THE WEB DOCUMENTATION FOR THIS PORT FOR MORE INFORMATION ON USING IT - ******************************************************************************* @@ -91,11 +86,11 @@ #include #include "task.h" #include "queue.h" +#include "timers.h" +#include "semphr.h" /* Standard demo includes. */ -#include "partest.h" #include "BlockQ.h" -#include "death.h" #include "integer.h" #include "semtest.h" #include "PollQ.h" @@ -103,6 +98,10 @@ #include "QPeek.h" #include "recmutex.h" #include "flop.h" +#include "TimerDemo.h" +#include "countsem.h" +#include "death.h" +#include "dynamic.h" /* Priorities at which the tasks are created. */ #define mainCHECK_TASK_PRIORITY ( configMAX_PRIORITIES - 1 ) @@ -116,16 +115,18 @@ #define mainGEN_QUEUE_TASK_PRIORITY ( tskIDLE_PRIORITY ) #define mainFLOP_TASK_PRIORITY ( tskIDLE_PRIORITY ) -/* Stack sizes. */ -#define mainSTDOUT_TASK_STACK_SIZE ( configMINIMAL_STACK_SIZE * 4 ) - -/* File scope variables. */ -static volatile unsigned long ul1 = 0, ul2 = 0; -static xQueueHandle xStdoutQueue = NULL; +#define mainTIMER_TEST_PERIOD ( 50 ) /* Task function prototypes. */ static void prvCheckTask( void *pvParameters ); +/* The variable into which error messages are latched. */ +static char *pcStatusMessage = "OK"; + +/* This semaphore is created purely to test using the vSemaphoreDelete() and +semaphore tracing API functions. It has no other purpose. */ +static xSemaphoreHandle xMutexToDelete = NULL; + /*-----------------------------------------------------------*/ int main( void ) @@ -142,6 +143,19 @@ int main( void ) vStartQueuePeekTasks(); vStartMathTasks( mainFLOP_TASK_PRIORITY ); vStartRecursiveMutexTasks(); + vStartTimerDemoTask( mainTIMER_TEST_PERIOD ); + vStartCountingSemaphoreTasks(); + vStartDynamicPriorityTasks(); + + /* The suicide tasks must be created last as they need to know how many + tasks were running prior to their creation. This then allows them to + ascertain whether or not the correct/expected number of tasks are running at + any given time. */ + vCreateSuicidalTasks( mainCREATOR_TASK_PRIORITY ); + + /* Create the semaphore that will be deleted in the idle task hook. This + is done purely to test the use of vSemaphoreDelete(). */ + xMutexToDelete = xSemaphoreCreateMutex(); /* Start the scheduler itself. */ vTaskStartScheduler(); @@ -155,8 +169,7 @@ int main( void ) static void prvCheckTask( void *pvParameters ) { portTickType xNextWakeTime; -const portTickType xCycleFrequency = 5000 / portTICK_RATE_MS; -char *pcStatusMessage = "OK"; +const portTickType xCycleFrequency = 1000 / portTICK_RATE_MS; /* Just to remove compiler warning. */ ( void ) pvParameters; @@ -170,7 +183,11 @@ char *pcStatusMessage = "OK"; vTaskDelayUntil( &xNextWakeTime, xCycleFrequency ); /* Check the standard demo tasks are running without error. */ - if( xAreIntegerMathsTaskStillRunning() != pdTRUE ) + if( xAreTimerDemoTasksStillRunning( xCycleFrequency ) != pdTRUE ) + { + pcStatusMessage = "Error: TimerDemo"; + } + else if( xAreIntegerMathsTaskStillRunning() != pdTRUE ) { pcStatusMessage = "Error: IntMath"; } @@ -202,6 +219,18 @@ char *pcStatusMessage = "OK"; { pcStatusMessage = "Error: RecMutex"; } + else if( xAreCountingSemaphoreTasksStillRunning() != pdTRUE ) + { + pcStatusMessage = "Error: CountSem"; + } + else if( xIsCreateTaskStillRunning() != pdTRUE ) + { + pcStatusMessage = "Error: Death"; + } + else if( xAreDynamicPriorityTasksStillRunning() != pdPASS ) + { + pcStatusMessage = "Error: Dynamic\r\n"; + } /* This is the only task that uses stdout so its ok to call printf() directly. */ @@ -212,19 +241,64 @@ char *pcStatusMessage = "OK"; void vApplicationIdleHook( void ) { - /* Sleep to reduce CPU load, but don't sleep indefinitely if not using - preemption as as nothing will cause a task switch. */ - #if( configUSE_PREEMPTION != 0 ) +const unsigned long ulMSToSleep = 5; +xTaskHandle xIdleTaskHandle, xTimerTaskHandle; +signed char *pcTaskName; +const unsigned char ucConstQueueNumber = 0xaaU, ucConstTaskNumber = 0x55U; + +/* These three functions are only meant for use by trace code, and not for +direct use from application code, hence their prototypes are not in queue.h. */ +extern void vQueueSetQueueNumber( xQueueHandle pxQueue, unsigned char ucQueueNumber ); +extern unsigned char ucQueueGetQueueNumber( xQueueHandle pxQueue ); +extern unsigned char ucQueueGetQueueType( xQueueHandle pxQueue ); +extern void vTaskSetTaskNumber( xTaskHandle xTask, unsigned portBASE_TYPE uxHandle ); +extern unsigned portBASE_TYPE uxTaskGetTaskNumber( xTaskHandle xTask ); + + /* Sleep to reduce CPU load, but don't sleep indefinitely in case there are + tasks waiting to be terminated by the idle task. */ + Sleep( ulMSToSleep ); + + /* Demonstrate the use of the xTimerGetTimerDaemonTaskHandle() and + xTaskGetIdleTaskHandle() functions. Also try using the function that sets + the task number. */ + xIdleTaskHandle = xTaskGetIdleTaskHandle(); + xTimerTaskHandle = xTimerGetTimerDaemonTaskHandle(); + vTaskSetTaskNumber( xIdleTaskHandle, ( unsigned long ) ucConstTaskNumber ); + configASSERT( uxTaskGetTaskNumber( xIdleTaskHandle ) == ucConstTaskNumber ); + + /* This is the idle hook, so the current task handle should equal the + returned idle task handle. */ + if( xTaskGetCurrentTaskHandle() != xIdleTaskHandle ) { - SleepEx( INFINITE, TRUE ); + pcStatusMessage = "Error: Returned idle task handle was incorrect"; } - #else + + /* Check the timer task handle was returned correctly. */ + pcTaskName = pcTaskGetTaskName( xTimerTaskHandle ); + if( strcmp( pcTaskName, "Tmr Svc" ) != 0 ) { - const unsigned long ulMSToSleep = 5; + pcStatusMessage = "Error: Returned timer task handle was incorrect"; + } - SleepEx( ulMSToSleep, TRUE ); + /* If xMutexToDelete has not already been deleted, then delete it now. + This is done purely to demonstrate the use of, and test, the + vSemaphoreDelete() macro. Care must be taken not to delete a semaphore + that has tasks blocked on it. */ + if( xMutexToDelete != NULL ) + { + /* Before deleting the semaphore, test the function used to set its + number. This would normally only be done from trace software, rather + than application code. */ + vQueueSetQueueNumber( xMutexToDelete, ucConstQueueNumber ); + + /* Before deleting the semaphore, test the functions used to get its + type and number. Again, these would normally only be done from trace + software, rather than application code. */ + configASSERT( ucQueueGetQueueNumber( xMutexToDelete ) == ucConstQueueNumber ); + configASSERT( ucQueueGetQueueType( xMutexToDelete ) == queueQUEUE_TYPE_MUTEX ); + vSemaphoreDelete( xMutexToDelete ); + xMutexToDelete = NULL; } - #endif } /*-----------------------------------------------------------*/ @@ -240,4 +314,19 @@ void vApplicationStackOverflowHook( void ) /* Can be implemented if required, but not required in this environment and running this demo. */ } +/*-----------------------------------------------------------*/ + +void vApplicationTickHook( void ) +{ + /* Call the periodic timer test, which tests the timer API functions that + can be called from an ISR. */ + vTimerPeriodicISRTests(); +} +/*-----------------------------------------------------------*/ + +void vAssertCalled( void ) +{ + taskDISABLE_INTERRUPTS(); + for( ;; ); +}