14.2. Die Anwendung ausliefern#

Ein funktionierendes Skript auf dem Labortisch und ein ausgeliefertes Produkt sind nicht dasselbe. Eine Kamera, die ins Feld geht, muss eigenständig laufen, solange das Produkt installiert ist – Monate, Jahre – ohne Bediener an der Konsole, ohne angeschlossene IDE und ohne einen Python-Experten in der Nähe, wenn etwas nicht mehr funktioniert. Die Seiten in diesem Abschnitt behandeln, was sich an der Anwendung ändert, wenn das Ziel ein ausgeliefertes Produkt statt einer Schreibtisch-Demo ist.

14.2.1. Eine Pre-Flight-Checkliste#

Bevor eine Kamera den Labortisch verlässt, ist dies die kurze Liste der Dinge, die zutreffen sollten:

  • Der Anwendungscode steckt im Build, nicht im Dateisystem. Eingefrorene Module und ein ROMFS-Image decken Code und Assets ab. Flash- und SD-Karten-Speicher sind ausschließlich für Laufzeitzustand und Logdateien. Der Endnutzer kann die Anwendung ohne Neu-Flashen weder bearbeiten, löschen noch ersetzen.

  • Ein Watchdog läuft kontinuierlich. machine.WDT wird am Anfang von main.py gestartet und einmal pro Iteration der Hauptschleife gefüttert. Jeder Hänger, der länger als das konfigurierte Timeout dauert, löst einen Hardware-Reset aus, und die Kamera fährt wieder hoch.

  • Die Anwendung protokolliert in ein wiederherstellbares Ziel. Die logging-Bibliothek schreibt Einträge mit einem Level, einem Zeitstempel und einem Ziel, das das Feld von der SD-Karte wiederherstellen kann. print() ist nur für die Entwicklungszeit – sein Standardziel ist USB-stdout, das kein ausgeliefertes Produkt liest.

  • Flash und SD werden als ausfallfähig behandelt. Der interne Flash hält kleine Datensätze fester Größe (Konfiguration, zuletzt bekannte Kalibrierung); die SD-Karte hält voluminöse, variable Dateien (Bildaufnahmen, Logdateien); Operationen auf beiden sind in Fehlerbehandlung eingebettet, und die Anwendung hat einen definierten Rückfall, wenn eines von beiden nicht verfügbar ist.

14.2.2. Die Anwendung in den Build einbacken#

Zwei sich ergänzende Mechanismen bringen Dateien in das Firmware-Image: