diff --git a/esphome/core/application.h b/esphome/core/application.h index 66bf189fa9..cc1aba77ca 100644 --- a/esphome/core/application.h +++ b/esphome/core/application.h @@ -928,14 +928,10 @@ inline void ESPHOME_ALWAYS_INLINE Application::yield_with_select_(uint32_t delay // Sleep with instant wake via FreeRTOS task notification. // Woken by: callback wrapper (socket data), wake_loop_threadsafe() (background tasks), or timeout. - ulTaskNotifyTake(pdTRUE, pdMS_TO_TICKS(delay_ms)); -#elif defined(USE_ESP8266) || defined(USE_RP2040) - // Wakeable delay — broken early by wake_loop_any_context() / wake_loop_threadsafe() - // ESP8266: esp_delay() with wake flag callback - // RP2040: hardware timer + __wfe()/__sev() esphome::wakeable_delay(delay_ms); #else -#error "No wakeable delay implementation for this platform" + // All other platforms: wakeable delay broken early by wake_loop_any_context() / wake_loop_threadsafe() + esphome::wakeable_delay(delay_ms); #endif } #endif // !defined(USE_SOCKET_SELECT_SUPPORT) || defined(USE_LWIP_FAST_SELECT) diff --git a/esphome/core/wake.h b/esphome/core/wake.h index 185b73b870..ae9fc8d355 100644 --- a/esphome/core/wake.h +++ b/esphome/core/wake.h @@ -14,6 +14,13 @@ #ifdef USE_LWIP_FAST_SELECT #include "esphome/core/lwip_fast_select.h" +#ifdef USE_ESP32 +#include +#include +#else +#include +#include +#endif #endif #ifdef USE_ESP8266 #include @@ -54,6 +61,14 @@ inline void wake_loop_any_context() { esphome_lwip_wake_main_loop(); } inline void wake_loop_threadsafe() { esphome_lwip_wake_main_loop(); } +inline void wakeable_delay(uint32_t ms) { + if (ms == 0) { + yield(); + return; + } + ulTaskNotifyTake(pdTRUE, pdMS_TO_TICKS(ms)); +} + // === ESP8266 === #elif defined(USE_ESP8266)