Files
micropython/tests/extmod/machine_timer.py
Chris Webb ccc954256f 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>
2025-09-25 23:59:24 +10:00

49 lines
1.3 KiB
Python

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()