xTimerCreate & vTimerCallback

yuguangworld wrote on Thursday, 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?

TimerHandle_t xTimerCreate( const char * const pcTimerName,

  •  						TickType_t xTimerPeriodInTicks,
    
  •  						UBaseType_t uxAutoReload,
    
  •  						void * pvTimerID,
    
  •  						TimerCallbackFunction_t pxCallbackFunction );

rtel wrote on Thursday, 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.

yuguangworld wrote on Friday, 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 vTimerCallback_tr(TimerHandle_t pxTimer)
{
pointer * ptr=(pointer * )pxTimer;
}

rtel wrote on Friday, May 27, 2016:

See the following example:

void main( void )
{
const TickType_t xTimerPeriod = pdMS_TO_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( TimerHandle_t xTimer )
{
MyStruct_t *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 );
}

yuguangworld wrote on Friday, May 27, 2016:

That works well! Thanks so much!