From 05b7db9cd882b171136aee6ab1a40c7f6d89e3b9 Mon Sep 17 00:00:00 2001 From: jingli Date: Sun, 1 May 2022 23:26:52 +0800 Subject: [PATCH] fix _rtc_slow_length being incorrectly optimized by compiler --- components/esp32/sleep_modes.c | 8 ++++++-- components/esp32s2/sleep_modes.c | 8 ++++++-- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/components/esp32/sleep_modes.c b/components/esp32/sleep_modes.c index 1bac8f1ef0..4e18855e6a 100644 --- a/components/esp32/sleep_modes.c +++ b/components/esp32/sleep_modes.c @@ -662,10 +662,14 @@ static uint32_t get_power_down_flags(void) // Labels are defined in the linker script, see esp32.ld. extern int _rtc_slow_length; + /** + * Compiler considers "(size_t) &_rtc_slow_length > 0" to always be true. + * So use a volatile variable to prevent compiler from doing this optimization. + */ + volatile size_t rtc_slow_mem_used = (size_t)&_rtc_slow_length; if ((s_config.pd_options[ESP_PD_DOMAIN_RTC_SLOW_MEM] == ESP_PD_OPTION_AUTO) && - ((size_t) &_rtc_slow_length > 0 || - (s_config.wakeup_triggers & RTC_ULP_TRIG_EN))) { + (rtc_slow_mem_used > 0 || (s_config.wakeup_triggers & RTC_ULP_TRIG_EN))) { s_config.pd_options[ESP_PD_DOMAIN_RTC_SLOW_MEM] = ESP_PD_OPTION_ON; } diff --git a/components/esp32s2/sleep_modes.c b/components/esp32s2/sleep_modes.c index f72fc63515..fa01026ff1 100644 --- a/components/esp32s2/sleep_modes.c +++ b/components/esp32s2/sleep_modes.c @@ -695,10 +695,14 @@ static uint32_t get_power_down_flags(void) // Labels are defined in the linker script, see esp32s2.ld. extern int _rtc_slow_length; + /** + * Compiler considers "(size_t) &_rtc_slow_length > 0" to always be true. + * So use a volatile variable to prevent compiler from doing this optimization. + */ + volatile size_t rtc_slow_mem_used = (size_t)&_rtc_slow_length; if ((s_config.pd_options[ESP_PD_DOMAIN_RTC_SLOW_MEM] == ESP_PD_OPTION_AUTO) && - ((size_t) &_rtc_slow_length > 0 || - (s_config.wakeup_triggers & RTC_ULP_TRIG_EN))) { + (rtc_slow_mem_used > 0 || (s_config.wakeup_triggers & RTC_ULP_TRIG_EN))) { s_config.pd_options[ESP_PD_DOMAIN_RTC_SLOW_MEM] = ESP_PD_OPTION_ON; }