]> granicus.if.org Git - esp-idf/commitdiff
dport access: Fix WDT bug (permanent locking) in non-pinned tasks
authorAngus Gratton <angus@espressif.com>
Wed, 16 Aug 2017 06:02:46 +0000 (16:02 +1000)
committerAngus Gratton <gus@projectgus.com>
Fri, 25 Aug 2017 06:08:03 +0000 (16:08 +1000)
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

index e1923b41221e4831116b7099e2d70c890fed7b44..29ddad8b575c096b07013baedaab77227fffe1c0 100644 (file)
@@ -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);