xTimerCreate & vTimerCallback
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
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
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
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
That works well! Thanks so much!
  