Hier sind einige Gedanken und Ideen:
Verwenden Sie ROM kreativer.
Speichern Sie alles, was Sie können, im ROM. Speichern Sie Nachschlagetabellen im ROM, anstatt Dinge zu berechnen. (Stellen Sie sicher, dass Ihr Compiler Ihre Nachschlagetabellen im schreibgeschützten Bereich ausgibt! Drucken Sie zur Laufzeit die Speicheradressen aus, um dies zu überprüfen!) Speichern Sie Ihre Interrupt-Vektortabelle im ROM. Führen Sie natürlich einige Tests durch, um festzustellen, wie zuverlässig Ihr ROM im Vergleich zu Ihrem RAM ist.
Verwenden Sie Ihren besten RAM für den Stapel.
SEUs im Stapel sind wahrscheinlich die wahrscheinlichste Ursache für Abstürze, da hier normalerweise Indexvariablen, Statusvariablen, Rücksprungadressen und Zeiger verschiedener Art leben.
Implementieren Sie Timer-Tick- und Watchdog-Timer-Routinen.
Sie können bei jedem Timer-Tick eine "Sanity Check" -Routine sowie eine Watchdog-Routine ausführen, um das System zu blockieren. Ihr Hauptcode kann auch regelmäßig einen Zähler erhöhen, um den Fortschritt anzuzeigen, und die Routine zur Überprüfung der Integrität kann sicherstellen, dass dies geschehen ist.
Implementieren Sie Fehlerkorrekturcodes in der Software.
Sie können Ihren Daten Redundanz hinzufügen, um Fehler erkennen und / oder korrigieren zu können. Dies verlängert die Verarbeitungszeit und lässt den Prozessor möglicherweise länger Strahlung ausgesetzt sein, wodurch die Wahrscheinlichkeit von Fehlern erhöht wird. Daher müssen Sie den Kompromiss berücksichtigen.
Erinnere dich an die Caches.
Überprüfen Sie die Größe Ihrer CPU-Caches. Daten, auf die Sie kürzlich zugegriffen oder die Sie geändert haben, befinden sich wahrscheinlich in einem Cache. Ich glaube, Sie können zumindest einige der Caches deaktivieren (zu hohen Leistungskosten). Sie sollten dies versuchen, um festzustellen, wie anfällig die Caches für SEUs sind. Wenn die Caches härter als der Arbeitsspeicher sind, können Sie wichtige Daten regelmäßig lesen und neu schreiben, um sicherzustellen, dass sie im Cache bleiben, und den Arbeitsspeicher wieder in Einklang bringen.
Verwenden Sie Seitenfehler-Handler geschickt.
Wenn Sie eine Speicherseite als nicht vorhanden markieren, gibt die CPU einen Seitenfehler aus, wenn Sie versuchen, darauf zuzugreifen. Sie können einen Seitenfehler-Handler erstellen, der einige Überprüfungen durchführt, bevor die Leseanforderung bearbeitet wird. (PC-Betriebssysteme verwenden dies, um Seiten, die auf die Festplatte ausgelagert wurden, transparent zu laden.)
Verwenden Sie die Assemblersprache für kritische Dinge (die alles sein können).
Mit der Assemblersprache wissen Sie , was sich in Registern und was im RAM befindet. Sie wissen, welche speziellen RAM-Tabellen die CPU verwendet, und Sie können die Dinge auf Umwegen entwerfen, um Ihr Risiko gering zu halten.
Verwenden Sie objdump
diese Option, um die generierte Assemblersprache anzuzeigen und herauszufinden, wie viel Code jede Ihrer Routinen belegt.
Wenn Sie ein großes Betriebssystem wie Linux verwenden, fragen Sie nach Problemen. Es gibt einfach so viel Komplexität und so viele Dinge, die schief gehen können.
Denken Sie daran, es ist ein Spiel der Wahrscheinlichkeiten.
Ein Kommentator sagte
Jede Routine, die Sie schreiben, um Fehler abzufangen, kann aus derselben Ursache selbst fehlschlagen.
Während dies zutrifft, ist die Wahrscheinlichkeit von Fehlern in den (sagen wir) 100 Bytes Code und Daten, die erforderlich sind, damit eine Überprüfungsroutine ordnungsgemäß funktioniert, viel geringer als die Wahrscheinlichkeit von Fehlern an anderer Stelle. Wenn Ihr ROM ziemlich zuverlässig ist und fast der gesamte Code / die Daten tatsächlich im ROM sind, sind Ihre Chancen sogar noch besser.
Verwenden Sie redundante Hardware.
Verwenden Sie zwei oder mehr identische Hardware-Setups mit identischem Code. Wenn die Ergebnisse unterschiedlich sind, sollte ein Reset ausgelöst werden. Bei 3 oder mehr Geräten können Sie mithilfe eines "Abstimmungssystems" versuchen, festzustellen, welches kompromittiert wurde.