Skip to content

Commit dd980b7

Browse files
committed
Merge branch 'fix/fix_esp32_core1_access_rtc_fast_in_sleep_code' into 'master'
fix(esp_hw_support): fix esp32 APP_CPU accessing RTCFAST memory in sleep code Closes IDFGH-15614 See merge request espressif/esp-idf!40452
2 parents a083766 + 70825a7 commit dd980b7

File tree

3 files changed

+44
-15
lines changed

3 files changed

+44
-15
lines changed

components/esp_hw_support/sleep_modes.c

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -326,8 +326,9 @@ static bool s_light_sleep_wakeup = false;
326326
static portMUX_TYPE __attribute__((unused)) spinlock_rtc_deep_sleep = portMUX_INITIALIZER_UNLOCKED;
327327

328328
static const char *TAG = "sleep";
329-
static RTC_FAST_ATTR int32_t s_sleep_sub_mode_ref_cnt[ESP_SLEEP_MODE_MAX] = { 0 };
330-
//in this mode, 2uA is saved, but RTC memory can't use at high temperature, and RTCIO can't be used as INPUT.
329+
330+
/* APP core of esp32 can't access to RTC FAST MEMORY, do not define it with RTC_IRAM_ATTR */
331+
RTC_SLOW_ATTR static int32_t s_sleep_sub_mode_ref_cnt[ESP_SLEEP_MODE_MAX] = { 0 };
331332

332333
void esp_sleep_overhead_out_time_refresh(void)
333334
{
@@ -424,12 +425,12 @@ esp_deep_sleep_wake_stub_fn_t esp_get_deep_sleep_wake_stub(void)
424425
}
425426

426427
#if CONFIG_IDF_TARGET_ESP32
427-
/* APP core of esp32 can't access to RTC FAST MEMORY, do not define it with RTC_IRAM_ATTR */
428-
void
428+
/* APP core of esp32 can't access to RTC FAST MEMORY, link to RTC SLOW MEMORY instead*/
429+
RTC_SLOW_ATTR
429430
#else
430-
void RTC_IRAM_ATTR
431+
RTC_IRAM_ATTR
431432
#endif
432-
esp_set_deep_sleep_wake_stub(esp_deep_sleep_wake_stub_fn_t new_stub)
433+
void esp_set_deep_sleep_wake_stub(esp_deep_sleep_wake_stub_fn_t new_stub)
433434
{
434435
#if SOC_PM_SUPPORT_DEEPSLEEP_CHECK_STUB_ONLY
435436
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)
438439
#endif
439440
}
440441

441-
void RTC_IRAM_ATTR esp_default_wake_deep_sleep(void)
442+
443+
#if CONFIG_IDF_TARGET_ESP32
444+
/* APP core of esp32 can't access to RTC FAST MEMORY, link to RTC SLOW MEMORY instead*/
445+
RTC_SLOW_ATTR
446+
#else
447+
RTC_IRAM_ATTR
448+
#endif
449+
void esp_default_wake_deep_sleep(void)
442450
{
443451
/* Clear MMU for CPU 0 */
444452
#if CONFIG_IDF_TARGET_ESP32
@@ -2839,11 +2847,11 @@ static SLEEP_FN_ATTR uint32_t get_sleep_clock_icg_flags(void)
28392847

28402848
#if CONFIG_IDF_TARGET_ESP32
28412849
/* APP core of esp32 can't access to RTC FAST MEMORY, do not define it with RTC_IRAM_ATTR */
2842-
void
2850+
RTC_SLOW_ATTR
28432851
#else
2844-
void RTC_IRAM_ATTR
2852+
RTC_IRAM_ATTR
28452853
#endif
2846-
esp_deep_sleep_disable_rom_logging(void)
2854+
void esp_deep_sleep_disable_rom_logging(void)
28472855
{
28482856
rtc_suppress_rom_log();
28492857
}

components/esp_hw_support/test_apps/rtc_8md256/main/test_rtc_8md256.c

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
#include <stdio.h>
88
#include <string.h>
9+
#include <unistd.h>
910
#include "esp_sleep.h"
1011
#include "unity.h"
1112
#include "unity_test_utils.h"
@@ -38,6 +39,30 @@ TEST_CASE("Can use 8MD256 as RTC clock source in deepsleep", "[pm]")
3839
test_deepsleep(false);
3940
}
4041

42+
static void check_reset_reason_deep_sleep(void)
43+
{
44+
TEST_ASSERT_EQUAL(ESP_RST_DEEPSLEEP, esp_reset_reason());
45+
}
46+
47+
static void enter_deepsleep_by_core1(void *args)
48+
{
49+
do {
50+
test_deepsleep(false);
51+
} while (1);
52+
}
53+
54+
static void request_core1_do_deepsleep(void)
55+
{
56+
fflush(stdout);
57+
fsync(fileno(stdout));
58+
xTaskCreatePinnedToCore(enter_deepsleep_by_core1, "deep_sleep_task", 4096, NULL, 6, NULL, 1);
59+
while(1);
60+
}
61+
62+
TEST_CASE_MULTIPLE_STAGES("Can use 8MD256 as RTC clock source in deepsleep (enter sleep by core1)", "[pm]",
63+
request_core1_do_deepsleep,
64+
check_reset_reason_deep_sleep);
65+
4166
static void test_lightsleep(bool force_rtc_periph)
4267
{
4368
esp_sleep_enable_timer_wakeup(2000000);

examples/system/deep_sleep/main/deep_sleep_example_main.c

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,7 @@
1818
#include "nvs.h"
1919
#include "deep_sleep_example.h"
2020

21-
#if SOC_RTC_FAST_MEM_SUPPORTED
22-
static RTC_DATA_ATTR struct timeval sleep_enter_time;
23-
#else
24-
static struct timeval sleep_enter_time;
25-
#endif
21+
RTC_SLOW_ATTR static struct timeval sleep_enter_time;
2622

2723
static void deep_sleep_task(void *args)
2824
{

0 commit comments

Comments
 (0)