xTimerCreate & vTimerCallback

Posted by yuguangworld on May 26, 2016

For xTimerCreate function, we can assign a unique TimerID for each timer (as shown follows). But, can we use pvTimerID pointer to point to a struct so that we can pass more parameters to timer callback function?

TimerHandlet xTimerCreate( const char * const pcTimerName, * TickTypet xTimerPeriodInTicks, * UBaseTypet uxAutoReload, * void * pvTimerID, * TimerCallbackFunctiont pxCallbackFunction );


xTimerCreate & vTimerCallback

Posted by rtel on May 26, 2016

yes - it is a void pointer to allow you to use it for whatever you want. Just set a pointer to point to the structure, then pass THE ADDRESS OF THE POINTER as the ID parameter. Inside the callback function declare a pointer to a structure, and receive the ID into that pointer.


xTimerCreate & vTimerCallback

Posted by yuguangworld on May 27, 2016

Thanks so much for your reply!! But I am still a little confused about how to "receive the ID into that pointer" inside callback function.

For example, is the following expression correct? void vTimerCallbacktr(TimerHandlet pxTimer) { pointer * ptr=(pointer * )pxTimer; }


xTimerCreate & vTimerCallback

Posted by rtel on May 27, 2016

See the following example:

~~~ void main( void ) { const TickTypet xTimerPeriod = pdMSTO_TICKS( 100 );

/* Create the timer with the ID set to the address of the struct. / xTimer = xTimerCreate( "Timer", xTimerPeriod, pdFALSE, ( void * ) &xStruct, / <<<<<< */ prvCallback );

/* Start the timer. */ xTimerStart( xTimer, 0 );

vTaskStartScheduler();

for( ;; ); }

void prvCallback( TimerHandlet xTimer ) { MyStructt *pxStructAddress;

/* Obtain the address of the struct from the timer's ID. */ pxStructAddress = ( MyStruct_t * ) pvTimerGetTimerID( xTimer );

/* Check the structure members are as expected. */ configASSERT( pxStructAddress->x == 1 ); configASSERT( pxStructAddress->y == 2 ); }

~~~


xTimerCreate & vTimerCallback

Posted by yuguangworld on May 27, 2016

That works well! Thanks so much!