diff --git a/extmod/machine_pulse.c b/extmod/machine_pulse.c
index 5f837479dd61c712a310efc571d64120d0503f27..7178b22d791eca520de914bed4b00d38571fcb89 100644
--- a/extmod/machine_pulse.c
+++ b/extmod/machine_pulse.c
@@ -30,7 +30,7 @@
 
 #if MICROPY_PY_MACHINE_PULSE
 
-mp_uint_t machine_time_pulse_us(mp_hal_pin_obj_t pin, int pulse_level, mp_uint_t timeout_us) {
+MP_WEAK mp_uint_t machine_time_pulse_us(mp_hal_pin_obj_t pin, int pulse_level, mp_uint_t timeout_us) {
     mp_uint_t start = mp_hal_ticks_us();
     while (mp_hal_pin_read(pin) != pulse_level) {
         if ((mp_uint_t)(mp_hal_ticks_us() - start) >= timeout_us) {
diff --git a/ports/esp8266/modmachine.c b/ports/esp8266/modmachine.c
index ccde1e5ed89a34dadd66a0621d222c0a27fe2ada..e20e8cb75710e1f593f9c127bd9738f881762eda 100644
--- a/ports/esp8266/modmachine.c
+++ b/ports/esp8266/modmachine.c
@@ -355,6 +355,35 @@ STATIC mp_obj_t machine_enable_irq(mp_obj_t state_in) {
 }
 MP_DEFINE_CONST_FUN_OBJ_1(machine_enable_irq_obj, machine_enable_irq);
 
+// Custom version of this function that feeds system WDT if necessary
+mp_uint_t machine_time_pulse_us(mp_hal_pin_obj_t pin, int pulse_level, mp_uint_t timeout_us) {
+    int nchanges = 2;
+    uint32_t start = system_get_time(); // in microseconds
+    for (;;) {
+        uint32_t dt = system_get_time() - start;
+
+        // Check if pin changed to wanted value
+        if (mp_hal_pin_read(pin) == pulse_level) {
+            if (--nchanges == 0) {
+                return dt;
+            }
+            pulse_level = 1 - pulse_level;
+            start = system_get_time();
+            continue;
+        }
+
+        // Check for timeout
+        if (dt >= timeout_us) {
+            return (mp_uint_t)-nchanges;
+        }
+
+        // Only feed WDT every now and then, to make sure edge timing is accurate
+        if ((dt & 0xffff) == 0xffff && !ets_loop_dont_feed_sw_wdt) {
+            system_soft_wdt_feed();
+        }
+    }
+}
+
 STATIC const mp_rom_map_elem_t machine_module_globals_table[] = {
     { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_umachine) },
     { MP_ROM_QSTR(MP_QSTR_mem8), MP_ROM_PTR(&machine_mem8_obj) },