Harden firmware state and transfer handling
This commit is contained in:
+12
-15
@@ -17,12 +17,10 @@ Dateien:
|
||||
|
||||
Makros und Config sind komplett getrennt.
|
||||
|
||||
Diese Tabelle beschreibt die Adressen, auf die der Laufzeitcode zugreift. Das
|
||||
aktive Linker-Skript reserviert davon aktuell nur `0x1FE00..0x1FFFF`
|
||||
ausdrücklich; Makrobereich und erste Config-Row liegen noch im zulässigen
|
||||
Firmware-ROM. Das aktuelle Binary ist klein genug, aber die Bereiche sind
|
||||
nicht vollständig gegen Firmwarewachstum geschützt. Siehe
|
||||
[09_known_limitations.md](09_known_limitations.md).
|
||||
Das aktive Linker-Skript reserviert `0x1FB00..0x1FFFF` als eigenen
|
||||
NVM-Memory-Bereich. Die Boarddefinition meldet entsprechend höchstens
|
||||
129.792 Byte Firmware-Flash. Damit kann ein erfolgreich gelinktes Image die
|
||||
fünf NVM-Rows nicht überdecken.
|
||||
|
||||
## `SDeviceConfig`
|
||||
|
||||
@@ -101,18 +99,17 @@ Praktisch sichtbares Ergebnis:
|
||||
`nvm_config_load()`:
|
||||
|
||||
1. 740 Byte aus NVM kopieren
|
||||
2. Magic pruefen
|
||||
3. Version pruefen
|
||||
4. CRC pruefen
|
||||
5. bei Fehlern Defaults laden und `false` zurueckgeben
|
||||
2. Magic, Version und CRC prüfen
|
||||
3. Profilindex, Actiontypen/-daten und LED-Enums prüfen
|
||||
4. `PULSE`-Perioden auf mindestens 2 ms prüfen
|
||||
5. bei Fehlern Defaults laden und `false` zurückgeben
|
||||
|
||||
Die Firmware faellt also immer auf einen gueltigen Zustand zurueck.
|
||||
Die Defaults werden bei diesem Fallback nur in das übergebene RAM-Struct
|
||||
geschrieben und nicht automatisch in Flash persistiert.
|
||||
|
||||
Nach erfolgreicher CRC-Prüfung sichert `load()` einen zu großen
|
||||
`active_profile` im RAM auf Profil 0 ab. Andere Felder und Enum-Werte werden
|
||||
nicht auf gültige Bereiche geprüft.
|
||||
Dieselbe Validierung wird vor einem Config-Commit aus dem CDC-Protokoll
|
||||
verwendet.
|
||||
|
||||
## Speichern
|
||||
|
||||
@@ -134,8 +131,8 @@ Wichtig:
|
||||
|
||||
- der Schreibpuffer muss 4-Byte-aligned sein
|
||||
- `packed` allein reicht dafuer nicht
|
||||
- `nvm_config_save()` berechnet die CRC nicht selbst; der Aufrufer muss
|
||||
`cfg.crc = nvm_config_crc(cfg)` vorher setzen
|
||||
- `nvm_config_save()` berechnet die CRC in einer lokalen Kopie immer neu
|
||||
- `static_assert` schützt die erwarteten Größen 3, 236 und 740 Byte beim Build
|
||||
|
||||
## Zusammenhang mit Werksreset
|
||||
|
||||
|
||||
Reference in New Issue
Block a user