diff --git a/components/spi_flash/cache_utils.c b/components/spi_flash/cache_utils.c index bc4e8885e..36c2f11e3 100644 --- a/components/spi_flash/cache_utils.c +++ b/components/spi_flash/cache_utils.c @@ -110,6 +110,11 @@ void IRAM_ATTR spi_flash_disable_interrupts_caches_and_other_cpu() assert(other_cpuid == 1); spi_flash_disable_cache(other_cpuid, &s_flash_op_cache_state[other_cpuid]); } else { + // Temporarily raise current task priority to prevent a deadlock while + // waiting for IPC task to start on the other CPU + TaskHandle_t self = xTaskGetCurrentTaskHandle(); + int old_prio = uxTaskPriorityGet(self); + vTaskPrioritySet(self, configMAX_PRIORITIES - 1); // Signal to the spi_flash_op_block_task on the other CPU that we need it to // disable cache there and block other tasks from executing. s_flash_op_can_start = false; @@ -121,6 +126,8 @@ void IRAM_ATTR spi_flash_disable_interrupts_caches_and_other_cpu() } // Disable scheduler on the current CPU vTaskSuspendAll(); + // Can now set the priority back to the normal one + vTaskPrioritySet(self, old_prio); // This is guaranteed to run on CPU because the other CPU is now // occupied by highest priority task assert(xPortGetCoreID() == cpuid);