Der Pathfinder-Fehler

Wo Software geschrieben wird, kann auch etwas schiefgehen. In der Raumfahrt werden zwar extrem hohe Anforderungen an die Softwarequalität gestellt, dennoch kommt es immer wieder zu Vorfällen, die auf Schwächen in der Implementierung zurückzuführen sind. Die Klassiker sind sicherlich das Steuerungssystem einer europäischen Trägerrakete, bei der ein Überlauf einer Ganzzahl die Lageregelung außer Kontrolle geraten ließ sowie eine amerikanische Marssonde, die aufgrund falscher Umrechnung zwischen metrischen und zölligen Maßen havarierte. In beiden Fällen kamen glücklicherweise keine Personen zu Schaden, aber der finanzielle Schaden und der wissenschaftliche Rückschlag sind beachtlich.

Nicht ganz so spektakulär, aber nicht minder subtil ist der Softwarebug der Pathfinder-Marssonde. Man beobachtete, daß das Modul sich in unregelmäßigen Abständen immer wieder zurücksetzte (Reset). Damit gingen alle im Zwischenspeicher enthaltenen Meßdaten verloren. Der Fehler war schon vor dem Start bekannt, aber man beschloß, ihn zu ignorieren.

Das Landemodul wurde mit einem Multitasking-Betriebssystem ausgestattet, um (zumindest scheinbar) gleichzeitig mehrere Prozesse auf einem Prozessorkern ausführen zu können, beispielsweise die Aufnahme von Meßdaten und ihre Übertragung per Funk zur Erde. Verschiedene Prozesse werden auf solchen Systemen unterschiedliche Prioritäten zugewiesen: ein Prozeß niedriger Priorität kann von einem wichtigeren Prozeß mit höherer Priorität unterbrochen werden, aber nicht umgekehrt.

Dies gilt aber nicht uneingeschränkt: schreibt der niedrigpriorisierte Prozeß gerade Daten in einen Speicherbereich, so muß die Unterbrechbarkeit vorübergehend unterbunden werden, da die Konsistenz der Daten ansonsten gefährdet wäre. Mittels einer Semaphore beispielsweise kann ein Speicherbereich blockiert werden. Erst wenn das Schreiben der Daten abgeschlossen ist, darf der höhere Prozeß den niedrigeren unterbrechen.

Soweit, so gut. Sobald drei Prozesse beteiligt werden, können sehr eigenartige Verhaltensweisen auftreten. Wenn der niedrigpriorisierte Prozeß L einen Speicherbereich blockiert und durch einen mittelpriorisierten M unterbrochen wird, muß ein hochpriorisierter Prozeß H, der den gleichen Speicherbereich nutzen will, so lange warten, bis die beiden einfachen Prozesse abgearbeitet sind. Auf diesem Wege kann u.U. der hochpriorisierte Prozeß kaum zur Ausführung kommen. In diesem Falle kehrt sich die Priorität um (Prioritätsinversion). Genau dies passierte bei Pathfinder:

  • Prozeß L (low) sammelte meteorologische Daten,
  • Prozeß M (middle) überwachte die Drohne und
  • Prozeß H (high) hatte mit der Kontrolle des Bussystems die wichtigste Aufgabe.

L reservierte einen Speicherbereich mittels einer Semaphore, wurde aber fortwährend durch den höherpriorisierteren M an der Ausführung gehindert. Der Prozeß H nutzte den gleichen Speicherbereich wie L, mußte aber auf die Freigabe des Speicherbereichs durch L warten, war aber zugleich der einzige Prozeß, der M hätte unterbrechen können. So konnte M über L den viel wichtigeren und höher priorisierten Prozeß H ausbremsen und in aller Ruhe seine Aufgabe verrichten.

Der Watchdog-Timer befand, daß die wichtigsten Komponenten des Systems nicht mehr reagierten und führte eine Reset aus - was bei einem System, das sich aufgehängt hat, auch korrekt ist. Dieses Spiel wiederholte sich, bis das Problem erkannt wurde und mittels Programmierung einer Prioritätenvererbung und anschließendem Fernupdate behoben werden konnte.

Quelle: http://www5.in.tum.de/lehre/seminare/semsoft/unterlagen_02/soj1/website/index.htm