Skip to content

Commit

Permalink
Merge branch 'bugfix/light_sleep_when_rtc_is_used_for_gettimeofday_v4…
Browse files Browse the repository at this point in the history
….4' into 'release/v4.4'

esp_hw_support: Fix time spent in light sleep when RTC is used for gettimeofday (v4.4)

See merge request espressif/esp-idf!18413
  • Loading branch information
jack0c committed Jun 20, 2022
2 parents 3356aa3 + b0a1571 commit 6c5fb29
Show file tree
Hide file tree
Showing 2 changed files with 10 additions and 8 deletions.
8 changes: 4 additions & 4 deletions components/esp_hw_support/sleep_modes.c
Original file line number Diff line number Diff line change
Expand Up @@ -666,7 +666,7 @@ esp_err_t esp_light_sleep_start(void)

s_config.rtc_ticks_at_sleep_start = rtc_time_get();
uint32_t ccount_at_sleep_start = cpu_ll_get_cycle_count();
uint64_t frc_time_at_start = esp_system_get_time();
uint64_t frc_time_at_start = esp_timer_get_time();
uint32_t sleep_time_overhead_in = (ccount_at_sleep_start - s_config.ccount_ticks_record) / (esp_clk_cpu_freq() / 1000000ULL);

esp_ipc_isr_stall_other_cpu();
Expand Down Expand Up @@ -769,14 +769,14 @@ esp_err_t esp_light_sleep_start(void)
// FRC1 has been clock gated for the duration of the sleep, correct for that.
#ifdef CONFIG_IDF_TARGET_ESP32C3
/**
* On esp32c3, rtc_time_get() is non-blocking, esp_system_get_time() is
* On esp32c3, rtc_time_get() is non-blocking, esp_timer_get_time() is
* blocking, and the measurement data shows that this order is better.
*/
uint64_t frc_time_at_end = esp_system_get_time();
uint64_t frc_time_at_end = esp_timer_get_time();
uint64_t rtc_ticks_at_end = rtc_time_get();
#else
uint64_t rtc_ticks_at_end = rtc_time_get();
uint64_t frc_time_at_end = esp_system_get_time();
uint64_t frc_time_at_end = esp_timer_get_time();
#endif

uint64_t rtc_time_diff = rtc_time_slowclk_to_us(rtc_ticks_at_end - s_config.rtc_ticks_at_sleep_start, s_config.rtc_clk_cal_period);
Expand Down
10 changes: 6 additions & 4 deletions examples/system/esp_timer/main/esp_timer_example_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -61,14 +61,16 @@ void app_main(void)
/* Timekeeping continues in light sleep, and timers are scheduled
* correctly after light sleep.
*/
ESP_LOGI(TAG, "Entering light sleep for 0.5s, time since boot: %lld us",
esp_timer_get_time());
int64_t t1 = esp_timer_get_time();
ESP_LOGI(TAG, "Entering light sleep for 0.5s, time since boot: %lld us", t1);

ESP_ERROR_CHECK(esp_sleep_enable_timer_wakeup(500000));
esp_light_sleep_start();

ESP_LOGI(TAG, "Woke up from light sleep, time since boot: %lld us",
esp_timer_get_time());
int64_t t2 = esp_timer_get_time();
ESP_LOGI(TAG, "Woke up from light sleep, time since boot: %lld us", t2);

assert(abs((t2 - t1) - 500000) < 1000);

/* Let the timer run for a little bit more */
usleep(2000000);
Expand Down

0 comments on commit 6c5fb29

Please sign in to comment.