From 0c15815c2b9c73657d85ccc46d7ccda6d2b51718 Mon Sep 17 00:00:00 2001 From: Darian Leung Date: Fri, 20 Oct 2023 16:34:20 +0800 Subject: [PATCH] fix(freertos/idf): vTaskStepTick assertions in SMP Fixes vTaskStepTick() assertions in SMP, where SMP uses critical sections instead of scheduler suspension when handling tickless idling. --- components/freertos/FreeRTOS-Kernel/tasks.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/components/freertos/FreeRTOS-Kernel/tasks.c b/components/freertos/FreeRTOS-Kernel/tasks.c index d9b770ae3d..c755765e1a 100644 --- a/components/freertos/FreeRTOS-Kernel/tasks.c +++ b/components/freertos/FreeRTOS-Kernel/tasks.c @@ -3010,7 +3010,19 @@ char * pcTaskGetName( TaskHandle_t xTaskToQuery ) /*lint !e971 Unqualified char /* 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( taskIS_SCHEDULER_SUSPENDED() == pdTRUE ); + #if ( configNUMBER_OF_CORES > 1 ) + { + /* In SMP, the entire tickless idle handling block + * is replaced with a critical section, taking the kernel lock. */ + configASSERT( taskIS_SCHEDULER_SUSPENDED() == pdFALSE ); + } + #else /* configNUMBER_OF_CORES > 1 */ + { + /* In single-core, the entire tickless idle handling block + * is done with scheduler suspended. */ + configASSERT( taskIS_SCHEDULER_SUSPENDED() == pdTRUE ); + } + #endif /* configNUMBER_OF_CORES > 1 */ configASSERT( xTicksToJump != ( TickType_t ) 0 ); xPendedTicks++;