Skip to content

Commit 30a63a2

Browse files
committed
extmod/modmachine: Provide common Python bindings for machine.idle().
And use it in all ports. The ports are unchanged, except esp8266 which now just returns None from this function instead of the time elapsed (to match other ports), and qemu-arm which gains this function. Signed-off-by: Damien George <[email protected]>
1 parent 7d39db2 commit 30a63a2

File tree

16 files changed

+39
-57
lines changed

16 files changed

+39
-57
lines changed

extmod/modmachine.c

+13
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,10 @@
3535
#include "drivers/dht/dht.h"
3636
#endif
3737

38+
// The port must provide implementations of these low-level machine functions.
39+
40+
STATIC void mp_machine_idle(void);
41+
3842
// The port can provide additional machine-module implementation in this file.
3943
#ifdef MICROPY_PY_MACHINE_INCLUDEFILE
4044
#include MICROPY_PY_MACHINE_INCLUDEFILE
@@ -46,6 +50,12 @@ STATIC mp_obj_t machine_soft_reset(void) {
4650
}
4751
STATIC MP_DEFINE_CONST_FUN_OBJ_0(machine_soft_reset_obj, machine_soft_reset);
4852

53+
STATIC mp_obj_t machine_idle(void) {
54+
mp_machine_idle();
55+
return mp_const_none;
56+
}
57+
STATIC MP_DEFINE_CONST_FUN_OBJ_0(machine_idle_obj, machine_idle);
58+
4959
STATIC const mp_rom_map_elem_t machine_module_globals_table[] = {
5060
{ MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_machine) },
5161

@@ -57,6 +67,9 @@ STATIC const mp_rom_map_elem_t machine_module_globals_table[] = {
5767
// Reset related functions.
5868
{ MP_ROM_QSTR(MP_QSTR_soft_reset), MP_ROM_PTR(&machine_soft_reset_obj) },
5969

70+
// Power related functions.
71+
{ MP_ROM_QSTR(MP_QSTR_idle), MP_ROM_PTR(&machine_idle_obj) },
72+
6073
// Functions for bit protocols.
6174
#if MICROPY_PY_MACHINE_BITSTREAM
6275
{ MP_ROM_QSTR(MP_QSTR_bitstream), MP_ROM_PTR(&machine_bitstream_obj) },

ports/cc3200/mods/modmachine.c

+1-4
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,6 @@
6262
{ MP_ROM_QSTR(MP_QSTR_unique_id), MP_ROM_PTR(&machine_unique_id_obj) }, \
6363
{ MP_ROM_QSTR(MP_QSTR_main), MP_ROM_PTR(&machine_main_obj) }, \
6464
{ MP_ROM_QSTR(MP_QSTR_rng), MP_ROM_PTR(&machine_rng_get_obj) }, \
65-
{ MP_ROM_QSTR(MP_QSTR_idle), MP_ROM_PTR(&machine_idle_obj) }, \
6665
{ MP_ROM_QSTR(MP_QSTR_sleep), MP_ROM_PTR(&machine_lightsleep_obj) }, \
6766
{ MP_ROM_QSTR(MP_QSTR_lightsleep), MP_ROM_PTR(&machine_lightsleep_obj) }, \
6867
{ 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) {
168167
}
169168
MP_DEFINE_CONST_FUN_OBJ_1(machine_main_obj, machine_main);
170169

171-
STATIC mp_obj_t machine_idle(void) {
170+
STATIC void mp_machine_idle(void) {
172171
__WFI();
173-
return mp_const_none;
174172
}
175-
STATIC MP_DEFINE_CONST_FUN_OBJ_0(machine_idle_obj, machine_idle);
176173

177174
STATIC mp_obj_t machine_lightsleep(void) {
178175
pyb_sleep_sleep();

ports/esp32/modmachine.c

+1-4
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,6 @@
5858
{ MP_ROM_QSTR(MP_QSTR_sleep), MP_ROM_PTR(&machine_lightsleep_obj) }, \
5959
{ MP_ROM_QSTR(MP_QSTR_lightsleep), MP_ROM_PTR(&machine_lightsleep_obj) }, \
6060
{ MP_ROM_QSTR(MP_QSTR_deepsleep), MP_ROM_PTR(&machine_deepsleep_obj) }, \
61-
{ MP_ROM_QSTR(MP_QSTR_idle), MP_ROM_PTR(&machine_idle_obj) }, \
6261
{ MP_ROM_QSTR(MP_QSTR_bootloader), MP_ROM_PTR(&machine_bootloader_obj) }, \
6362
\
6463
{ 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) {
283282
}
284283
STATIC MP_DEFINE_CONST_FUN_OBJ_0(machine_unique_id_obj, machine_unique_id);
285284

286-
STATIC mp_obj_t machine_idle(void) {
285+
STATIC void mp_machine_idle(void) {
287286
MP_THREAD_GIL_EXIT();
288287
taskYIELD();
289288
MP_THREAD_GIL_ENTER();
290-
return mp_const_none;
291289
}
292-
STATIC MP_DEFINE_CONST_FUN_OBJ_0(machine_idle_obj, machine_idle);
293290

294291
STATIC mp_obj_t machine_disable_irq(void) {
295292
uint32_t state = MICROPY_BEGIN_ATOMIC_SECTION();

ports/esp8266/modmachine.c

+1-6
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,6 @@
4545
{ MP_ROM_QSTR(MP_QSTR_reset), MP_ROM_PTR(&machine_reset_obj) }, \
4646
{ MP_ROM_QSTR(MP_QSTR_reset_cause), MP_ROM_PTR(&machine_reset_cause_obj) }, \
4747
{ MP_ROM_QSTR(MP_QSTR_unique_id), MP_ROM_PTR(&machine_unique_id_obj) }, \
48-
{ MP_ROM_QSTR(MP_QSTR_idle), MP_ROM_PTR(&machine_idle_obj) }, \
4948
{ MP_ROM_QSTR(MP_QSTR_sleep), MP_ROM_PTR(&machine_lightsleep_obj) }, \
5049
{ MP_ROM_QSTR(MP_QSTR_lightsleep), MP_ROM_PTR(&machine_lightsleep_obj) }, \
5150
{ MP_ROM_QSTR(MP_QSTR_deepsleep), MP_ROM_PTR(&machine_deepsleep_obj) }, \
@@ -102,14 +101,10 @@ STATIC mp_obj_t machine_unique_id(void) {
102101
}
103102
STATIC MP_DEFINE_CONST_FUN_OBJ_0(machine_unique_id_obj, machine_unique_id);
104103

105-
STATIC mp_obj_t machine_idle(void) {
106-
uint32_t t = mp_hal_ticks_cpu();
104+
STATIC void mp_machine_idle(void) {
107105
asm ("waiti 0");
108-
t = mp_hal_ticks_cpu() - t;
109106
ets_event_poll(); // handle any events after possibly a long wait (eg feed WDT)
110-
return MP_OBJ_NEW_SMALL_INT(t);
111107
}
112-
STATIC MP_DEFINE_CONST_FUN_OBJ_0(machine_idle_obj, machine_idle);
113108

114109
STATIC mp_obj_t machine_lightsleep(size_t n_args, const mp_obj_t *args) {
115110
uint32_t max_us = 0xffffffff;

ports/mimxrt/modmachine.c

+1-4
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,6 @@
6767
{ MP_ROM_QSTR(MP_QSTR_RTC), MP_ROM_PTR(&machine_rtc_type) }, \
6868
MICROPY_PY_MACHINE_SDCARD_ENTRY \
6969
\
70-
{ MP_ROM_QSTR(MP_QSTR_idle), MP_ROM_PTR(&machine_idle_obj) }, \
7170
{ MP_ROM_QSTR(MP_QSTR_deepsleep), MP_ROM_PTR(&machine_deepsleep_obj) }, \
7271
\
7372
{ 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) {
127126
}
128127
MP_DEFINE_CONST_FUN_OBJ_0(machine_freq_obj, machine_freq);
129128

130-
STATIC mp_obj_t machine_idle(void) {
129+
STATIC void mp_machine_idle(void) {
131130
MICROPY_EVENT_POLL_HOOK;
132-
return mp_const_none;
133131
}
134-
STATIC MP_DEFINE_CONST_FUN_OBJ_0(machine_idle_obj, machine_idle);
135132

136133
STATIC mp_obj_t machine_deepsleep(size_t n_args, const mp_obj_t *args) {
137134
if (n_args != 0) {

ports/nrf/modules/machine/modmachine.c

+1-4
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,6 @@
8989
{ MP_ROM_QSTR(MP_QSTR_bootloader), MP_ROM_PTR(&machine_bootloader_obj) }, \
9090
{ MP_ROM_QSTR(MP_QSTR_enable_irq), MP_ROM_PTR(&machine_enable_irq_obj) }, \
9191
{ MP_ROM_QSTR(MP_QSTR_disable_irq), MP_ROM_PTR(&machine_disable_irq_obj) }, \
92-
{ MP_ROM_QSTR(MP_QSTR_idle), MP_ROM_PTR(&machine_idle_obj) }, \
9392
{ MP_ROM_QSTR(MP_QSTR_sleep), MP_ROM_PTR(&machine_lightsleep_obj) }, \
9493
{ MP_ROM_QSTR(MP_QSTR_lightsleep), MP_ROM_PTR(&machine_lightsleep_obj) }, \
9594
{ 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) {
196195
}
197196
STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(machine_bootloader_obj, 0, 1, machine_bootloader);
198197

199-
STATIC mp_obj_t machine_idle(void) {
198+
STATIC void mp_machine_idle(void) {
200199
MICROPY_EVENT_POLL_HOOK;
201-
return mp_const_none;
202200
}
203-
STATIC MP_DEFINE_CONST_FUN_OBJ_0(machine_idle_obj, machine_idle);
204201

205202
STATIC mp_obj_t machine_lightsleep(void) {
206203
__WFE();

ports/qemu-arm/modmachine.c

+4
Original file line numberDiff line numberDiff line change
@@ -32,3 +32,7 @@
3232

3333
// This variable is needed for machine.soft_reset(), but the variable is otherwise unused.
3434
int pyexec_system_exit = 0;
35+
36+
STATIC void mp_machine_idle(void) {
37+
// Do nothing.
38+
}

ports/renesas-ra/modmachine.c

+1-4
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,6 @@
6767
{ MP_ROM_QSTR(MP_QSTR_reset), MP_ROM_PTR(&machine_reset_obj) }, \
6868
{ MP_ROM_QSTR(MP_QSTR_bootloader), MP_ROM_PTR(&machine_bootloader_obj) }, \
6969
{ MP_ROM_QSTR(MP_QSTR_freq), MP_ROM_PTR(&machine_freq_obj) }, \
70-
{ MP_ROM_QSTR(MP_QSTR_idle), MP_ROM_PTR(&machine_idle_obj) }, \
7170
{ MP_ROM_QSTR(MP_QSTR_sleep), MP_ROM_PTR(&machine_lightsleep_obj) }, \
7271
{ MP_ROM_QSTR(MP_QSTR_lightsleep), MP_ROM_PTR(&machine_lightsleep_obj) }, \
7372
{ 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);
236235
// idle()
237236
// This executies a wfi machine instruction which reduces power consumption
238237
// of the MCU until an interrupt occurs, at which point execution continues.
239-
STATIC mp_obj_t machine_idle(void) {
238+
STATIC void mp_machine_idle(void) {
240239
__WFI();
241-
return mp_const_none;
242240
}
243-
MP_DEFINE_CONST_FUN_OBJ_0(machine_idle_obj, machine_idle);
244241

245242
STATIC mp_obj_t machine_lightsleep(size_t n_args, const mp_obj_t *args) {
246243
if (n_args != 0) {

ports/renesas-ra/modmachine.h

-1
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,6 @@ MP_DECLARE_CONST_FUN_OBJ_0(machine_reset_obj);
4747
MP_DECLARE_CONST_FUN_OBJ_VAR_BETWEEN(machine_bootloader_obj);
4848
MP_DECLARE_CONST_FUN_OBJ_VAR_BETWEEN(machine_freq_obj);
4949

50-
MP_DECLARE_CONST_FUN_OBJ_0(machine_idle_obj);
5150
MP_DECLARE_CONST_FUN_OBJ_VAR_BETWEEN(machine_lightsleep_obj);
5251
MP_DECLARE_CONST_FUN_OBJ_VAR_BETWEEN(machine_deepsleep_obj);
5352

ports/rp2/modmachine.c

+1-4
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,6 @@
5454
{ MP_ROM_QSTR(MP_QSTR_bootloader), MP_ROM_PTR(&machine_bootloader_obj) }, \
5555
{ MP_ROM_QSTR(MP_QSTR_freq), MP_ROM_PTR(&machine_freq_obj) }, \
5656
\
57-
{ MP_ROM_QSTR(MP_QSTR_idle), MP_ROM_PTR(&machine_idle_obj) }, \
5857
{ MP_ROM_QSTR(MP_QSTR_lightsleep), MP_ROM_PTR(&machine_lightsleep_obj) }, \
5958
{ MP_ROM_QSTR(MP_QSTR_deepsleep), MP_ROM_PTR(&machine_deepsleep_obj) }, \
6059
\
@@ -121,11 +120,9 @@ STATIC mp_obj_t machine_freq(size_t n_args, const mp_obj_t *args) {
121120
}
122121
STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(machine_freq_obj, 0, 1, machine_freq);
123122

124-
STATIC mp_obj_t machine_idle(void) {
123+
STATIC void mp_machine_idle(void) {
125124
__wfe();
126-
return mp_const_none;
127125
}
128-
STATIC MP_DEFINE_CONST_FUN_OBJ_0(machine_idle_obj, machine_idle);
129126

130127
STATIC mp_obj_t machine_lightsleep(size_t n_args, const mp_obj_t *args) {
131128
mp_int_t delay_ms = 0;

ports/samd/modmachine.c

+1-4
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,6 @@
6464
{ MP_ROM_QSTR(MP_QSTR_Timer), MP_ROM_PTR(&machine_timer_type) }, \
6565
MICROPY_PY_MACHINE_RTC_ENTRY \
6666
\
67-
{ MP_ROM_QSTR(MP_QSTR_idle), MP_ROM_PTR(&machine_idle_obj) }, \
6867
{ MP_ROM_QSTR(MP_QSTR_disable_irq), MP_ROM_PTR(&machine_disable_irq_obj) }, \
6968
{ MP_ROM_QSTR(MP_QSTR_enable_irq), MP_ROM_PTR(&machine_enable_irq_obj) }, \
7069
{ 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) {
122121
}
123122
STATIC MP_DEFINE_CONST_FUN_OBJ_0(machine_unique_id_obj, machine_unique_id);
124123

125-
STATIC mp_obj_t machine_idle(void) {
124+
STATIC void mp_machine_idle(void) {
126125
MICROPY_EVENT_POLL_HOOK;
127-
return mp_const_none;
128126
}
129-
STATIC MP_DEFINE_CONST_FUN_OBJ_0(machine_idle_obj, machine_idle);
130127

131128
STATIC mp_obj_t machine_disable_irq(void) {
132129
uint32_t state = MICROPY_BEGIN_ATOMIC_SECTION();

ports/stm32/modmachine.c

+1-4
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,6 @@
102102
{ MP_ROM_QSTR(MP_QSTR_bootloader), MP_ROM_PTR(&machine_bootloader_obj) }, \
103103
{ MP_ROM_QSTR(MP_QSTR_freq), MP_ROM_PTR(&machine_freq_obj) }, \
104104
MICROPY_PY_MACHINE_RNG_ENTRY \
105-
{ MP_ROM_QSTR(MP_QSTR_idle), MP_ROM_PTR(&machine_idle_obj) }, \
106105
{ MP_ROM_QSTR(MP_QSTR_sleep), MP_ROM_PTR(&machine_lightsleep_obj) }, \
107106
{ MP_ROM_QSTR(MP_QSTR_lightsleep), MP_ROM_PTR(&machine_lightsleep_obj) }, \
108107
{ 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);
381380
// idle()
382381
// This executies a wfi machine instruction which reduces power consumption
383382
// of the MCU until an interrupt occurs, at which point execution continues.
384-
STATIC mp_obj_t machine_idle(void) {
383+
STATIC void mp_machine_idle(void) {
385384
__WFI();
386-
return mp_const_none;
387385
}
388-
MP_DEFINE_CONST_FUN_OBJ_0(machine_idle_obj, machine_idle);
389386

390387
STATIC mp_obj_t machine_lightsleep(size_t n_args, const mp_obj_t *args) {
391388
if (n_args != 0) {

ports/stm32/modmachine.h

-1
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@ MP_DECLARE_CONST_FUN_OBJ_0(machine_reset_obj);
3939
MP_DECLARE_CONST_FUN_OBJ_VAR_BETWEEN(machine_bootloader_obj);
4040
MP_DECLARE_CONST_FUN_OBJ_VAR_BETWEEN(machine_freq_obj);
4141

42-
MP_DECLARE_CONST_FUN_OBJ_0(machine_idle_obj);
4342
MP_DECLARE_CONST_FUN_OBJ_VAR_BETWEEN(machine_lightsleep_obj);
4443
MP_DECLARE_CONST_FUN_OBJ_VAR_BETWEEN(machine_deepsleep_obj);
4544
MP_DECLARE_CONST_FUN_OBJ_0(machine_reset_cause_obj);

ports/stm32/modpyb.c

+7-1
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,12 @@ STATIC mp_obj_t pyb_fault_debug(mp_obj_t value) {
6565
}
6666
STATIC MP_DEFINE_CONST_FUN_OBJ_1(pyb_fault_debug_obj, pyb_fault_debug);
6767

68+
STATIC mp_obj_t pyb_idle(void) {
69+
__WFI();
70+
return mp_const_none;
71+
}
72+
STATIC MP_DEFINE_CONST_FUN_OBJ_0(pyb_idle_obj, pyb_idle);
73+
6874
#if MICROPY_PY_PYB_LEGACY
6975

7076
// 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[] = {
144150
{ MP_ROM_QSTR(MP_QSTR_repl_info), MP_ROM_PTR(&pyb_set_repl_info_obj) },
145151
#endif
146152

147-
{ MP_ROM_QSTR(MP_QSTR_wfi), MP_ROM_PTR(&machine_idle_obj) },
153+
{ MP_ROM_QSTR(MP_QSTR_wfi), MP_ROM_PTR(&pyb_idle_obj) },
148154
{ MP_ROM_QSTR(MP_QSTR_disable_irq), MP_ROM_PTR(&machine_disable_irq_obj) },
149155
{ MP_ROM_QSTR(MP_QSTR_enable_irq), MP_ROM_PTR(&machine_enable_irq_obj) },
150156
#if IRQ_ENABLE_STATS

ports/unix/modmachine.c

+5-12
Original file line numberDiff line numberDiff line change
@@ -36,14 +36,7 @@
3636
#define MICROPY_PAGE_MASK (MICROPY_PAGE_SIZE - 1)
3737
#endif
3838

39-
#ifdef MICROPY_UNIX_MACHINE_IDLE
40-
#define MICROPY_PY_MACHINE_IDLE_ENTRY { MP_ROM_QSTR(MP_QSTR_idle), MP_ROM_PTR(&machine_idle_obj) },
41-
#else
42-
#define MICROPY_PY_MACHINE_IDLE_ENTRY
43-
#endif
44-
4539
#define MICROPY_PY_MACHINE_EXTRA_GLOBALS \
46-
MICROPY_PY_MACHINE_IDLE_ENTRY \
4740
{ MP_ROM_QSTR(MP_QSTR_PinBase), MP_ROM_PTR(&machine_pinbase_type) }, \
4841

4942
// 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) {
8073
return addr;
8174
}
8275

83-
#ifdef MICROPY_UNIX_MACHINE_IDLE
84-
STATIC mp_obj_t machine_idle(void) {
76+
STATIC void mp_machine_idle(void) {
77+
#ifdef MICROPY_UNIX_MACHINE_IDLE
8578
MICROPY_UNIX_MACHINE_IDLE
86-
return mp_const_none;
79+
#else
80+
// Do nothing.
81+
#endif
8782
}
88-
MP_DEFINE_CONST_FUN_OBJ_0(machine_idle_obj, machine_idle);
89-
#endif

ports/zephyr/modmachine.c

+1-4
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,6 @@
4343
#define MICROPY_PY_MACHINE_EXTRA_GLOBALS \
4444
MICROPY_PY_MACHINE_RESET_ENTRY \
4545
{ MP_ROM_QSTR(MP_QSTR_reset_cause), MP_ROM_PTR(&machine_reset_cause_obj) }, \
46-
{ MP_ROM_QSTR(MP_QSTR_idle), MP_ROM_PTR(&machine_idle_obj) }, \
4746
{ MP_ROM_QSTR(MP_QSTR_Pin), MP_ROM_PTR(&machine_pin_type) }, \
4847

4948
STATIC mp_obj_t machine_reset(void) {
@@ -59,8 +58,6 @@ STATIC mp_obj_t machine_reset_cause(void) {
5958
}
6059
STATIC MP_DEFINE_CONST_FUN_OBJ_0(machine_reset_cause_obj, machine_reset_cause);
6160

62-
STATIC mp_obj_t machine_idle(void) {
61+
STATIC void mp_machine_idle(void) {
6362
k_yield();
64-
return mp_const_none;
6563
}
66-
STATIC MP_DEFINE_CONST_FUN_OBJ_0(machine_idle_obj, machine_idle);

0 commit comments

Comments
 (0)