/*\r
- FreeRTOS V8.2.0 - Copyright (C) 2015 Real Time Engineers Ltd.\r
+ FreeRTOS V9.0.0rc2 - Copyright (C) 2016 Real Time Engineers Ltd.\r
All rights reserved\r
\r
VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.\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
+ Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception.\r
\r
- ***************************************************************************\r
+ ***************************************************************************\r
>>! NOTE: The modification to the GPL is included to allow you to !<<\r
>>! distribute a combined work that includes FreeRTOS without being !<<\r
>>! obliged to provide the source code for proprietary components !<<\r
>>! outside of the FreeRTOS kernel. !<<\r
- ***************************************************************************\r
+ ***************************************************************************\r
\r
FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY\r
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS\r
***************************************************************************\r
\r
http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading\r
- the FAQ page "My application does not run, what could be wrong?". Have you\r
- defined configASSERT()?\r
+ the FAQ page "My application does not run, what could be wrong?". Have you\r
+ defined configASSERT()?\r
\r
- http://www.FreeRTOS.org/support - In return for receiving this top quality\r
- embedded software for free we request you assist our global community by\r
- participating in the support forum.\r
+ http://www.FreeRTOS.org/support - In return for receiving this top quality\r
+ embedded software for free we request you assist our global community by\r
+ participating in the support forum.\r
\r
- http://www.FreeRTOS.org/training - Investing in training allows your team to\r
- be as productive as possible as early as possible. Now you can receive\r
- FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers\r
- Ltd, and the world's leading authority on the world's leading RTOS.\r
+ http://www.FreeRTOS.org/training - Investing in training allows your team to\r
+ be as productive as possible as early as possible. Now you can receive\r
+ FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers\r
+ Ltd, and the world's leading authority on the world's leading RTOS.\r
\r
http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,\r
including FreeRTOS+Trace - an indispensable productivity tool, a DOS\r
xOneShotTimer = xTimerCreate( "Oneshot Timer", /* Text name to facilitate debugging. The kernel does not use this itself. */\r
tmrdemoONE_SHOT_TIMER_PERIOD, /* The period for the timer. */\r
pdFALSE, /* Don't auto-reload - hence a one shot timer. */\r
- ( void * ) 0, /* The timer identifier. In this case this is not used as the timer has its own callback. */\r
+ ( void * ) 0, /* The timer identifier. Initialise to 0, then increment each time it is called. */\r
prvOneShotTimerCallback ); /* The callback to be called when the timer expires. */\r
\r
if( xOneShotTimer == NULL )\r
\r
for( xTimer = 0; xTimer < configTIMER_QUEUE_LENGTH; xTimer++ )\r
{\r
- /* As the timer queue is not yet full, it should be possible to both create\r
- and start a timer. These timers are being started before the scheduler has\r
- been started, so their block times should get set to zero within the timer\r
- API itself. */\r
+ /* As the timer queue is not yet full, it should be possible to both\r
+ create and start a timer. These timers are being started before the\r
+ scheduler has been started, so their block times should get set to zero\r
+ within the timer API itself. */\r
xAutoReloadTimers[ xTimer ] = xTimerCreate( "FR Timer", /* Text name to facilitate debugging. The kernel does not use this itself. */\r
( ( xTimer + ( TickType_t ) 1 ) * xBasePeriod ),/* The period for the timer. The plus 1 ensures a period of zero is not specified. */\r
pdTRUE, /* Auto-reload is set to true. */\r
( void * ) xTimer, /* An identifier for the timer as all the auto reload timers use the same callback. */\r
prvAutoReloadTimerCallback ); /* The callback to be called when the timer expires. */\r
\r
- configASSERT( strcmp( pcTimerGetTimerName( xAutoReloadTimers[ xTimer ] ), "FR Timer" ) == 0 );\r
-\r
if( xAutoReloadTimers[ xTimer ] == NULL )\r
{\r
xTestStatus = pdFAIL;\r
}\r
else\r
{\r
+ configASSERT( strcmp( pcTimerGetName( xAutoReloadTimers[ xTimer ] ), "FR Timer" ) == 0 );\r
+\r
/* The scheduler has not yet started, so the block period of\r
portMAX_DELAY should just get set to zero in xTimerStart(). Also,\r
the timer queue is not yet full so xTimerStart() should return\r
in the Blocked state. */\r
uxOriginalPriority = uxTaskPriorityGet( NULL );\r
vTaskPrioritySet( NULL, ( configMAX_PRIORITIES - 1 ) );\r
- \r
+\r
/* Delaying for configTIMER_QUEUE_LENGTH * xBasePeriod ticks should allow\r
all the auto reload timers to expire at least once. */\r
xBlockPeriod = ( ( TickType_t ) configTIMER_QUEUE_LENGTH ) * xBasePeriod;\r
\r
static void prvAutoReloadTimerCallback( TimerHandle_t pxExpiredTimer )\r
{\r
-uint32_t ulTimerID;\r
+size_t uxTimerID;\r
\r
- ulTimerID = ( uint32_t ) pvTimerGetTimerID( pxExpiredTimer );\r
- if( ulTimerID <= ( configTIMER_QUEUE_LENGTH + 1 ) )\r
+ uxTimerID = ( size_t ) pvTimerGetTimerID( pxExpiredTimer );\r
+ if( uxTimerID <= ( configTIMER_QUEUE_LENGTH + 1 ) )\r
{\r
- ( ucAutoReloadTimerCounters[ ulTimerID ] )++;\r
+ ( ucAutoReloadTimerCounters[ uxTimerID ] )++;\r
}\r
else\r
{\r
\r
static void prvOneShotTimerCallback( TimerHandle_t pxExpiredTimer )\r
{\r
- /* The parameter is not used in this case as only one timer uses this\r
- callback function. */\r
- ( void ) pxExpiredTimer;\r
+/* A count is kept of the number of times this callback function is executed.\r
+The count is stored as the timer's ID. This is only done to test the\r
+vTimerSetTimerID() function. */\r
+static size_t uxCallCount = 0;\r
+size_t uxLastCallCount;\r
+\r
+ /* Obtain the timer's ID, which should be a count of the number of times\r
+ this callback function has been executed. */\r
+ uxLastCallCount = ( size_t ) pvTimerGetTimerID( pxExpiredTimer );\r
+ configASSERT( uxLastCallCount == uxCallCount );\r
+\r
+ /* Increment the call count, then save it back as the timer's ID. This is\r
+ only done to test the vTimerSetTimerID() API function. */\r
+ uxLastCallCount++;\r
+ vTimerSetTimerID( pxExpiredTimer, ( void * ) uxLastCallCount );\r
+ uxCallCount++;\r
\r
ucOneShotTimerCounter++;\r
}\r