diff --git a/cores/esp8266/core_esp8266_wiring_pulse.cpp b/cores/esp8266/core_esp8266_wiring_pulse.cpp index 8e124ac312..b20bdb4c45 100644 --- a/cores/esp8266/core_esp8266_wiring_pulse.cpp +++ b/cores/esp8266/core_esp8266_wiring_pulse.cpp @@ -26,13 +26,20 @@ extern "C" { extern uint32_t xthal_get_ccount(); -#define WAIT_FOR_PIN_STATE(state) \ - while (digitalRead(pin) != (state)) { \ - if (xthal_get_ccount() - start_cycle_count > timeout_cycles) { \ - return 0; \ - } \ - optimistic_yield(5000); \ +namespace { + inline __attribute__((always_inline)) bool waitForPinState( + const uint8_t pin, const uint8_t state, + const uint32_t timeout_cycles, const uint32_t start_cycle_count) + { + while (digitalRead(pin) != state) { + if (xthal_get_ccount() - start_cycle_count > timeout_cycles) { + return false; + } + optimistic_yield(1000); + } + return true; } +} // max timeout is 27 seconds at 160MHz clock and 54 seconds at 80MHz clock unsigned long pulseIn(uint8_t pin, uint8_t state, unsigned long timeout) @@ -43,10 +50,16 @@ unsigned long pulseIn(uint8_t pin, uint8_t state, unsigned long timeout) } const uint32_t timeout_cycles = microsecondsToClockCycles(timeout); const uint32_t start_cycle_count = xthal_get_ccount(); - WAIT_FOR_PIN_STATE(!state); - WAIT_FOR_PIN_STATE(state); + if (!waitForPinState(pin, !state, timeout_cycles, start_cycle_count)) { + return 0; + } + if (!waitForPinState(pin, state, timeout_cycles, start_cycle_count)) { + return 0; + } const uint32_t pulse_start_cycle_count = xthal_get_ccount(); - WAIT_FOR_PIN_STATE(!state); + if (!waitForPinState(pin, !state, timeout_cycles, start_cycle_count)) { + return 0; + } return clockCyclesToMicroseconds(xthal_get_ccount() - pulse_start_cycle_count); } diff --git a/cores/esp8266/uart.cpp b/cores/esp8266/uart.cpp index 802072d438..de57ff880a 100644 --- a/cores/esp8266/uart.cpp +++ b/cores/esp8266/uart.cpp @@ -510,7 +510,10 @@ uart_tx_fifo_full(const int uart_nr) static void uart_do_write_char(const int uart_nr, char c) { - while(uart_tx_fifo_full(uart_nr)); + while(uart_tx_fifo_full(uart_nr)) + { + optimistic_yield(10000UL); + } USF(uart_nr) = c; } @@ -544,7 +547,6 @@ uart_write(uart_t* uart, const char* buf, size_t size) const int uart_nr = uart->uart_nr; while (size--) { uart_do_write_char(uart_nr, pgm_read_byte(buf++)); - optimistic_yield(10000UL); } return ret; diff --git a/libraries/ESP8266WiFi/src/WiFiUdp.cpp b/libraries/ESP8266WiFi/src/WiFiUdp.cpp index a45659d844..8a7e0cff0b 100644 --- a/libraries/ESP8266WiFi/src/WiFiUdp.cpp +++ b/libraries/ESP8266WiFi/src/WiFiUdp.cpp @@ -117,7 +117,7 @@ int WiFiUDP::available() { if (!result) { // yielding here will not make more data "available", // but it will prevent the system from going into WDT reset - optimistic_yield(1000); + optimistic_yield(100UL); } return result; @@ -194,7 +194,7 @@ int WiFiUDP::parsePacket() return 0; if (!_ctx->next()) { - optimistic_yield(100); + optimistic_yield(100UL); return 0; } diff --git a/libraries/Wire/Wire.cpp b/libraries/Wire/Wire.cpp index b2d9a6affc..a68b8962ba 100644 --- a/libraries/Wire/Wire.cpp +++ b/libraries/Wire/Wire.cpp @@ -227,7 +227,7 @@ int TwoWire::available(void) { // yielding here will not make more data "available", // but it will prevent the system from going into WDT reset - optimistic_yield(1000); + optimistic_yield(100UL); } return result;