summaryrefslogtreecommitdiff
path: root/tests/extmod/machine_timer.py
diff options
context:
space:
mode:
authorChris Webb <chris@arachsys.com>2025-08-25 14:49:17 +0100
committerDamien George <damien.p.george@gmail.com>2025-09-25 23:59:24 +1000
commitccc954256f890b6626558349b513a6d840da24d9 (patch)
tree75ef48dae254430968f3e86e4c912be5d4bb9ba0 /tests/extmod/machine_timer.py
parent64fd2f5f360bfae4a231fc3db053139a4621e878 (diff)
tests: Generalise rp2 timer test into a cross-port test.
Now all ports with machine.Timer except nrf support both hard and soft callbacks, generalise tests/ports/rp2_machine_timer.py into tests/extmod/machine_timer.py. There is an existing machine_soft_timer.py which varies period= and covers the nrf port but skips esp32/esp8266 because they don't support software timers. In our new test, we try varying freq= instead of period=, and cover esp32/esp8266 (with a fixed choice of hardware timer) but skip nrf because it doesn't support hard= or freq=. Add a check that the heap is locked (so allocation fails) in hard callbacks and it is unlocked (so allocation succeeds) in soft callbacks, to ensure we're getting the right kind of callback, not falling back to the default. Signed-off-by: Chris Webb <chris@arachsys.com>
Diffstat (limited to 'tests/extmod/machine_timer.py')
-rw-r--r--tests/extmod/machine_timer.py48
1 files changed, 48 insertions, 0 deletions
diff --git a/tests/extmod/machine_timer.py b/tests/extmod/machine_timer.py
new file mode 100644
index 000000000..ef97ea4e9
--- /dev/null
+++ b/tests/extmod/machine_timer.py
@@ -0,0 +1,48 @@
+import sys
+
+try:
+ from machine import Timer
+ from time import sleep_ms
+except:
+ print("SKIP")
+ raise SystemExit
+
+if sys.platform in ("esp32", "esp8266", "nrf"):
+ # Software timers aren't implemented on the esp32 and esp8266 ports.
+ # The nrf port doesn't support selection of hard and soft callbacks,
+ # and only allows Timer(period=N), not Timer(freq=N).
+ print("SKIP")
+ raise SystemExit
+else:
+ timer_id = -1
+
+# Test both hard and soft IRQ handlers and both one-shot and periodic
+# timers. We adjust period in tests/extmod/machine_soft_timer.py, so try
+# adjusting freq here instead. The heap should be locked in hard callbacks
+# and unlocked in soft callbacks.
+
+
+def callback(t):
+ print("callback", mode[1], kind[1], freq, end=" ")
+ try:
+ allocate = bytearray(1)
+ print("unlocked")
+ except MemoryError:
+ print("locked")
+
+
+modes = [(Timer.ONE_SHOT, "one-shot"), (Timer.PERIODIC, "periodic")]
+kinds = [(False, "soft"), (True, "hard")]
+
+for mode in modes:
+ for kind in kinds:
+ for freq in 50, 25:
+ timer = Timer(
+ timer_id,
+ mode=mode[0],
+ freq=freq,
+ hard=kind[0],
+ callback=callback,
+ )
+ sleep_ms(90)
+ timer.deinit()