From 74de5a7c5890b39ee128b11ffd8c5ece2a8daf81 Mon Sep 17 00:00:00 2001 From: Renz Bagaporo Date: Mon, 8 Mar 2021 23:01:40 +0800 Subject: [PATCH] esp_timer: correct startup time --- components/esp_timer/CMakeLists.txt | 3 +- .../private_include/esp_timer_impl.h | 7 +++ components/esp_timer/src/esp_timer.c | 18 +------ components/esp_timer/src/system_time.c | 53 +++++++++++++++++++ 4 files changed, 63 insertions(+), 18 deletions(-) create mode 100644 components/esp_timer/src/system_time.c diff --git a/components/esp_timer/CMakeLists.txt b/components/esp_timer/CMakeLists.txt index 0fbbee530b..d799aa7c23 100644 --- a/components/esp_timer/CMakeLists.txt +++ b/components/esp_timer/CMakeLists.txt @@ -1,7 +1,8 @@ idf_build_get_property(target IDF_TARGET) set(srcs "src/esp_timer.c" - "src/ets_timer_legacy.c") + "src/ets_timer_legacy.c" + "src/system_time.c") if(CONFIG_ESP_TIMER_IMPL_FRC2) list(APPEND srcs "src/esp_timer_impl_frc_legacy.c") diff --git a/components/esp_timer/private_include/esp_timer_impl.h b/components/esp_timer/private_include/esp_timer_impl.h index d572550ad8..63daba0d9e 100644 --- a/components/esp_timer/private_include/esp_timer_impl.h +++ b/components/esp_timer/private_include/esp_timer_impl.h @@ -132,3 +132,10 @@ uint64_t esp_timer_impl_get_counter_reg(void); * @return the value of the alarm register */ uint64_t esp_timer_impl_get_alarm_reg(void); + +#if CONFIG_ESP_TIME_FUNCS_USE_ESP_TIMER +/** + * @brief Initialize esp_timer as system time provider. + */ +void esp_timer_impl_init_system_time(void); +#endif diff --git a/components/esp_timer/src/esp_timer.c b/components/esp_timer/src/esp_timer.c index 81d8c00161..8e370a8604 100644 --- a/components/esp_timer/src/esp_timer.c +++ b/components/esp_timer/src/esp_timer.c @@ -446,9 +446,7 @@ esp_err_t esp_timer_init(void) } #if CONFIG_ESP_TIME_FUNCS_USE_ESP_TIMER - // [refactor-todo] this logic, "esp_rtc_get_time_us() - g_startup_time", is also - // the weak definition of esp_system_get_time; find a way to remove this duplication. - esp_timer_private_advance(esp_rtc_get_time_us() - g_startup_time); + esp_timer_impl_init_system_time(); #endif return ESP_OK; @@ -600,17 +598,3 @@ int64_t IRAM_ATTR esp_timer_get_next_alarm(void) } return next_alarm; } - -// Provides strong definition for system time functions relied upon -// by core components. -#if CONFIG_ESP_TIME_FUNCS_USE_ESP_TIMER -int64_t IRAM_ATTR esp_system_get_time(void) -{ - return esp_timer_get_time(); -} - -uint32_t IRAM_ATTR esp_system_get_time_resolution(void) -{ - return 1000; -} -#endif diff --git a/components/esp_timer/src/system_time.c b/components/esp_timer/src/system_time.c new file mode 100644 index 0000000000..08f0e7d292 --- /dev/null +++ b/components/esp_timer/src/system_time.c @@ -0,0 +1,53 @@ +// Copyright 2017 Espressif Systems (Shanghai) PTE LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Provides strong definition for system time functions relied upon +// by core components. +#include "sdkconfig.h" + +#if CONFIG_ESP_TIME_FUNCS_USE_ESP_TIMER +#include "esp_timer.h" +#include "esp_timer_impl.h" + +#include "esp_private/startup_internal.h" + +#if CONFIG_IDF_TARGET_ESP32 +#include "esp32/rtc.h" +#elif CONFIG_IDF_TARGET_ESP32S2 +#include "esp32s2/rtc.h" +#elif CONFIG_IDF_TARGET_ESP32S3 +#include "esp32s3/rtc.h" +#elif CONFIG_IDF_TARGET_ESP32C3 +#include "esp32c3/rtc.h" +#endif + +// Correction for underlying timer to keep definition +// of system time consistent. +static int64_t s_correction_us = 0; + +void esp_timer_impl_init_system_time(void) +{ + s_correction_us = esp_rtc_get_time_us() - g_startup_time - esp_timer_impl_get_time(); +} + +int64_t IRAM_ATTR esp_system_get_time(void) +{ + return esp_timer_get_time() + s_correction_us; +} + +uint32_t IRAM_ATTR esp_system_get_time_resolution(void) +{ + return 1000; +} +#endif