Merge branch 'bugfix/spi_flash_deadlock_v3.0' into 'release/v3.0'

spi_flash: raise priority of the task performing spi_flash operation

See merge request idf/esp-idf!5361
release/v3.0
Jiang Jiang Jian 2019-06-27 19:21:13 +08:00
commit ce33484b62
1 zmienionych plików z 7 dodań i 0 usunięć

Wyświetl plik

@ -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);