From 219e052816d776fcd33e9b98914ec0204c068a41 Mon Sep 17 00:00:00 2001 From: wuzhenghui Date: Fri, 29 May 2026 21:12:40 +0800 Subject: [PATCH] fix(esp_hw_support): fix possible dead lock in deepsleep process --- components/esp_hw_support/sleep_modes.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/components/esp_hw_support/sleep_modes.c b/components/esp_hw_support/sleep_modes.c index 4f91e09a239..65fe7cd3c91 100644 --- a/components/esp_hw_support/sleep_modes.c +++ b/components/esp_hw_support/sleep_modes.c @@ -1161,10 +1161,18 @@ static esp_err_t IRAM_ATTR deep_sleep_start(bool allow_sleep_rejection) esp_sync_timekeeping_timers(); + // Must acquire all spinlocks which may be acquired during sleep process before stalling other core, + // otherwise deadlock may occur. + portENTER_CRITICAL(&spinlock_rtc_deep_sleep); +#if !CONFIG_FREERTOS_UNICORE + extern portMUX_TYPE rtc_spinlock; + portENTER_CRITICAL_SAFE(&rtc_spinlock); // Maybe acquired from temp_sensor_get_raw_value by phy_close_rf callback + esp_clk_private_lock(); // Maybe acquired from esp_clk_slowclk_cal_set +#endif + /* Disable interrupts and stall another core in case another task writes * to RTC memory while we calculate RTC memory CRC. */ - portENTER_CRITICAL(&spinlock_rtc_deep_sleep); esp_ipc_isr_stall_other_cpu(); esp_ipc_isr_stall_pause(); @@ -1235,6 +1243,10 @@ static esp_err_t IRAM_ATTR deep_sleep_start(bool allow_sleep_rejection) // Never returns here, except that the sleep is rejected. esp_ipc_isr_stall_resume(); esp_ipc_isr_release_other_cpu(); +#if !CONFIG_FREERTOS_UNICORE + esp_clk_private_unlock(); + portEXIT_CRITICAL_SAFE(&rtc_spinlock); +#endif portEXIT_CRITICAL(&spinlock_rtc_deep_sleep); return err; }