mirror of
https://github.com/espressif/esp-idf.git
synced 2025-07-30 18:57:19 +02:00
fix pm lock issue in dual core mode
This commit is contained in:
@ -68,8 +68,6 @@ static portMUX_TYPE s_switch_lock = portMUX_INITIALIZER_UNLOCKED;
|
|||||||
static pm_mode_t s_mode = PM_MODE_CPU_MAX;
|
static pm_mode_t s_mode = PM_MODE_CPU_MAX;
|
||||||
/* True when switch is in progress */
|
/* True when switch is in progress */
|
||||||
static volatile bool s_is_switching;
|
static volatile bool s_is_switching;
|
||||||
/* When switch is in progress, this is the mode we are switching into */
|
|
||||||
static pm_mode_t s_new_mode = PM_MODE_CPU_MAX;
|
|
||||||
/* Number of times each mode was locked */
|
/* Number of times each mode was locked */
|
||||||
static size_t s_mode_lock_counts[PM_MODE_COUNT];
|
static size_t s_mode_lock_counts[PM_MODE_COUNT];
|
||||||
/* Bit mask of locked modes. BIT(i) is set iff s_mode_lock_counts[i] > 0. */
|
/* Bit mask of locked modes. BIT(i) is set iff s_mode_lock_counts[i] > 0. */
|
||||||
@ -284,7 +282,7 @@ void IRAM_ATTR esp_pm_impl_switch_mode(pm_mode_t mode,
|
|||||||
#endif // WITH_PROFILING
|
#endif // WITH_PROFILING
|
||||||
}
|
}
|
||||||
portEXIT_CRITICAL_SAFE(&s_switch_lock);
|
portEXIT_CRITICAL_SAFE(&s_switch_lock);
|
||||||
if (need_switch && new_mode != s_mode) {
|
if (need_switch) {
|
||||||
do_switch(new_mode);
|
do_switch(new_mode);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -355,16 +353,15 @@ static void IRAM_ATTR do_switch(pm_mode_t new_mode)
|
|||||||
if (!s_is_switching) {
|
if (!s_is_switching) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (s_new_mode <= new_mode) {
|
|
||||||
portEXIT_CRITICAL_ISR(&s_switch_lock);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (s_need_update_ccompare[core_id]) {
|
if (s_need_update_ccompare[core_id]) {
|
||||||
s_need_update_ccompare[core_id] = false;
|
s_need_update_ccompare[core_id] = false;
|
||||||
}
|
}
|
||||||
portEXIT_CRITICAL_ISR(&s_switch_lock);
|
portEXIT_CRITICAL_ISR(&s_switch_lock);
|
||||||
} while (true);
|
} while (true);
|
||||||
s_new_mode = new_mode;
|
if (new_mode == s_mode) {
|
||||||
|
portEXIT_CRITICAL_ISR(&s_switch_lock);
|
||||||
|
return;
|
||||||
|
}
|
||||||
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;
|
||||||
|
@ -62,8 +62,6 @@ static portMUX_TYPE s_switch_lock = portMUX_INITIALIZER_UNLOCKED;
|
|||||||
static pm_mode_t s_mode = PM_MODE_CPU_MAX;
|
static pm_mode_t s_mode = PM_MODE_CPU_MAX;
|
||||||
/* True when switch is in progress */
|
/* True when switch is in progress */
|
||||||
static volatile bool s_is_switching;
|
static volatile bool s_is_switching;
|
||||||
/* When switch is in progress, this is the mode we are switching into */
|
|
||||||
static pm_mode_t s_new_mode = PM_MODE_CPU_MAX;
|
|
||||||
/* Number of times each mode was locked */
|
/* Number of times each mode was locked */
|
||||||
static size_t s_mode_lock_counts[PM_MODE_COUNT];
|
static size_t s_mode_lock_counts[PM_MODE_COUNT];
|
||||||
/* Bit mask of locked modes. BIT(i) is set iff s_mode_lock_counts[i] > 0. */
|
/* Bit mask of locked modes. BIT(i) is set iff s_mode_lock_counts[i] > 0. */
|
||||||
@ -289,7 +287,7 @@ void IRAM_ATTR esp_pm_impl_switch_mode(pm_mode_t mode,
|
|||||||
#endif // WITH_PROFILING
|
#endif // WITH_PROFILING
|
||||||
}
|
}
|
||||||
portEXIT_CRITICAL(&s_switch_lock);
|
portEXIT_CRITICAL(&s_switch_lock);
|
||||||
if (need_switch && new_mode != s_mode) {
|
if (need_switch) {
|
||||||
do_switch(new_mode);
|
do_switch(new_mode);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -360,16 +358,15 @@ static void IRAM_ATTR do_switch(pm_mode_t new_mode)
|
|||||||
if (!s_is_switching) {
|
if (!s_is_switching) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (s_new_mode <= new_mode) {
|
|
||||||
portEXIT_CRITICAL_ISR(&s_switch_lock);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (s_need_update_ccompare[core_id]) {
|
if (s_need_update_ccompare[core_id]) {
|
||||||
s_need_update_ccompare[core_id] = false;
|
s_need_update_ccompare[core_id] = false;
|
||||||
}
|
}
|
||||||
portEXIT_CRITICAL_ISR(&s_switch_lock);
|
portEXIT_CRITICAL_ISR(&s_switch_lock);
|
||||||
} while (true);
|
} while (true);
|
||||||
s_new_mode = new_mode;
|
if (new_mode == s_mode) {
|
||||||
|
portEXIT_CRITICAL_ISR(&s_switch_lock);
|
||||||
|
return;
|
||||||
|
}
|
||||||
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;
|
||||||
|
Reference in New Issue
Block a user