From 9b5601b7c781ece693e3f399ee419ba2e07ead3a Mon Sep 17 00:00:00 2001 From: Darian Leung Date: Thu, 5 May 2022 17:56:44 +0800 Subject: [PATCH] freertos: Fix SMP FreeRTOS interrupt watchdog feeding This commit fixes how SMP FreeRTOS feeds the INT WDT. Previously, the port used vApplicationTickHook(). Now, all cores will feed the INT WDT in xPortSysTickHandler(). --- .../xtensa/include/freertos/FreeRTOSConfig_smp.h | 4 ++++ .../FreeRTOS-Kernel-SMP/portable/xtensa/port.c | 14 +++----------- 2 files changed, 7 insertions(+), 11 deletions(-) diff --git a/components/freertos/FreeRTOS-Kernel-SMP/portable/xtensa/include/freertos/FreeRTOSConfig_smp.h b/components/freertos/FreeRTOS-Kernel-SMP/portable/xtensa/include/freertos/FreeRTOSConfig_smp.h index d2a89eeb51..9f81ddc460 100644 --- a/components/freertos/FreeRTOS-Kernel-SMP/portable/xtensa/include/freertos/FreeRTOSConfig_smp.h +++ b/components/freertos/FreeRTOS-Kernel-SMP/portable/xtensa/include/freertos/FreeRTOSConfig_smp.h @@ -198,7 +198,11 @@ This file get's pulled into assembly sources. Therefore, some includes need to b #else #define configUSE_IDLE_HOOK 0 #endif +#if CONFIG_FREERTOS_USE_TICK_HOOK #define configUSE_TICK_HOOK 1 +#else +#define configUSE_TICK_HOOK 0 +#endif #if CONFIG_FREERTOS_CHECK_STACKOVERFLOW_NONE #define configCHECK_FOR_STACK_OVERFLOW 0 #elif CONFIG_FREERTOS_CHECK_STACKOVERFLOW_PTRVAL diff --git a/components/freertos/FreeRTOS-Kernel-SMP/portable/xtensa/port.c b/components/freertos/FreeRTOS-Kernel-SMP/portable/xtensa/port.c index c5a840a34a..73c0840aaa 100644 --- a/components/freertos/FreeRTOS-Kernel-SMP/portable/xtensa/port.c +++ b/components/freertos/FreeRTOS-Kernel-SMP/portable/xtensa/port.c @@ -620,15 +620,14 @@ BaseType_t xPortSysTickHandler(void) portbenchmarkIntLatency(); traceISR_ENTER(SYSTICK_INTR_ID); BaseType_t ret; + esp_vApplicationTickHook(); if (portGET_CORE_ID() == 0) { - //Only Core 0 calls xTaskIncrementTick(); + // FreeRTOS SMP requires that only core 0 calls xTaskIncrementTick() ret = xTaskIncrementTick(); } else { - //Manually call the IDF tick hooks - esp_vApplicationTickHook(); ret = pdFALSE; } - if(ret != pdFALSE) { + if (ret != pdFALSE) { portYIELD_FROM_ISR(); } else { traceISR_EXIT(); @@ -657,13 +656,6 @@ void __attribute__((weak)) vApplicationStackOverflowHook( TaskHandle_t xTask, c } #endif -#if ( configUSE_TICK_HOOK > 0 ) -void vApplicationTickHook( void ) -{ - esp_vApplicationTickHook(); -} -#endif - #if CONFIG_FREERTOS_USE_MINIMAL_IDLE_HOOK /* By default, the port uses vApplicationMinimalIdleHook() to run IDF style idle