From 90fff319cde3ae44363c08e70fc9d034573933e8 Mon Sep 17 00:00:00 2001 From: muhaidong Date: Mon, 7 Sep 2026 22:00:30 +0800 Subject: [PATCH] fix(esp_timer): preserve timer_process_alarm symbol for ldgen --- components/esp_timer/CMakeLists.txt | 4 ++-- components/esp_timer/linker.lf | 6 ++++++ components/esp_timer/src/esp_timer.c | 5 +++-- components/esp_wifi/linker.lf | 7 ------- 4 files changed, 11 insertions(+), 11 deletions(-) create mode 100644 components/esp_timer/linker.lf diff --git a/components/esp_timer/CMakeLists.txt b/components/esp_timer/CMakeLists.txt index 613264f171c..953f528a0b7 100644 --- a/components/esp_timer/CMakeLists.txt +++ b/components/esp_timer/CMakeLists.txt @@ -14,7 +14,6 @@ else() elseif(CONFIG_ESP_TIMER_IMPL_SYSTIMER) list(APPEND srcs "src/esp_timer_impl_systimer.c") endif() - if(CONFIG_SOC_SYSTIMER_SUPPORT_ETM) list(APPEND srcs "src/esp_timer_etm.c") endif() @@ -22,7 +21,8 @@ else() idf_component_register(SRCS "${srcs}" INCLUDE_DIRS include PRIV_REQUIRES esp_hal_timg - PRIV_INCLUDE_DIRS private_include) + PRIV_INCLUDE_DIRS private_include + LDFRAGMENTS linker.lf) # Forces the linker to include esp_timer_init.c target_link_libraries(${COMPONENT_LIB} INTERFACE "-u esp_timer_init_include_func") diff --git a/components/esp_timer/linker.lf b/components/esp_timer/linker.lf new file mode 100644 index 00000000000..4aade496869 --- /dev/null +++ b/components/esp_timer/linker.lf @@ -0,0 +1,6 @@ +[mapping:esp_timer_wifi_pm] +archive: libesp_timer.a +entries: + if ESP_WIFI_SLP_IRAM_OPT = y && IDF_TARGET_ESP32 = y: + esp_timer:timer_task (noflash) + esp_timer:timer_process_alarm (noflash) diff --git a/components/esp_timer/src/esp_timer.c b/components/esp_timer/src/esp_timer.c index 28f70e73a6f..4bdf177e737 100644 --- a/components/esp_timer/src/esp_timer.c +++ b/components/esp_timer/src/esp_timer.c @@ -385,10 +385,11 @@ static ESP_TIMER_IRAM_ATTR void timer_list_unlock(esp_timer_dispatch_t timer_typ portEXIT_CRITICAL_SAFE(&s_timer_lock[timer_type]); } +// Keep this as a standalone symbol because ldgen maps it by name. #ifdef CONFIG_ESP_TIMER_SUPPORTS_ISR_DISPATCH_METHOD -static ESP_TIMER_IRAM_ATTR bool timer_process_alarm(esp_timer_dispatch_t dispatch_method) +static ESP_TIMER_IRAM_ATTR __attribute__((noinline, noclone)) bool timer_process_alarm(esp_timer_dispatch_t dispatch_method) #else -static bool timer_process_alarm(esp_timer_dispatch_t dispatch_method) +static __attribute__((noinline, noclone)) bool timer_process_alarm(esp_timer_dispatch_t dispatch_method) #endif { timer_list_lock(dispatch_method); diff --git a/components/esp_wifi/linker.lf b/components/esp_wifi/linker.lf index f0ff4efb82e..d4137ebcd03 100644 --- a/components/esp_wifi/linker.lf +++ b/components/esp_wifi/linker.lf @@ -163,10 +163,3 @@ entries: if PM_ENABLE = y: wifi_init:wifi_apb80m_request (noflash) wifi_init:wifi_apb80m_release (noflash) - -[mapping:esp_timer_wifi_pm] -archive: libesp_timer.a -entries: - if ESP_WIFI_SLP_IRAM_OPT = y && IDF_TARGET_ESP32 = y: - esp_timer:timer_task (noflash) - esp_timer:timer_process_alarm (noflash)