From cb654a1e503c3e3554213290c25430255e5eac7d Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Sat, 11 Apr 2026 22:58:13 -1000 Subject: [PATCH] [esp8266] Handle delay(0) as a yield point MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Arduino's delay(0) calls yield() once — used as a yield point by some code. Our millis-based loop would skip yielding entirely since 0 < 0 is false. Add explicit delay(0) → yield() handling. --- esphome/components/esp8266/core.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/esphome/components/esp8266/core.cpp b/esphome/components/esp8266/core.cpp index 68ca8a903b..32dd097c8d 100644 --- a/esphome/components/esp8266/core.cpp +++ b/esphome/components/esp8266/core.cpp @@ -60,9 +60,13 @@ uint64_t millis_64() { return Millis64Impl::compute(millis()); } // original millis body (~80 bytes IRAM). This yield loop achieves the same // behavior: feeds the watchdog, processes SDK tasks, keeps WiFi alive. void HOT delay(uint32_t ms) { + if (ms == 0) { + optimistic_yield(1000); + return; + } uint32_t start = millis(); while (millis() - start < ms) { - yield(); + optimistic_yield(1000); } } uint32_t IRAM_ATTR HOT micros() { return ::micros(); }