The native-UART fixed-baud TinySafeBoot protocol, ported onto libavr as a
crt-free boot-section loader, in three variants that trade clarity for size:
tsb_pure 740 B idiomatic C++: SRAM page buffer, separate flash/EEPROM
leaves, shared framing; the polled `unused` guard posture.
tsb_tricks 658 B unified runtime-flag paths (noinline/noclone), call-saved
global-register page walk — attributes only, no asm.
tsb_asm 508 B streaming store + hand-rolled UART/SPM/EEPROM/erase loops;
fits the 512 B boot section (BOOTSZ=11). Trims the optional
password gate and WDT-reset bail — unreachable in C++ with
both (hand-asm is ~15 % denser). Tiers 1-2 keep them and
live in the 1 KB section they fit.
All three are .text byte-identical across libavr's generated and reflect modes.
The CMake build strips the leaked -O3 (a Release build is silently -O3, not the
-Os this loader is measured against) and gates each variant's size against its
section. A simavr harness (test/device.c + test/tsbtest.py) drives the real wire
protocol over a pty and flashes the device; the size and protocol tests run in
ctest. Verified byte-for-byte against the reference tsbloader_adv (C#/mono):
activate, read info, flash write + verify.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
15 lines
284 B
YAML
15 lines
284 B
YAML
---
|
|
BasedOnStyle: LLVM
|
|
Standard: Latest
|
|
ColumnLimit: 120
|
|
IndentWidth: 4
|
|
TabWidth: 4
|
|
UseTab: ForIndentation
|
|
AlignEscapedNewlines: DontAlign
|
|
AllowShortFunctionsOnASingleLine: Empty
|
|
AlwaysBreakTemplateDeclarations: true
|
|
BreakBeforeBraces: Custom
|
|
BraceWrapping:
|
|
AfterFunction: true
|
|
...
|