mirror of
https://github.com/espressif/esp-idf.git
synced 2025-07-30 18:57:19 +02:00
Merge branch 'fix/fix_deadlock_in_pm_mode_switching_v5.3' into 'release/v5.3'
fix(esp_pm): fix deadlock in pm_mode switching (v5.3) See merge request espressif/esp-idf!34939
This commit is contained in:
@ -108,6 +108,9 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
static portMUX_TYPE s_switch_lock = portMUX_INITIALIZER_UNLOCKED;
|
static portMUX_TYPE s_switch_lock = portMUX_INITIALIZER_UNLOCKED;
|
||||||
|
static portMUX_TYPE s_cpu_freq_switch_lock[CONFIG_FREERTOS_NUMBER_OF_CORES] = {
|
||||||
|
[0 ... (CONFIG_FREERTOS_NUMBER_OF_CORES - 1)] = portMUX_INITIALIZER_UNLOCKED
|
||||||
|
};
|
||||||
/* The following state variables are protected using s_switch_lock: */
|
/* The following state variables are protected using s_switch_lock: */
|
||||||
/* Current sleep mode; When switching, contains old mode until switch is complete */
|
/* Current sleep mode; When switching, contains old mode until switch is complete */
|
||||||
static pm_mode_t s_mode = PM_MODE_CPU_MAX;
|
static pm_mode_t s_mode = PM_MODE_CPU_MAX;
|
||||||
@ -625,6 +628,7 @@ static void IRAM_ATTR do_switch(pm_mode_t new_mode)
|
|||||||
}
|
}
|
||||||
#ifdef CONFIG_FREERTOS_SYSTICK_USES_CCOUNT
|
#ifdef CONFIG_FREERTOS_SYSTICK_USES_CCOUNT
|
||||||
if (s_need_update_ccompare[core_id]) {
|
if (s_need_update_ccompare[core_id]) {
|
||||||
|
update_ccompare();
|
||||||
s_need_update_ccompare[core_id] = false;
|
s_need_update_ccompare[core_id] = false;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@ -637,6 +641,7 @@ static void IRAM_ATTR do_switch(pm_mode_t new_mode)
|
|||||||
s_is_switching = true;
|
s_is_switching = true;
|
||||||
bool config_changed = s_config_changed;
|
bool config_changed = s_config_changed;
|
||||||
s_config_changed = false;
|
s_config_changed = false;
|
||||||
|
portENTER_CRITICAL_ISR(&s_cpu_freq_switch_lock[core_id]);
|
||||||
portEXIT_CRITICAL_ISR(&s_switch_lock);
|
portEXIT_CRITICAL_ISR(&s_switch_lock);
|
||||||
|
|
||||||
rtc_cpu_freq_config_t new_config = s_cpu_freq_by_mode[new_mode];
|
rtc_cpu_freq_config_t new_config = s_cpu_freq_by_mode[new_mode];
|
||||||
@ -676,6 +681,7 @@ static void IRAM_ATTR do_switch(pm_mode_t new_mode)
|
|||||||
}
|
}
|
||||||
|
|
||||||
portENTER_CRITICAL_ISR(&s_switch_lock);
|
portENTER_CRITICAL_ISR(&s_switch_lock);
|
||||||
|
portEXIT_CRITICAL_ISR(&s_cpu_freq_switch_lock[core_id]);
|
||||||
s_mode = new_mode;
|
s_mode = new_mode;
|
||||||
s_is_switching = false;
|
s_is_switching = false;
|
||||||
portEXIT_CRITICAL_ISR(&s_switch_lock);
|
portEXIT_CRITICAL_ISR(&s_switch_lock);
|
||||||
|
Reference in New Issue
Block a user