X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=FreeRTOS%2FDemo%2FCommon%2FMinimal%2FTimerDemo.c;h=ec4996dea7d8952cc09cf67d55e32d5e9855661a;hb=refs%2Ftags%2FV9.0.0rc2;hp=de37052b20ed6c2ac8fd147e2f051663cb61e1b5;hpb=62c041d220c4812a1ea4350cac687998fcd5d733;p=freertos diff --git a/FreeRTOS/Demo/Common/Minimal/TimerDemo.c b/FreeRTOS/Demo/Common/Minimal/TimerDemo.c index de37052b2..ec4996dea 100644 --- a/FreeRTOS/Demo/Common/Minimal/TimerDemo.c +++ b/FreeRTOS/Demo/Common/Minimal/TimerDemo.c @@ -1,5 +1,5 @@ /* - FreeRTOS V8.2.1 - Copyright (C) 2015 Real Time Engineers Ltd. + FreeRTOS V9.0.0rc2 - Copyright (C) 2016 Real Time Engineers Ltd. All rights reserved VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. @@ -8,7 +8,7 @@ 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. + Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. *************************************************************************** >>! NOTE: The modification to the GPL is included to allow you to !<< @@ -192,7 +192,7 @@ static void prvTimerTestTask( void *pvParameters ) xOneShotTimer = xTimerCreate( "Oneshot Timer", /* Text name to facilitate debugging. The kernel does not use this itself. */ tmrdemoONE_SHOT_TIMER_PERIOD, /* The period for the timer. */ pdFALSE, /* Don't auto-reload - hence a one shot timer. */ - ( void * ) 0, /* The timer identifier. In this case this is not used as the timer has its own callback. */ + ( void * ) 0, /* The timer identifier. Initialise to 0, then increment each time it is called. */ prvOneShotTimerCallback ); /* The callback to be called when the timer expires. */ if( xOneShotTimer == NULL ) @@ -285,18 +285,16 @@ TickType_t xTimer; for( xTimer = 0; xTimer < configTIMER_QUEUE_LENGTH; xTimer++ ) { - /* As the timer queue is not yet full, it should be possible to both create - and start a timer. These timers are being started before the scheduler has - been started, so their block times should get set to zero within the timer - API itself. */ + /* As the timer queue is not yet full, it should be possible to both + create and start a timer. These timers are being started before the + scheduler has been started, so their block times should get set to zero + within the timer API itself. */ xAutoReloadTimers[ xTimer ] = xTimerCreate( "FR Timer", /* Text name to facilitate debugging. The kernel does not use this itself. */ ( ( xTimer + ( TickType_t ) 1 ) * xBasePeriod ),/* The period for the timer. The plus 1 ensures a period of zero is not specified. */ pdTRUE, /* Auto-reload is set to true. */ ( void * ) xTimer, /* An identifier for the timer as all the auto reload timers use the same callback. */ prvAutoReloadTimerCallback ); /* The callback to be called when the timer expires. */ - configASSERT( strcmp( pcTimerGetTimerName( xAutoReloadTimers[ xTimer ] ), "FR Timer" ) == 0 ); - if( xAutoReloadTimers[ xTimer ] == NULL ) { xTestStatus = pdFAIL; @@ -304,6 +302,8 @@ TickType_t xTimer; } else { + configASSERT( strcmp( pcTimerGetName( xAutoReloadTimers[ xTimer ] ), "FR Timer" ) == 0 ); + /* The scheduler has not yet started, so the block period of portMAX_DELAY should just get set to zero in xTimerStart(). Also, the timer queue is not yet full so xTimerStart() should return @@ -402,7 +402,7 @@ UBaseType_t uxOriginalPriority; in the Blocked state. */ uxOriginalPriority = uxTaskPriorityGet( NULL ); vTaskPrioritySet( NULL, ( configMAX_PRIORITIES - 1 ) ); - + /* Delaying for configTIMER_QUEUE_LENGTH * xBasePeriod ticks should allow all the auto reload timers to expire at least once. */ xBlockPeriod = ( ( TickType_t ) configTIMER_QUEUE_LENGTH ) * xBasePeriod; @@ -1044,12 +1044,12 @@ static TickType_t uxTick = ( TickType_t ) -1; static void prvAutoReloadTimerCallback( TimerHandle_t pxExpiredTimer ) { -uint32_t ulTimerID; +size_t uxTimerID; - ulTimerID = ( uint32_t ) pvTimerGetTimerID( pxExpiredTimer ); - if( ulTimerID <= ( configTIMER_QUEUE_LENGTH + 1 ) ) + uxTimerID = ( size_t ) pvTimerGetTimerID( pxExpiredTimer ); + if( uxTimerID <= ( configTIMER_QUEUE_LENGTH + 1 ) ) { - ( ucAutoReloadTimerCounters[ ulTimerID ] )++; + ( ucAutoReloadTimerCounters[ uxTimerID ] )++; } else { @@ -1062,9 +1062,22 @@ uint32_t ulTimerID; static void prvOneShotTimerCallback( TimerHandle_t pxExpiredTimer ) { - /* The parameter is not used in this case as only one timer uses this - callback function. */ - ( void ) pxExpiredTimer; +/* A count is kept of the number of times this callback function is executed. +The count is stored as the timer's ID. This is only done to test the +vTimerSetTimerID() function. */ +static size_t uxCallCount = 0; +size_t uxLastCallCount; + + /* Obtain the timer's ID, which should be a count of the number of times + this callback function has been executed. */ + uxLastCallCount = ( size_t ) pvTimerGetTimerID( pxExpiredTimer ); + configASSERT( uxLastCallCount == uxCallCount ); + + /* Increment the call count, then save it back as the timer's ID. This is + only done to test the vTimerSetTimerID() API function. */ + uxLastCallCount++; + vTimerSetTimerID( pxExpiredTimer, ( void * ) uxLastCallCount ); + uxCallCount++; ucOneShotTimerCounter++; }