Wire wake_loop_any_context() for RP2040 via socket_wake()

This commit is contained in:
J. Nick Koston
2026-03-04 23:02:07 -10:00
parent 1e2c892139
commit 1a353fedc2
2 changed files with 9 additions and 3 deletions
+6 -2
View File
@@ -34,7 +34,7 @@
#endif
#endif
#endif // USE_SOCKET_SELECT_SUPPORT
#if defined(USE_ESP8266) && defined(USE_SOCKET_IMPL_LWIP_TCP)
#if (defined(USE_ESP8266) || defined(USE_RP2040)) && defined(USE_SOCKET_IMPL_LWIP_TCP)
namespace esphome::socket {
void socket_wake(); // NOLINT(readability-redundant-declaration)
} // namespace esphome::socket
@@ -541,8 +541,12 @@ class Application {
#if defined(USE_ESP8266) && defined(USE_SOCKET_IMPL_LWIP_TCP)
/// Wake the main event loop from any context (ISR, thread, or main loop).
/// On ESP8266: sets the socket wake flag and calls esp_schedule() to exit esp_delay() early.
/// Sets the socket wake flag and calls esp_schedule() to exit esp_delay() early.
static void IRAM_ATTR wake_loop_any_context() { socket::socket_wake(); }
#elif defined(USE_RP2040) && defined(USE_SOCKET_IMPL_LWIP_TCP)
/// Wake the main event loop from any context.
/// Sets the socket wake flag and calls __sev() to exit __wfe() early.
static void wake_loop_any_context() { socket::socket_wake(); }
#endif
protected:
+3 -1
View File
@@ -322,11 +322,13 @@ void IRAM_ATTR HOT Component::enable_loop_soon_any_context() {
// 8. Race condition with main loop is handled by clearing flag before processing
this->pending_enable_loop_ = true;
App.has_pending_enable_loop_requests_ = true;
#if (defined(USE_LWIP_FAST_SELECT) && defined(USE_ESP32)) || (defined(USE_ESP8266) && defined(USE_SOCKET_IMPL_LWIP_TCP))
#if (defined(USE_LWIP_FAST_SELECT) && defined(USE_ESP32)) || \
((defined(USE_ESP8266) || defined(USE_RP2040)) && defined(USE_SOCKET_IMPL_LWIP_TCP))
// Wake the main loop from sleep. Without this, the main loop would not
// wake until the select/delay timeout expires (~16ms).
// ESP32: uses xPortInIsrContext() to choose the correct FreeRTOS notify API.
// ESP8266: sets socket wake flag and calls esp_schedule() to exit esp_delay() early.
// RP2040: sets socket wake flag and calls __sev() to exit __wfe() early.
Application::wake_loop_any_context();
#endif
}