From e70f240e128d5f52e620c13c0207373fb5656912 Mon Sep 17 00:00:00 2001 From: Renz Bagaporo Date: Tue, 18 Aug 2020 16:15:53 +0800 Subject: [PATCH] esp_timer: do init check in timer implementation --- components/esp_timer/src/esp_timer.c | 13 ++----------- .../esp_timer/src/esp_timer_impl_frc_legacy.c | 7 ++++++- components/esp_timer/src/esp_timer_impl_lac.c | 7 ++++++- components/esp_timer/src/esp_timer_impl_systimer.c | 7 ++++++- 4 files changed, 20 insertions(+), 14 deletions(-) diff --git a/components/esp_timer/src/esp_timer.c b/components/esp_timer/src/esp_timer.c index a1d870c6d0..c645886ecd 100644 --- a/components/esp_timer/src/esp_timer.c +++ b/components/esp_timer/src/esp_timer.c @@ -78,7 +78,7 @@ struct esp_timer { LIST_ENTRY(esp_timer) list_entry; }; -static bool is_initialized(void); +static inline bool is_initialized(void); static esp_err_t timer_insert(esp_timer_handle_t timer); static esp_err_t timer_remove(esp_timer_handle_t timer); static bool timer_armed(esp_timer_handle_t timer); @@ -361,7 +361,7 @@ static void IRAM_ATTR timer_alarm_handler(void* arg) } } -static IRAM_ATTR bool is_initialized(void) +static IRAM_ATTR inline bool is_initialized(void) { return s_timer_task != NULL; } @@ -529,15 +529,6 @@ int64_t IRAM_ATTR esp_timer_get_next_alarm(void) return next_alarm; } -int64_t IRAM_ATTR esp_timer_get_time(void) -{ - if(is_initialized()) { - return esp_timer_impl_get_time(); - } else { - return 0; - } -} - // Provides strong definition for system time functions relied upon // by core components. #if WITH_FRC 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 88c254950f..c766bacd9a 100644 --- a/components/esp_timer/src/esp_timer_impl_frc_legacy.c +++ b/components/esp_timer/src/esp_timer_impl_frc_legacy.c @@ -103,7 +103,7 @@ static intr_handle_t s_timer_interrupt_handle; // Function from the upper layer to be called when the interrupt happens. // Registered in esp_timer_impl_init. -static intr_handler_t s_alarm_handler; +static intr_handler_t s_alarm_handler = NULL; // Time in microseconds from startup to the moment // when timer counter was last equal to 0. This variable is updated each time @@ -178,6 +178,9 @@ void esp_timer_impl_unlock(void) int64_t IRAM_ATTR esp_timer_impl_get_time(void) { + if (s_alarm_handler == NULL) { + return 0; + } uint32_t timer_val; uint64_t time_base; uint32_t ticks_per_us; @@ -209,6 +212,8 @@ int64_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 6c2942f500..f8ca8d5461 100644 --- a/components/esp_timer/src/esp_timer_impl_lac.c +++ b/components/esp_timer/src/esp_timer_impl_lac.c @@ -97,7 +97,7 @@ static intr_handle_t s_timer_interrupt_handle; /* Function from the upper layer to be called when the interrupt happens. * Registered in esp_timer_impl_init. */ -static intr_handler_t s_alarm_handler; +static intr_handler_t s_alarm_handler = NULL; /* Spinlock used to protect access to the hardware registers. */ portMUX_TYPE s_time_update_lock = portMUX_INITIALIZER_UNLOCKED; @@ -146,9 +146,14 @@ uint64_t IRAM_ATTR esp_timer_impl_get_counter_reg(void) int64_t IRAM_ATTR esp_timer_impl_get_time(void) { + if (s_alarm_handler == NULL) { + return 0; + } 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 1bdda19557..fce86a5eaf 100644 --- a/components/esp_timer/src/esp_timer_impl_systimer.c +++ b/components/esp_timer/src/esp_timer_impl_systimer.c @@ -43,7 +43,7 @@ static intr_handle_t s_timer_interrupt_handle; /* Function from the upper layer to be called when the interrupt happens. * Registered in esp_timer_impl_init. */ -static intr_handler_t s_alarm_handler; +static intr_handler_t s_alarm_handler = NULL; /* Spinlock used to protect access to the hardware registers. */ portMUX_TYPE s_time_update_lock = portMUX_INITIALIZER_UNLOCKED; @@ -65,9 +65,14 @@ uint64_t IRAM_ATTR esp_timer_impl_get_counter_reg(void) int64_t IRAM_ATTR esp_timer_impl_get_time(void) { + if (s_alarm_handler == NULL) { + return 0; + } return systimer_hal_get_time(SYSTIMER_COUNTER_0); } +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);