From 890fc0fe671f5dfd10b32b6d250e37d175842be2 Mon Sep 17 00:00:00 2001 From: morris Date: Tue, 31 Mar 2020 18:44:37 +0800 Subject: [PATCH] esp_timer: alias esp_timer_get_time alias esp_timer_get_time to improve performance --- components/esp_timer/private_include/esp_timer_impl.h | 2 +- components/esp_timer/src/esp_timer.c | 7 +------ components/esp_timer/src/esp_timer_impl_frc_legacy.c | 4 +++- components/esp_timer/src/esp_timer_impl_lac.c | 4 +++- components/esp_timer/src/esp_timer_impl_systimer.c | 5 ++++- components/esp_timer/test/test_esp_timer.c | 4 ++-- 6 files changed, 14 insertions(+), 12 deletions(-) diff --git a/components/esp_timer/private_include/esp_timer_impl.h b/components/esp_timer/private_include/esp_timer_impl.h index f398aaba7e..75e7e1b0d9 100644 --- a/components/esp_timer/private_include/esp_timer_impl.h +++ b/components/esp_timer/private_include/esp_timer_impl.h @@ -73,7 +73,7 @@ void esp_timer_impl_advance(int64_t time_us); * @brief Get time, in microseconds, since esp_timer_impl_init was called * @return timestamp in microseconds */ -uint64_t esp_timer_impl_get_time(void); +int64_t esp_timer_impl_get_time(void); /** * @brief Get minimal timer period, in microseconds diff --git a/components/esp_timer/src/esp_timer.c b/components/esp_timer/src/esp_timer.c index 28977c181e..0a7d95d764 100644 --- a/components/esp_timer/src/esp_timer.c +++ b/components/esp_timer/src/esp_timer.c @@ -278,7 +278,7 @@ static void timer_process_alarm(esp_timer_dispatch_t dispatch_method) (void) dispatch_method; timer_list_lock(); - uint64_t now = esp_timer_impl_get_time(); + int64_t now = esp_timer_impl_get_time(); esp_timer_handle_t it = LIST_FIRST(&s_timers); while (it != NULL && it->alarm < now) { @@ -502,8 +502,3 @@ int64_t IRAM_ATTR esp_timer_get_next_alarm(void) timer_list_unlock(); return next_alarm; } - -int64_t IRAM_ATTR esp_timer_get_time(void) -{ - return (int64_t) esp_timer_impl_get_time(); -} diff --git a/components/esp_timer/src/esp_timer_impl_frc_legacy.c b/components/esp_timer/src/esp_timer_impl_frc_legacy.c index c1144a68b3..e432b1390b 100644 --- a/components/esp_timer/src/esp_timer_impl_frc_legacy.c +++ b/components/esp_timer/src/esp_timer_impl_frc_legacy.c @@ -176,7 +176,7 @@ void esp_timer_impl_unlock(void) portEXIT_CRITICAL(&s_time_update_lock); } -uint64_t IRAM_ATTR esp_timer_impl_get_time(void) +int64_t IRAM_ATTR esp_timer_impl_get_time(void) { uint32_t timer_val; uint64_t time_base; @@ -209,6 +209,8 @@ uint64_t IRAM_ATTR esp_timer_impl_get_time(void) return result; } +int64_t esp_timer_get_time(void) __attribute__((alias("esp_timer_impl_get_time"))); + void IRAM_ATTR esp_timer_impl_set_alarm(uint64_t timestamp) { portENTER_CRITICAL_SAFE(&s_time_update_lock); diff --git a/components/esp_timer/src/esp_timer_impl_lac.c b/components/esp_timer/src/esp_timer_impl_lac.c index a61e740a3d..c2d66a33f3 100644 --- a/components/esp_timer/src/esp_timer_impl_lac.c +++ b/components/esp_timer/src/esp_timer_impl_lac.c @@ -144,11 +144,13 @@ uint64_t IRAM_ATTR esp_timer_impl_get_counter_reg(void) return result.val; } -uint64_t IRAM_ATTR esp_timer_impl_get_time(void) +int64_t IRAM_ATTR esp_timer_impl_get_time(void) { return esp_timer_impl_get_counter_reg() / TICKS_PER_US; } +int64_t esp_timer_get_time(void) __attribute__((alias("esp_timer_impl_get_time"))); + void IRAM_ATTR esp_timer_impl_set_alarm(uint64_t timestamp) { portENTER_CRITICAL_SAFE(&s_time_update_lock); diff --git a/components/esp_timer/src/esp_timer_impl_systimer.c b/components/esp_timer/src/esp_timer_impl_systimer.c index 5c7bfaabca..30c7a3a120 100644 --- a/components/esp_timer/src/esp_timer_impl_systimer.c +++ b/components/esp_timer/src/esp_timer_impl_systimer.c @@ -63,11 +63,14 @@ uint64_t IRAM_ATTR esp_timer_impl_get_counter_reg(void) return systimer_hal_get_counter_value(SYSTIMER_COUNTER_0); } -uint64_t IRAM_ATTR esp_timer_impl_get_time(void) +int64_t IRAM_ATTR esp_timer_impl_get_time(void) { return systimer_hal_get_time(SYSTIMER_COUNTER_0); } +// Xtensa architecture doesn't have tail call optimization, using alias here can improve performance somehow +int64_t esp_timer_get_time(void) __attribute__((alias("esp_timer_impl_get_time"))); + void IRAM_ATTR esp_timer_impl_set_alarm(uint64_t timestamp) { portENTER_CRITICAL_SAFE(&s_time_update_lock); diff --git a/components/esp_timer/test/test_esp_timer.c b/components/esp_timer/test/test_esp_timer.c index a820f04be9..839b68a29b 100644 --- a/components/esp_timer/test/test_esp_timer.c +++ b/components/esp_timer/test/test_esp_timer.c @@ -113,8 +113,8 @@ TEST_CASE("esp_timer_impl_set_alarm stress test", "[esp_timer]") { SemaphoreHandle_t done = (SemaphoreHandle_t) arg; - uint64_t start = esp_timer_impl_get_time(); - uint64_t now = start; + int64_t start = esp_timer_impl_get_time(); + int64_t now = start; int count = 0; const int delays[] = {50, 5000, 10000000}; const int delays_count = sizeof(delays)/sizeof(delays[0]);