mirror of
https://github.com/espressif/esp-idf
synced 2025-03-09 17:19:09 -04:00
fix(esp_pm): fix deadlock in pm_mode switching
This commit is contained in:
parent
8038821546
commit
91d1b1276c
@ -108,6 +108,9 @@
|
||||
#endif
|
||||
|
||||
static portMUX_TYPE s_switch_lock = portMUX_INITIALIZER_UNLOCKED;
|
||||
static portMUX_TYPE s_cpu_freq_switch_lock[portNUM_PROCESSORS] = {
|
||||
[0 ... (portNUM_PROCESSORS - 1)] = portMUX_INITIALIZER_UNLOCKED
|
||||
};
|
||||
/* The following state variables are protected using s_switch_lock: */
|
||||
/* Current sleep mode; When switching, contains old mode until switch is complete */
|
||||
static pm_mode_t s_mode = PM_MODE_CPU_MAX;
|
||||
@ -493,6 +496,7 @@ static void IRAM_ATTR do_switch(pm_mode_t new_mode)
|
||||
s_is_switching = true;
|
||||
bool config_changed = s_config_changed;
|
||||
s_config_changed = false;
|
||||
portENTER_CRITICAL_ISR(&s_cpu_freq_switch_lock[core_id]);
|
||||
portEXIT_CRITICAL_ISR(&s_switch_lock);
|
||||
|
||||
rtc_cpu_freq_config_t new_config = s_cpu_freq_by_mode[new_mode];
|
||||
@ -534,6 +538,7 @@ static void IRAM_ATTR do_switch(pm_mode_t new_mode)
|
||||
}
|
||||
|
||||
portENTER_CRITICAL_ISR(&s_switch_lock);
|
||||
portEXIT_CRITICAL_ISR(&s_cpu_freq_switch_lock[core_id]);
|
||||
s_mode = new_mode;
|
||||
s_is_switching = false;
|
||||
portEXIT_CRITICAL_ISR(&s_switch_lock);
|
||||
|
Loading…
x
Reference in New Issue
Block a user