esp8266: Provide custom machine_time_pulse_us that feeds soft WDT.
So that the timeout for machine.time_pulse_us() can be large. Fixes issue #2775.
This commit is contained in:
parent
999733b1fb
commit
89a23a05b3
@ -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) {
|
||||
|
@ -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) },
|
||||
|
Loading…
Reference in New Issue
Block a user