Der Code basiert auf dem von MER ( Spirit and Opportunity ), die von ihrem ersten Lander, MPF ( Sojourner ), stammen. Es handelt sich um 3,5 Millionen Zeilen C (ein Großteil davon wird automatisch generiert), die auf einem RA50-Prozessor von BAE und dem Betriebssystem VxWorks ausgeführt werden. Über eine Million Zeilen wurden von Hand codiert.
Der Code ist als 150 separate Module implementiert, die jeweils eine andere Funktion ausführen. Hochgekoppelte Module sind in Komponenten organisiert, die die enthaltenen Module abstrahieren und "entweder eine bestimmte Funktion, Aktivität oder ein bestimmtes Verhalten angeben". Diese Komponenten sind weiter in Ebenen organisiert, und es gibt "nicht mehr als 10 Komponenten der obersten Ebene".
Quelle: Keynote-Vortrag von Benjamin Cichy auf dem Workshop 2010 über Raumfahrzeug-Flugsoftware (FSW-10) , Folien, Audio und Video (beginnt mit der Missionsübersicht, Architekturdiskussion auf Folie 80).
Jemand in Hacker News fragte: "Nicht sicher, was bedeutet, dass der Großteil des C-Codes automatisch generiert wird. Woraus?"
Ich bin nicht 100% sicher, obwohl es wahrscheinlich eine separate Präsentation in diesem oder einem anderen Jahr gibt, die ihren automatischen Generierungsprozess beschreibt. Ich weiß, dass es ein allgemein beliebtes Thema auf der FSW-11-Konferenz war.
Simulink ist eine Möglichkeit. Es ist eine MATLAB-Komponente, die bei Maschinenbauingenieuren und damit bei den meisten Navigations- und Steuerungsingenieuren beliebt ist und die es ihnen ermöglicht, Dinge zu "codieren" und zu simulieren, ohne zu glauben, dass sie codiert sind.
Modellbasiertes Programmieren ist definitiv eine Sache, die der Branche langsam bewusst wird, aber ich weiß nicht, wie gut es bei JPL ankommt oder ob sie sich dafür entschieden hätten, es zu Beginn des Projekts zu verwenden.
Die dritte und wahrscheinlichste Möglichkeit betrifft den Kommunikationscode. Bei allen Raumfahrtsystemen müssen Sie Befehle von der Bodensoftware an die Flugsoftware senden und Telemetrie von der Flugsoftware empfangen und mit der Bodensoftware verarbeiten. Jedes Befehls- / Telemetriepaket ist eine heterogene Datenstruktur und es ist erforderlich, dass beide Seiten von der exakt gleichen Paketdefinition aus arbeiten und das Paket so formatieren, dass es auf der einen Seite korrekt formatiert und auf der anderen Seite analysiert wird. Dies beinhaltet eine ganze Menge Dinge, einschließlich Datentyp, Größe und Endianität (obwohl letztere normalerweise eine globale Sache ist; Sie könnten mehrere Prozessoren mit unterschiedlicher Endianität an Bord haben).
Aber das ist nur die Oberfläche. Sie benötigen auf beiden Seiten viele sich wiederholende Codes, um Dinge wie Protokollierung, Befehls- / Telemetrie-Validierung, Grenzwertprüfung und Fehlerbehandlung zu erledigen. Und dann können Sie anspruchsvollere Dinge tun. Angenommen, Sie haben einen Befehl zum Festlegen eines Hardware-Registerwerts, und dieser Wert wird in einem bestimmten Paket in der Telemetrie zurückgesendet. Sie können eine Bodensoftware generieren, die diesen Telemetriepunkt überwacht, um sicherzustellen, dass sich die Telemetrie nach dem Einstellen dieses Registerwerts ändert, um die Änderung widerzuspiegeln. Natürlich sind einige Telemetriepunkte wichtiger als andere (z. B. der Hauptbusstrom) und werden in mehreren Paketen übertragen, was zusätzliches Kopieren auf der Flugseite und Datendeduplizierung auf der Bodenseite erfordert.
Mit all dem ist es (meiner Meinung nach) viel einfacher, eine Sammlung statischer Textdateien (in XML, CSV oder einem DSL / what-have-you) zu schreiben, sie über ein Perl / Python-Skript auszuführen und presto! Code!
Ich arbeite nicht bei JPL, daher kann ich mit einer Ausnahme keine Details angeben, die nicht im Video enthalten sind. Ich habe gehört, dass der automatisch generierte C-Code von Python-Skripten geschrieben wird und der Umfang der automatischen Codierung in einem Projekt stark davon abhängt, wer der FSW-Lead ist.