on FreeRTOS v10.4.4, the expired timer callback will be continues to be executed in prvReloadTimer(), but seems the expired callback seems execute one-time more than expected.
both prvProcessExpiredTimer() and prvProcessReceivedCommands() seems have the same issue.
static void prvProcessExpiredTimer( const TickType_t xNextExpireTime,
const TickType_t xTimeNow )
{
…
( void ) uxListRemove( &( pxTimer->xTimerListItem ) );
/* If the timer is an auto-reload timer then calculate the next
* expiry time and re-insert the timer in the list of active timers. */
if( ( pxTimer->ucStatus & tmrSTATUS_IS_AUTORELOAD ) != 0 )
{
prvReloadTimer( pxTimer, xNextExpireTime, xTimeNow ); //all expired timer callback executed at here
}
else
{
pxTimer->ucStatus &= ~tmrSTATUS_IS_ACTIVE;
}
/* Call the timer callback. */
traceTIMER_EXPIRED( pxTimer );
pxTimer->pxCallbackFunction( ( TimerHandle_t ) pxTimer ); //should move this line into the last else-branch for the non-auto-reload timer
}