journal 2026-05-05

P71 AtomVM stress - timers, workers, and allocation

p71atomvmerlangtimersschedulerrtl-pass

P70 ended with the right proof: bundled lib.avm, pingpong.beam, io:format/2, 32 message round trips, and Return value: ok.

P71 keeps the same chip/runtime base and makes the AtomVM workload a little less ceremonial. The new default Erlang module is stress.erl. It checks:

Captured UART:

AtomVM on P71 (stdlib scheduler/timer stress)
Starting AtomVM revision 0.8.0-dev+git.81c67c9
Found startup beam: stress.beam
P71 AtomVM stress starting
timer delta ms: 51
receive-after fired
worker 1 count 64 sum 4224
worker 2 count 96 sum 14160
worker 3 count 128 sum 33408
worker 4 count 160 sum 65040
workers total: 116832
P71 AtomVM stress PASS
Return value: ok
AtomVM exited result=0

Harness:

[harness] === run ended after 18862281 post-load cycles ===
[harness] halted=1, halt_code=0x00000001

Honest status

stepstatus
AtomVM stdlib bundlePASS
erlang:send_after/3PASS
receive ... afterPASS
spawned workers and mailbox collectionPASS
allocation/list pressurePASS
Verilator runPASS
F/D architectural complianceNOT RUN
LibreLane hardeningNOT RUN

The timer probe requested 5 ms and observed 51 ms. That is acceptable for this rung because the platform shim still busy-polls mtime in sys_poll_events; the useful result is that timers wake the scheduler and resume Erlang execution at all. Accurate sleep is a future mtimecmp/WFI platform-runtime task.