src.nth.io/

summaryrefslogtreecommitdiff
path: root/main
diff options
context:
space:
mode:
authorLuke Hoersten <[email protected]>2026-06-20 21:01:23 -0500
committerLuke Hoersten <[email protected]>2026-06-20 21:01:23 -0500
commita438a6303e94cea99f4f4c51017d958d0b44b0ac (patch)
tree6817ead24ea7199d6e94a1f26cd9f9f7620cfdae /main
parentd1c8d45d5dc8ae09f03e2f0a9c6b3ac1910b8cdc (diff)
README: stream-server task split is the critical change that closed the painted<sent gap
Document the architecture pivot. The per-frame budget table now reflects the long-lived TCP stream socket on port 81 (replaced the HTTP /frame pattern) and the new recv/decode/paint timings: recv 14-18ms on the wire (pure body), dec ~5ms, paint <35us, with decode-task idle ~30ms per frame waiting on recv. The critical change wasn't a TCP tuning knob — it was splitting recv off its own FreeRTOS task with a 3-buffer PSRAM ring and a 1-deep latest-frame slot to the decode/paint task (d1c8d45). The single-task loop blocked the socket for 6ms during decode+paint, which against the IDF-default 5760-byte window forced a stop-go cycle that capped painted at ~17fps. Raising the window to 65535 made it worse (g2g grew to 17s) because lwIP RX couldn't drain the bursts and there's no way to skip-oldest on the kernel queue. The task split eliminated the coupling: recv-task drains continuously regardless of decode timing, the kernel buffer stays near-empty, and painted now matches sent at the source rate. Backlog entries for body shrink and OTA marked done.
Diffstat (limited to 'main')
0 files changed, 0 insertions, 0 deletions