From afb61195047d7eff2d54ebbb0a42e0becbbc04c4 Mon Sep 17 00:00:00 2001 From: Angus Gratton Date: Wed, 16 Aug 2017 16:02:46 +1000 Subject: [PATCH] dport access: Fix WDT bug (permanent locking) in non-pinned tasks If scheduler switches cores in narrow window during esp_dport_access_stall_other_cpu_start(), could cause the stall interrupt to occur on the running CPU - halting the CPU until WDT cleans up. Related to https://github.com/espressif/esp-idf/issues/630 --- components/esp32/dport_access.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/components/esp32/dport_access.c b/components/esp32/dport_access.c index e1923b4122..29ddad8b57 100644 --- a/components/esp32/dport_access.c +++ b/components/esp32/dport_access.c @@ -69,17 +69,18 @@ static BaseType_t oldInterruptLevel[2]; void IRAM_ATTR esp_dport_access_stall_other_cpu_start(void) { #ifndef CONFIG_FREERTOS_UNICORE - int cpu_id = xPortGetCoreID(); - if (dport_core_state[0] == DPORT_CORE_STATE_IDLE - || dport_core_state[1] == DPORT_CORE_STATE_IDLE) { + || dport_core_state[1] == DPORT_CORE_STATE_IDLE) { return; } + BaseType_t intLvl = portENTER_CRITICAL_NESTED(); + + int cpu_id = xPortGetCoreID(); + #ifdef DPORT_ACCESS_BENCHMARK ccount_start[cpu_id] = XTHAL_GET_CCOUNT(); #endif - BaseType_t intLvl = portENTER_CRITICAL_NESTED(); if (dport_access_ref[cpu_id] == 0) { portENTER_CRITICAL_ISR(&g_dport_mux);