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: