Skip to content

Commit 35f0fdc

Browse files
author
Jiang Jiang Jian
committed
Merge branch 'fix/fix_deadlock_in_pm_mode_switching_v5.4' into 'release/v5.4'
fix(esp_pm): fix deadlock in pm_mode switching (v5.4) See merge request espressif/esp-idf!34938
2 parents 75e0cc3 + 2c35c09 commit 35f0fdc

File tree

1 file changed

+6
-0
lines changed

1 file changed

+6
-0
lines changed

components/esp_pm/pm_impl.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,9 @@
109109
#endif
110110

111111
static portMUX_TYPE s_switch_lock = portMUX_INITIALIZER_UNLOCKED;
112+
static portMUX_TYPE s_cpu_freq_switch_lock[CONFIG_FREERTOS_NUMBER_OF_CORES] = {
113+
[0 ... (CONFIG_FREERTOS_NUMBER_OF_CORES - 1)] = portMUX_INITIALIZER_UNLOCKED
114+
};
112115
/* The following state variables are protected using s_switch_lock: */
113116
/* Current sleep mode; When switching, contains old mode until switch is complete */
114117
static pm_mode_t s_mode = PM_MODE_CPU_MAX;
@@ -626,6 +629,7 @@ static void IRAM_ATTR do_switch(pm_mode_t new_mode)
626629
}
627630
#ifdef CONFIG_FREERTOS_SYSTICK_USES_CCOUNT
628631
if (s_need_update_ccompare[core_id]) {
632+
update_ccompare();
629633
s_need_update_ccompare[core_id] = false;
630634
}
631635
#endif
@@ -638,6 +642,7 @@ static void IRAM_ATTR do_switch(pm_mode_t new_mode)
638642
s_is_switching = true;
639643
bool config_changed = s_config_changed;
640644
s_config_changed = false;
645+
portENTER_CRITICAL_ISR(&s_cpu_freq_switch_lock[core_id]);
641646
portEXIT_CRITICAL_ISR(&s_switch_lock);
642647

643648
rtc_cpu_freq_config_t new_config = s_cpu_freq_by_mode[new_mode];
@@ -677,6 +682,7 @@ static void IRAM_ATTR do_switch(pm_mode_t new_mode)
677682
}
678683

679684
portENTER_CRITICAL_ISR(&s_switch_lock);
685+
portEXIT_CRITICAL_ISR(&s_cpu_freq_switch_lock[core_id]);
680686
s_mode = new_mode;
681687
s_is_switching = false;
682688
portEXIT_CRITICAL_ISR(&s_switch_lock);

0 commit comments

Comments
 (0)