diff --git a/extmod/modmachine.c b/extmod/modmachine.c index e0bef3a73f..311d5dc037 100644 --- a/extmod/modmachine.c +++ b/extmod/modmachine.c @@ -35,6 +35,10 @@ #include "drivers/dht/dht.h" #endif +// The port must provide implementations of these low-level machine functions. + +STATIC void mp_machine_idle(void); + // The port can provide additional machine-module implementation in this file. #ifdef MICROPY_PY_MACHINE_INCLUDEFILE #include MICROPY_PY_MACHINE_INCLUDEFILE @@ -46,6 +50,12 @@ STATIC mp_obj_t machine_soft_reset(void) { } STATIC MP_DEFINE_CONST_FUN_OBJ_0(machine_soft_reset_obj, machine_soft_reset); +STATIC mp_obj_t machine_idle(void) { + mp_machine_idle(); + return mp_const_none; +} +STATIC MP_DEFINE_CONST_FUN_OBJ_0(machine_idle_obj, machine_idle); + STATIC const mp_rom_map_elem_t machine_module_globals_table[] = { { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_machine) }, @@ -57,6 +67,9 @@ STATIC const mp_rom_map_elem_t machine_module_globals_table[] = { // Reset related functions. { MP_ROM_QSTR(MP_QSTR_soft_reset), MP_ROM_PTR(&machine_soft_reset_obj) }, + // Power related functions. + { MP_ROM_QSTR(MP_QSTR_idle), MP_ROM_PTR(&machine_idle_obj) }, + // Functions for bit protocols. #if MICROPY_PY_MACHINE_BITSTREAM { MP_ROM_QSTR(MP_QSTR_bitstream), MP_ROM_PTR(&machine_bitstream_obj) }, diff --git a/ports/cc3200/mods/modmachine.c b/ports/cc3200/mods/modmachine.c index 8673c62865..1df11c9d28 100644 --- a/ports/cc3200/mods/modmachine.c +++ b/ports/cc3200/mods/modmachine.c @@ -62,7 +62,6 @@ { MP_ROM_QSTR(MP_QSTR_unique_id), MP_ROM_PTR(&machine_unique_id_obj) }, \ { MP_ROM_QSTR(MP_QSTR_main), MP_ROM_PTR(&machine_main_obj) }, \ { MP_ROM_QSTR(MP_QSTR_rng), MP_ROM_PTR(&machine_rng_get_obj) }, \ - { MP_ROM_QSTR(MP_QSTR_idle), MP_ROM_PTR(&machine_idle_obj) }, \ { MP_ROM_QSTR(MP_QSTR_sleep), MP_ROM_PTR(&machine_lightsleep_obj) }, \ { MP_ROM_QSTR(MP_QSTR_lightsleep), MP_ROM_PTR(&machine_lightsleep_obj) }, \ { MP_ROM_QSTR(MP_QSTR_deepsleep), MP_ROM_PTR(&machine_deepsleep_obj) }, \ @@ -168,11 +167,9 @@ STATIC mp_obj_t machine_main(mp_obj_t main) { } MP_DEFINE_CONST_FUN_OBJ_1(machine_main_obj, machine_main); -STATIC mp_obj_t machine_idle(void) { +STATIC void mp_machine_idle(void) { __WFI(); - return mp_const_none; } -STATIC MP_DEFINE_CONST_FUN_OBJ_0(machine_idle_obj, machine_idle); STATIC mp_obj_t machine_lightsleep(void) { pyb_sleep_sleep(); diff --git a/ports/esp32/modmachine.c b/ports/esp32/modmachine.c index a1bd9a5cb9..1946d43db6 100644 --- a/ports/esp32/modmachine.c +++ b/ports/esp32/modmachine.c @@ -58,7 +58,6 @@ { MP_ROM_QSTR(MP_QSTR_sleep), MP_ROM_PTR(&machine_lightsleep_obj) }, \ { MP_ROM_QSTR(MP_QSTR_lightsleep), MP_ROM_PTR(&machine_lightsleep_obj) }, \ { MP_ROM_QSTR(MP_QSTR_deepsleep), MP_ROM_PTR(&machine_deepsleep_obj) }, \ - { MP_ROM_QSTR(MP_QSTR_idle), MP_ROM_PTR(&machine_idle_obj) }, \ { MP_ROM_QSTR(MP_QSTR_bootloader), MP_ROM_PTR(&machine_bootloader_obj) }, \ \ { MP_ROM_QSTR(MP_QSTR_disable_irq), MP_ROM_PTR(&machine_disable_irq_obj) }, \ @@ -283,13 +282,11 @@ STATIC mp_obj_t machine_unique_id(void) { } STATIC MP_DEFINE_CONST_FUN_OBJ_0(machine_unique_id_obj, machine_unique_id); -STATIC mp_obj_t machine_idle(void) { +STATIC void mp_machine_idle(void) { MP_THREAD_GIL_EXIT(); taskYIELD(); MP_THREAD_GIL_ENTER(); - return mp_const_none; } -STATIC MP_DEFINE_CONST_FUN_OBJ_0(machine_idle_obj, machine_idle); STATIC mp_obj_t machine_disable_irq(void) { uint32_t state = MICROPY_BEGIN_ATOMIC_SECTION(); diff --git a/ports/esp8266/modmachine.c b/ports/esp8266/modmachine.c index b15515acd7..cce6b01ce7 100644 --- a/ports/esp8266/modmachine.c +++ b/ports/esp8266/modmachine.c @@ -45,7 +45,6 @@ { MP_ROM_QSTR(MP_QSTR_reset), MP_ROM_PTR(&machine_reset_obj) }, \ { MP_ROM_QSTR(MP_QSTR_reset_cause), MP_ROM_PTR(&machine_reset_cause_obj) }, \ { MP_ROM_QSTR(MP_QSTR_unique_id), MP_ROM_PTR(&machine_unique_id_obj) }, \ - { MP_ROM_QSTR(MP_QSTR_idle), MP_ROM_PTR(&machine_idle_obj) }, \ { MP_ROM_QSTR(MP_QSTR_sleep), MP_ROM_PTR(&machine_lightsleep_obj) }, \ { MP_ROM_QSTR(MP_QSTR_lightsleep), MP_ROM_PTR(&machine_lightsleep_obj) }, \ { MP_ROM_QSTR(MP_QSTR_deepsleep), MP_ROM_PTR(&machine_deepsleep_obj) }, \ @@ -102,14 +101,10 @@ STATIC mp_obj_t machine_unique_id(void) { } STATIC MP_DEFINE_CONST_FUN_OBJ_0(machine_unique_id_obj, machine_unique_id); -STATIC mp_obj_t machine_idle(void) { - uint32_t t = mp_hal_ticks_cpu(); +STATIC void mp_machine_idle(void) { asm ("waiti 0"); - t = mp_hal_ticks_cpu() - t; ets_event_poll(); // handle any events after possibly a long wait (eg feed WDT) - return MP_OBJ_NEW_SMALL_INT(t); } -STATIC MP_DEFINE_CONST_FUN_OBJ_0(machine_idle_obj, machine_idle); STATIC mp_obj_t machine_lightsleep(size_t n_args, const mp_obj_t *args) { uint32_t max_us = 0xffffffff; diff --git a/ports/mimxrt/modmachine.c b/ports/mimxrt/modmachine.c index ecd79d2230..b0c41fe1af 100644 --- a/ports/mimxrt/modmachine.c +++ b/ports/mimxrt/modmachine.c @@ -67,7 +67,6 @@ { MP_ROM_QSTR(MP_QSTR_RTC), MP_ROM_PTR(&machine_rtc_type) }, \ MICROPY_PY_MACHINE_SDCARD_ENTRY \ \ - { MP_ROM_QSTR(MP_QSTR_idle), MP_ROM_PTR(&machine_idle_obj) }, \ { MP_ROM_QSTR(MP_QSTR_deepsleep), MP_ROM_PTR(&machine_deepsleep_obj) }, \ \ { MP_ROM_QSTR(MP_QSTR_disable_irq), MP_ROM_PTR(&machine_disable_irq_obj) }, \ @@ -127,11 +126,9 @@ STATIC mp_obj_t machine_freq(void) { } MP_DEFINE_CONST_FUN_OBJ_0(machine_freq_obj, machine_freq); -STATIC mp_obj_t machine_idle(void) { +STATIC void mp_machine_idle(void) { MICROPY_EVENT_POLL_HOOK; - return mp_const_none; } -STATIC MP_DEFINE_CONST_FUN_OBJ_0(machine_idle_obj, machine_idle); STATIC mp_obj_t machine_deepsleep(size_t n_args, const mp_obj_t *args) { if (n_args != 0) { diff --git a/ports/nrf/modules/machine/modmachine.c b/ports/nrf/modules/machine/modmachine.c index b5d078ae51..3e3f185f6c 100644 --- a/ports/nrf/modules/machine/modmachine.c +++ b/ports/nrf/modules/machine/modmachine.c @@ -89,7 +89,6 @@ { MP_ROM_QSTR(MP_QSTR_bootloader), MP_ROM_PTR(&machine_bootloader_obj) }, \ { MP_ROM_QSTR(MP_QSTR_enable_irq), MP_ROM_PTR(&machine_enable_irq_obj) }, \ { MP_ROM_QSTR(MP_QSTR_disable_irq), MP_ROM_PTR(&machine_disable_irq_obj) }, \ - { MP_ROM_QSTR(MP_QSTR_idle), MP_ROM_PTR(&machine_idle_obj) }, \ { MP_ROM_QSTR(MP_QSTR_sleep), MP_ROM_PTR(&machine_lightsleep_obj) }, \ { MP_ROM_QSTR(MP_QSTR_lightsleep), MP_ROM_PTR(&machine_lightsleep_obj) }, \ { MP_ROM_QSTR(MP_QSTR_deepsleep), MP_ROM_PTR(&machine_deepsleep_obj) }, \ @@ -196,11 +195,9 @@ NORETURN mp_obj_t machine_bootloader(size_t n_args, const mp_obj_t *args) { } STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(machine_bootloader_obj, 0, 1, machine_bootloader); -STATIC mp_obj_t machine_idle(void) { +STATIC void mp_machine_idle(void) { MICROPY_EVENT_POLL_HOOK; - return mp_const_none; } -STATIC MP_DEFINE_CONST_FUN_OBJ_0(machine_idle_obj, machine_idle); STATIC mp_obj_t machine_lightsleep(void) { __WFE(); diff --git a/ports/qemu-arm/modmachine.c b/ports/qemu-arm/modmachine.c index 1134ab4103..59694f92fc 100644 --- a/ports/qemu-arm/modmachine.c +++ b/ports/qemu-arm/modmachine.c @@ -32,3 +32,7 @@ // This variable is needed for machine.soft_reset(), but the variable is otherwise unused. int pyexec_system_exit = 0; + +STATIC void mp_machine_idle(void) { + // Do nothing. +} diff --git a/ports/renesas-ra/modmachine.c b/ports/renesas-ra/modmachine.c index 4617f0af0c..e0b34666fe 100644 --- a/ports/renesas-ra/modmachine.c +++ b/ports/renesas-ra/modmachine.c @@ -67,7 +67,6 @@ { MP_ROM_QSTR(MP_QSTR_reset), MP_ROM_PTR(&machine_reset_obj) }, \ { MP_ROM_QSTR(MP_QSTR_bootloader), MP_ROM_PTR(&machine_bootloader_obj) }, \ { MP_ROM_QSTR(MP_QSTR_freq), MP_ROM_PTR(&machine_freq_obj) }, \ - { MP_ROM_QSTR(MP_QSTR_idle), MP_ROM_PTR(&machine_idle_obj) }, \ { MP_ROM_QSTR(MP_QSTR_sleep), MP_ROM_PTR(&machine_lightsleep_obj) }, \ { MP_ROM_QSTR(MP_QSTR_lightsleep), MP_ROM_PTR(&machine_lightsleep_obj) }, \ { MP_ROM_QSTR(MP_QSTR_deepsleep), MP_ROM_PTR(&machine_deepsleep_obj) }, \ @@ -236,11 +235,9 @@ MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(machine_freq_obj, 0, 4, machine_freq); // idle() // This executies a wfi machine instruction which reduces power consumption // of the MCU until an interrupt occurs, at which point execution continues. -STATIC mp_obj_t machine_idle(void) { +STATIC void mp_machine_idle(void) { __WFI(); - return mp_const_none; } -MP_DEFINE_CONST_FUN_OBJ_0(machine_idle_obj, machine_idle); STATIC mp_obj_t machine_lightsleep(size_t n_args, const mp_obj_t *args) { if (n_args != 0) { diff --git a/ports/renesas-ra/modmachine.h b/ports/renesas-ra/modmachine.h index 22d1fc475e..b8f8b631f2 100644 --- a/ports/renesas-ra/modmachine.h +++ b/ports/renesas-ra/modmachine.h @@ -47,7 +47,6 @@ MP_DECLARE_CONST_FUN_OBJ_0(machine_reset_obj); MP_DECLARE_CONST_FUN_OBJ_VAR_BETWEEN(machine_bootloader_obj); MP_DECLARE_CONST_FUN_OBJ_VAR_BETWEEN(machine_freq_obj); -MP_DECLARE_CONST_FUN_OBJ_0(machine_idle_obj); MP_DECLARE_CONST_FUN_OBJ_VAR_BETWEEN(machine_lightsleep_obj); MP_DECLARE_CONST_FUN_OBJ_VAR_BETWEEN(machine_deepsleep_obj); diff --git a/ports/rp2/modmachine.c b/ports/rp2/modmachine.c index 6ec2811f98..65a5f75c58 100644 --- a/ports/rp2/modmachine.c +++ b/ports/rp2/modmachine.c @@ -54,7 +54,6 @@ { MP_ROM_QSTR(MP_QSTR_bootloader), MP_ROM_PTR(&machine_bootloader_obj) }, \ { MP_ROM_QSTR(MP_QSTR_freq), MP_ROM_PTR(&machine_freq_obj) }, \ \ - { MP_ROM_QSTR(MP_QSTR_idle), MP_ROM_PTR(&machine_idle_obj) }, \ { MP_ROM_QSTR(MP_QSTR_lightsleep), MP_ROM_PTR(&machine_lightsleep_obj) }, \ { MP_ROM_QSTR(MP_QSTR_deepsleep), MP_ROM_PTR(&machine_deepsleep_obj) }, \ \ @@ -121,11 +120,9 @@ STATIC mp_obj_t machine_freq(size_t n_args, const mp_obj_t *args) { } STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(machine_freq_obj, 0, 1, machine_freq); -STATIC mp_obj_t machine_idle(void) { +STATIC void mp_machine_idle(void) { __wfe(); - return mp_const_none; } -STATIC MP_DEFINE_CONST_FUN_OBJ_0(machine_idle_obj, machine_idle); STATIC mp_obj_t machine_lightsleep(size_t n_args, const mp_obj_t *args) { mp_int_t delay_ms = 0; diff --git a/ports/samd/modmachine.c b/ports/samd/modmachine.c index 9b2e88ba60..60b09cb0a3 100644 --- a/ports/samd/modmachine.c +++ b/ports/samd/modmachine.c @@ -64,7 +64,6 @@ { MP_ROM_QSTR(MP_QSTR_Timer), MP_ROM_PTR(&machine_timer_type) }, \ MICROPY_PY_MACHINE_RTC_ENTRY \ \ - { MP_ROM_QSTR(MP_QSTR_idle), MP_ROM_PTR(&machine_idle_obj) }, \ { MP_ROM_QSTR(MP_QSTR_disable_irq), MP_ROM_PTR(&machine_disable_irq_obj) }, \ { MP_ROM_QSTR(MP_QSTR_enable_irq), MP_ROM_PTR(&machine_enable_irq_obj) }, \ { MP_ROM_QSTR(MP_QSTR_reset_cause), MP_ROM_PTR(&machine_reset_cause_obj) }, \ @@ -122,11 +121,9 @@ STATIC mp_obj_t machine_unique_id(void) { } STATIC MP_DEFINE_CONST_FUN_OBJ_0(machine_unique_id_obj, machine_unique_id); -STATIC mp_obj_t machine_idle(void) { +STATIC void mp_machine_idle(void) { MICROPY_EVENT_POLL_HOOK; - return mp_const_none; } -STATIC MP_DEFINE_CONST_FUN_OBJ_0(machine_idle_obj, machine_idle); STATIC mp_obj_t machine_disable_irq(void) { uint32_t state = MICROPY_BEGIN_ATOMIC_SECTION(); diff --git a/ports/stm32/modmachine.c b/ports/stm32/modmachine.c index fcdab9dfc1..8378fb3feb 100644 --- a/ports/stm32/modmachine.c +++ b/ports/stm32/modmachine.c @@ -102,7 +102,6 @@ { MP_ROM_QSTR(MP_QSTR_bootloader), MP_ROM_PTR(&machine_bootloader_obj) }, \ { MP_ROM_QSTR(MP_QSTR_freq), MP_ROM_PTR(&machine_freq_obj) }, \ MICROPY_PY_MACHINE_RNG_ENTRY \ - { MP_ROM_QSTR(MP_QSTR_idle), MP_ROM_PTR(&machine_idle_obj) }, \ { MP_ROM_QSTR(MP_QSTR_sleep), MP_ROM_PTR(&machine_lightsleep_obj) }, \ { MP_ROM_QSTR(MP_QSTR_lightsleep), MP_ROM_PTR(&machine_lightsleep_obj) }, \ { MP_ROM_QSTR(MP_QSTR_deepsleep), MP_ROM_PTR(&machine_deepsleep_obj) }, \ @@ -381,11 +380,9 @@ MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(machine_freq_obj, 0, 4, machine_freq); // idle() // This executies a wfi machine instruction which reduces power consumption // of the MCU until an interrupt occurs, at which point execution continues. -STATIC mp_obj_t machine_idle(void) { +STATIC void mp_machine_idle(void) { __WFI(); - return mp_const_none; } -MP_DEFINE_CONST_FUN_OBJ_0(machine_idle_obj, machine_idle); STATIC mp_obj_t machine_lightsleep(size_t n_args, const mp_obj_t *args) { if (n_args != 0) { diff --git a/ports/stm32/modmachine.h b/ports/stm32/modmachine.h index 096666eb5a..a234325fd7 100644 --- a/ports/stm32/modmachine.h +++ b/ports/stm32/modmachine.h @@ -39,7 +39,6 @@ MP_DECLARE_CONST_FUN_OBJ_0(machine_reset_obj); MP_DECLARE_CONST_FUN_OBJ_VAR_BETWEEN(machine_bootloader_obj); MP_DECLARE_CONST_FUN_OBJ_VAR_BETWEEN(machine_freq_obj); -MP_DECLARE_CONST_FUN_OBJ_0(machine_idle_obj); MP_DECLARE_CONST_FUN_OBJ_VAR_BETWEEN(machine_lightsleep_obj); MP_DECLARE_CONST_FUN_OBJ_VAR_BETWEEN(machine_deepsleep_obj); MP_DECLARE_CONST_FUN_OBJ_0(machine_reset_cause_obj); diff --git a/ports/stm32/modpyb.c b/ports/stm32/modpyb.c index 0bf2d6a2c3..165c982f5d 100644 --- a/ports/stm32/modpyb.c +++ b/ports/stm32/modpyb.c @@ -65,6 +65,12 @@ STATIC mp_obj_t pyb_fault_debug(mp_obj_t value) { } STATIC MP_DEFINE_CONST_FUN_OBJ_1(pyb_fault_debug_obj, pyb_fault_debug); +STATIC mp_obj_t pyb_idle(void) { + __WFI(); + return mp_const_none; +} +STATIC MP_DEFINE_CONST_FUN_OBJ_0(pyb_idle_obj, pyb_idle); + #if MICROPY_PY_PYB_LEGACY // Returns the number of milliseconds which have elapsed since `start`. @@ -144,7 +150,7 @@ STATIC const mp_rom_map_elem_t pyb_module_globals_table[] = { { MP_ROM_QSTR(MP_QSTR_repl_info), MP_ROM_PTR(&pyb_set_repl_info_obj) }, #endif - { MP_ROM_QSTR(MP_QSTR_wfi), MP_ROM_PTR(&machine_idle_obj) }, + { MP_ROM_QSTR(MP_QSTR_wfi), MP_ROM_PTR(&pyb_idle_obj) }, { MP_ROM_QSTR(MP_QSTR_disable_irq), MP_ROM_PTR(&machine_disable_irq_obj) }, { MP_ROM_QSTR(MP_QSTR_enable_irq), MP_ROM_PTR(&machine_enable_irq_obj) }, #if IRQ_ENABLE_STATS diff --git a/ports/unix/modmachine.c b/ports/unix/modmachine.c index 91e3e61340..9eacd5539f 100644 --- a/ports/unix/modmachine.c +++ b/ports/unix/modmachine.c @@ -36,14 +36,7 @@ #define MICROPY_PAGE_MASK (MICROPY_PAGE_SIZE - 1) #endif -#ifdef MICROPY_UNIX_MACHINE_IDLE -#define MICROPY_PY_MACHINE_IDLE_ENTRY { MP_ROM_QSTR(MP_QSTR_idle), MP_ROM_PTR(&machine_idle_obj) }, -#else -#define MICROPY_PY_MACHINE_IDLE_ENTRY -#endif - #define MICROPY_PY_MACHINE_EXTRA_GLOBALS \ - MICROPY_PY_MACHINE_IDLE_ENTRY \ { MP_ROM_QSTR(MP_QSTR_PinBase), MP_ROM_PTR(&machine_pinbase_type) }, \ // This variable is needed for machine.soft_reset(), but the variable is otherwise unused. @@ -80,10 +73,10 @@ uintptr_t mod_machine_mem_get_addr(mp_obj_t addr_o, uint align) { return addr; } -#ifdef MICROPY_UNIX_MACHINE_IDLE -STATIC mp_obj_t machine_idle(void) { +STATIC void mp_machine_idle(void) { + #ifdef MICROPY_UNIX_MACHINE_IDLE MICROPY_UNIX_MACHINE_IDLE - return mp_const_none; + #else + // Do nothing. + #endif } -MP_DEFINE_CONST_FUN_OBJ_0(machine_idle_obj, machine_idle); -#endif diff --git a/ports/zephyr/modmachine.c b/ports/zephyr/modmachine.c index 701420fadb..16109a3af8 100644 --- a/ports/zephyr/modmachine.c +++ b/ports/zephyr/modmachine.c @@ -43,7 +43,6 @@ #define MICROPY_PY_MACHINE_EXTRA_GLOBALS \ MICROPY_PY_MACHINE_RESET_ENTRY \ { MP_ROM_QSTR(MP_QSTR_reset_cause), MP_ROM_PTR(&machine_reset_cause_obj) }, \ - { MP_ROM_QSTR(MP_QSTR_idle), MP_ROM_PTR(&machine_idle_obj) }, \ { MP_ROM_QSTR(MP_QSTR_Pin), MP_ROM_PTR(&machine_pin_type) }, \ STATIC mp_obj_t machine_reset(void) { @@ -59,8 +58,6 @@ STATIC mp_obj_t machine_reset_cause(void) { } STATIC MP_DEFINE_CONST_FUN_OBJ_0(machine_reset_cause_obj, machine_reset_cause); -STATIC mp_obj_t machine_idle(void) { +STATIC void mp_machine_idle(void) { k_yield(); - return mp_const_none; } -STATIC MP_DEFINE_CONST_FUN_OBJ_0(machine_idle_obj, machine_idle);