From 56c28319923fa21d3e7efe854e3bcf7082dd85f0 Mon Sep 17 00:00:00 2001 From: wuzhenghui Date: Tue, 8 Jul 2025 16:58:31 +0800 Subject: [PATCH 1/2] fix(esp_hw_support): fix esp32 APP_CPU accessing RTCFAST memory in sleep code Closes https://github.com/espressif/esp-idf/issues/16243 --- components/esp_hw_support/sleep_modes.c | 28 ++++++++++++------- .../deep_sleep/main/deep_sleep_example_main.c | 4 +-- 2 files changed, 19 insertions(+), 13 deletions(-) diff --git a/components/esp_hw_support/sleep_modes.c b/components/esp_hw_support/sleep_modes.c index f6d48b9309..03b6233509 100644 --- a/components/esp_hw_support/sleep_modes.c +++ b/components/esp_hw_support/sleep_modes.c @@ -326,8 +326,9 @@ static bool s_light_sleep_wakeup = false; static portMUX_TYPE __attribute__((unused)) spinlock_rtc_deep_sleep = portMUX_INITIALIZER_UNLOCKED; static const char *TAG = "sleep"; -static RTC_FAST_ATTR int32_t s_sleep_sub_mode_ref_cnt[ESP_SLEEP_MODE_MAX] = { 0 }; -//in this mode, 2uA is saved, but RTC memory can't use at high temperature, and RTCIO can't be used as INPUT. + +/* APP core of esp32 can't access to RTC FAST MEMORY, do not define it with RTC_IRAM_ATTR */ +RTC_SLOW_ATTR static int32_t s_sleep_sub_mode_ref_cnt[ESP_SLEEP_MODE_MAX] = { 0 }; void esp_sleep_overhead_out_time_refresh(void) { @@ -424,12 +425,12 @@ esp_deep_sleep_wake_stub_fn_t esp_get_deep_sleep_wake_stub(void) } #if CONFIG_IDF_TARGET_ESP32 -/* APP core of esp32 can't access to RTC FAST MEMORY, do not define it with RTC_IRAM_ATTR */ -void +/* APP core of esp32 can't access to RTC FAST MEMORY, link to RTC SLOW MEMORY instead*/ +RTC_SLOW_ATTR #else -void RTC_IRAM_ATTR +RTC_IRAM_ATTR #endif -esp_set_deep_sleep_wake_stub(esp_deep_sleep_wake_stub_fn_t new_stub) +void esp_set_deep_sleep_wake_stub(esp_deep_sleep_wake_stub_fn_t new_stub) { #if SOC_PM_SUPPORT_DEEPSLEEP_CHECK_STUB_ONLY wake_stub_fn_handler = new_stub; @@ -438,7 +439,14 @@ esp_set_deep_sleep_wake_stub(esp_deep_sleep_wake_stub_fn_t new_stub) #endif } -void RTC_IRAM_ATTR esp_default_wake_deep_sleep(void) + +#if CONFIG_IDF_TARGET_ESP32 +/* APP core of esp32 can't access to RTC FAST MEMORY, link to RTC SLOW MEMORY instead*/ +RTC_SLOW_ATTR +#else +RTC_IRAM_ATTR +#endif +void esp_default_wake_deep_sleep(void) { /* Clear MMU for CPU 0 */ #if CONFIG_IDF_TARGET_ESP32 @@ -2839,11 +2847,11 @@ static SLEEP_FN_ATTR uint32_t get_sleep_clock_icg_flags(void) #if CONFIG_IDF_TARGET_ESP32 /* APP core of esp32 can't access to RTC FAST MEMORY, do not define it with RTC_IRAM_ATTR */ -void +RTC_SLOW_ATTR #else -void RTC_IRAM_ATTR +RTC_IRAM_ATTR #endif -esp_deep_sleep_disable_rom_logging(void) +void esp_deep_sleep_disable_rom_logging(void) { rtc_suppress_rom_log(); } diff --git a/examples/system/deep_sleep/main/deep_sleep_example_main.c b/examples/system/deep_sleep/main/deep_sleep_example_main.c index dcefc2e1d0..035c26a274 100644 --- a/examples/system/deep_sleep/main/deep_sleep_example_main.c +++ b/examples/system/deep_sleep/main/deep_sleep_example_main.c @@ -19,9 +19,7 @@ #include "deep_sleep_example.h" #if SOC_RTC_FAST_MEM_SUPPORTED -static RTC_DATA_ATTR struct timeval sleep_enter_time; -#else -static struct timeval sleep_enter_time; +RTC_SLOW_ATTR static struct timeval sleep_enter_time; #endif static void deep_sleep_task(void *args) From 70825a78af9d280994a4d330d0e39aa16cd72eed Mon Sep 17 00:00:00 2001 From: wuzhenghui Date: Tue, 8 Jul 2025 21:02:08 +0800 Subject: [PATCH 2/2] feat(esp_hw_support): add core1 enter deepsleep test case --- .../rtc_8md256/main/test_rtc_8md256.c | 25 +++++++++++++++++++ .../deep_sleep/main/deep_sleep_example_main.c | 2 -- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/components/esp_hw_support/test_apps/rtc_8md256/main/test_rtc_8md256.c b/components/esp_hw_support/test_apps/rtc_8md256/main/test_rtc_8md256.c index e646897d38..f5eaa90da1 100644 --- a/components/esp_hw_support/test_apps/rtc_8md256/main/test_rtc_8md256.c +++ b/components/esp_hw_support/test_apps/rtc_8md256/main/test_rtc_8md256.c @@ -6,6 +6,7 @@ #include #include +#include #include "esp_sleep.h" #include "unity.h" #include "unity_test_utils.h" @@ -38,6 +39,30 @@ TEST_CASE("Can use 8MD256 as RTC clock source in deepsleep", "[pm]") test_deepsleep(false); } +static void check_reset_reason_deep_sleep(void) +{ + TEST_ASSERT_EQUAL(ESP_RST_DEEPSLEEP, esp_reset_reason()); +} + +static void enter_deepsleep_by_core1(void *args) +{ + do { + test_deepsleep(false); + } while (1); +} + +static void request_core1_do_deepsleep(void) +{ + fflush(stdout); + fsync(fileno(stdout)); + xTaskCreatePinnedToCore(enter_deepsleep_by_core1, "deep_sleep_task", 4096, NULL, 6, NULL, 1); + while(1); +} + +TEST_CASE_MULTIPLE_STAGES("Can use 8MD256 as RTC clock source in deepsleep (enter sleep by core1)", "[pm]", + request_core1_do_deepsleep, + check_reset_reason_deep_sleep); + static void test_lightsleep(bool force_rtc_periph) { esp_sleep_enable_timer_wakeup(2000000); diff --git a/examples/system/deep_sleep/main/deep_sleep_example_main.c b/examples/system/deep_sleep/main/deep_sleep_example_main.c index 035c26a274..a53beb7eed 100644 --- a/examples/system/deep_sleep/main/deep_sleep_example_main.c +++ b/examples/system/deep_sleep/main/deep_sleep_example_main.c @@ -18,9 +18,7 @@ #include "nvs.h" #include "deep_sleep_example.h" -#if SOC_RTC_FAST_MEM_SUPPORTED RTC_SLOW_ATTR static struct timeval sleep_enter_time; -#endif static void deep_sleep_task(void *args) {