From fded7b4270f998d5732ff496592829d2f438cd48 Mon Sep 17 00:00:00 2001 From: Jeroen Domburg Date: Fri, 19 May 2017 15:25:02 +0800 Subject: [PATCH] Dport accesses would re-enable interrupts unconditionally, breaking things when called in an ISR. This saves and restores the interrupt status, fixing this. --- components/esp32/dport_access.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/components/esp32/dport_access.c b/components/esp32/dport_access.c index 65b68f6e61..aa4bdbea0a 100644 --- a/components/esp32/dport_access.c +++ b/components/esp32/dport_access.c @@ -60,6 +60,10 @@ static uint32_t ccount_margin[portNUM_PROCESSORS][DPORT_ACCESS_BENCHMARK_STORE_N static uint32_t ccount_margin_cnt; #endif +#ifndef CONFIG_FREERTOS_UNICORE +static BaseType_t oldInterruptLevel[2]; +#endif + /* stall other cpu that this cpu is pending to access dport register start */ void IRAM_ATTR esp_dport_access_stall_other_cpu_start(void) { @@ -74,8 +78,8 @@ void IRAM_ATTR esp_dport_access_stall_other_cpu_start(void) #ifdef DPORT_ACCESS_BENCHMARK ccount_start[cpu_id] = XTHAL_GET_CCOUNT(); #endif - - portDISABLE_INTERRUPTS(); + BaseType_t intLvl=portENTER_CRITICAL_NESTED(); + oldInterruptLevel[cpu_id]=intLvl; if (dport_access_ref[cpu_id] == 0) { portENTER_CRITICAL_ISR(&g_dport_mux); @@ -121,7 +125,7 @@ void IRAM_ATTR esp_dport_access_stall_other_cpu_end(void) portEXIT_CRITICAL_ISR(&g_dport_mux); } - portENABLE_INTERRUPTS(); + portEXIT_CRITICAL_NESTED(oldInterruptLevel[cpu_id]); #ifdef DPORT_ACCESS_BENCHMARK ccount_end[cpu_id] = XTHAL_GET_CCOUNT(); -- 2.40.0