]> granicus.if.org Git - esp-idf/commitdiff
spi_flash: raise priority of the task performing spi_flash operation
authorIvan Grokhotkov <ivan@espressif.com>
Mon, 30 Oct 2017 10:53:39 +0000 (18:53 +0800)
committerIvan Grokhotkov <ivan@espressif.com>
Wed, 26 Jun 2019 08:43:51 +0000 (16:43 +0800)
Fixes https://github.com/espressif/arduino-esp32/issues/740

components/spi_flash/cache_utils.c

index bc4e8885ebade89ad67d2ca2566a6036d5677ae2..36c2f11e3f0fdb8b820ddab6fc5de43cd28b7cb9 100644 (file)
@@ -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 <cpuid> because the other CPU is now
         // occupied by highest priority task
         assert(xPortGetCoreID() == cpuid);