diff --git a/include/task.h b/include/task.h index 3eaf6eecb..15afca429 100644 --- a/include/task.h +++ b/include/task.h @@ -2822,7 +2822,7 @@ void vTaskSetTaskNumber( TaskHandle_t xTask, const UBaseType_t uxHandle ) PRIVIL * to date with the actual execution time by being skipped forward by a time * equal to the idle period. */ -void vTaskStepTick( const TickType_t xTicksToJump ) PRIVILEGED_FUNCTION; +void vTaskStepTick( TickType_t xTicksToJump ) PRIVILEGED_FUNCTION; /* * Only available when configUSE_TICKLESS_IDLE is set to 1. diff --git a/tasks.c b/tasks.c index 67b7de203..1046791a4 100644 --- a/tasks.c +++ b/tasks.c @@ -2599,12 +2599,25 @@ implementations require configUSE_TICKLESS_IDLE to be set to a value other than 1. */ #if ( configUSE_TICKLESS_IDLE != 0 ) - void vTaskStepTick( const TickType_t xTicksToJump ) + void vTaskStepTick( TickType_t xTicksToJump ) { /* Correct the tick count value after a period during which the tick was suppressed. Note this does *not* call the tick hook function for each stepped tick. */ configASSERT( ( xTickCount + xTicksToJump ) <= xNextTaskUnblockTime ); + if( ( xTickCount + xTicksToJump ) == xNextTaskUnblockTime ) + { + /* Arrange for xTickCount to reach xNextTaskUnblockTime in + xTaskIncrementTick() when the scheduler resumes. This ensures that + any delayed tasks are resumed at the correct time. */ + configASSERT( uxSchedulerSuspended ); + configASSERT( xTicksToJump != 0 ); + + taskENTER_CRITICAL(); + xPendedTicks++; + taskEXIT_CRITICAL(); + xTicksToJump--; + } xTickCount += xTicksToJump; traceINCREASE_TICK_COUNT( xTicksToJump ); }