# Tasks This file is current work. The repo is the sole task tracker (libavr guidance rule 20). ## Open - [ ] decide whether the millisecond clock stays 64 bits. **Measured: 608 B of flash, 7.6 % of the image**, plus 16 B of RAM - `uptime::millis()` and the three timestamps that hold its value narrowed from `uint64_t` to `uint32_t`, 8004 B down to 7396. It is not free, and the price is not only the display. A 32-bit millisecond counter wraps every **49.7 days**, and this board runs continuously, so two things follow. The `uptime` command would restart from zero at each wrap. And the interval tests would have to be rewritten as subtractions - `now - last >= interval` is correct across a wrap where `now >= last + interval` is not, and `terminal.hpp`'s monitor tick is written the second way today. That shape is *why* the counter is 64 bits: it puts the wrap out of reach so a naive comparison cannot be wrong. So the question is whether a wrapping uptime display is acceptable, and the answer decides 608 B. If it is, the three call sites in `statistics.hpp` and `terminal.hpp` move to subtraction in the same change, and that is the whole of the work. - [ ] the 1 kHz tick's own cost, which is separate and smaller. The compare handler increments a 64-bit counter, so it calls libgcc's `__adddi3_s8`, and a call inside a signal handler decides the prologue - twelve push/pop pairs to cover what the helper might clobber. Splitting the counter into two 32-bit halves removes the call and halves the prologue: the handler goes from ~47 instructions to ~26 and keeps the full 64-bit range, the carry running once every 49.7 days. **Measured and not taken, because it costs 66 B of flash to save about 0.4 % of the CPU** - `millis()` then reassembles the halves, and the readers pay for it. It is the right change only if the tick's cycles ever matter; today nothing here is timing-critical. Falls away entirely if the counter narrows above, which is the reason to decide that one first.