diff --git a/components/freertos/FreeRTOS-Kernel/tasks.c b/components/freertos/FreeRTOS-Kernel/tasks.c index 8d06ea30b0..368a20599f 100644 --- a/components/freertos/FreeRTOS-Kernel/tasks.c +++ b/components/freertos/FreeRTOS-Kernel/tasks.c @@ -4123,10 +4123,19 @@ void vTaskRemoveFromUnorderedEventList( ListItem_t * pxEventListItem, if( taskIS_YIELD_REQUIRED( pxUnblockedTCB, pdFALSE ) == pdTRUE ) { /* The unblocked task has a priority above that of the calling task, so - * a context switch is required. This function is called with the - * scheduler suspended so xYieldPending is set so the context switch - * occurs immediately that the scheduler is resumed (unsuspended). */ - xYieldPending[ xCurCoreID ] = pdTRUE; + * a context switch is required. */ + #if ( configNUM_CORES > 1 ) + + /* In SMP mode, this function is called from a critical section, so we + * yield the current core to schedule the unblocked task. */ + portYIELD_WITHIN_API(); + #else /* configNUM_CORES > 1 */ + + /* In single-core mode, this function is called with the scheduler suspended + * so xYieldPending is set so the context switch occurs immediately once the + * scheduler is resumed (unsuspended). */ + xYieldPending[ xCurCoreID ] = pdTRUE; + #endif /* configNUM_CORES > 1 */ } } }