Код основан на коде MER ( Spirit and Opportunity ), основанном на их первой платформе MPF ( Sojourner ). Это 3,5 миллиона строк C (большая часть из которых сгенерирована автоматически), работающих на процессоре RA50 производства BAE и операционной системе VxWorks . Более миллиона строк были закодированы вручную.
Код реализован в виде 150 отдельных модулей, каждый из которых выполняет свою функцию. Сильно связанные модули организованы в компоненты, которые абстрагируют содержащиеся в них модули и «задают конкретную функцию, действие или поведение». Эти компоненты далее организованы в слои, и в них «не более 10 компонентов верхнего уровня».
Источник: основной доклад Бенджамина Сичи на семинаре 2010 года по программному обеспечению полетов космических аппаратов (FSW-10) , слайдам, аудио и видео (начинается с обзора миссии, обсуждения архитектуры на слайде 80).
Кто-то из Hacker News спросил: «Не уверен, что означает, что большая часть кода C генерируется автоматически. Из чего?»
Я не уверен на 100%, хотя, вероятно, в этом году или в другом году есть отдельная презентация, описывающая процесс их автоматической генерации. Я знаю, что это была популярная тема в целом на конференции FSW-11.
Simulink это возможность. Это компонент MATLAB, популярный среди инженеров-механиков и, следовательно, большинства инженеров по навигации и управлению, который позволяет им «кодировать» и моделировать объекты, не думая, что они кодируют.
Программирование на основе моделей - это определенно то, о чем индустрия постепенно начинает осознавать, но я не знаю, насколько хорошо он завоевал популярность в JPL или если бы они решили использовать его в начале проекта.
Третья и наиболее вероятная возможность для кода связи. Для всех космических систем вам необходимо отправлять команды программному обеспечению полета из наземного программного обеспечения, получать телеметрию от программного обеспечения полета и обрабатывать ее с помощью наземного программного обеспечения. Каждый пакет команд / телеметрии представляет собой гетерогенную структуру данных, и необходимо, чтобы обе стороны работали с одинаковым определением пакета, и отформатировали пакет так, чтобы он был правильно отформатирован на одной стороне и проанализирован на другой стороне. Это включает в себя правильное получение множества вещей, включая тип данных, размер и порядок байтов (хотя последний, как правило, глобален; у вас может быть несколько процессоров на борту с разными порядками байтов).
Но это только поверхность. Вам нужно много повторяющегося кода с обеих сторон для обработки таких вещей, как ведение журнала, проверка команд / телеметрии, проверка пределов и обработка ошибок. И тогда вы можете делать более сложные вещи. Скажем, у вас есть команда для установки значения аппаратного регистра, и это значение отправляется обратно в телеметрии в конкретном пакете. Вы можете создать наземное программное обеспечение, которое отслеживает эту точку телеметрии, чтобы гарантировать, что при установке этого значения регистра в конечном итоге телеметрия изменится, чтобы отразить изменение. И, конечно, некоторые точки телеметрии более важны, чем другие (например, ток главной шины), и предназначены для обработки в виде нескольких пакетов, что включает дополнительное копирование на стороне полета и дедупликацию данных на земле.
При этом гораздо проще (на мой взгляд) написать одну коллекцию статических текстовых файлов (в XML, CSV или некоторых DSL / что-у-вас-вы), запустить их через скрипт на Perl / Python и сделать это! Код!
Я не работаю в JPL, поэтому не могу предоставить какие-либо подробности, которых нет в видео, за одним исключением. Я слышал, что автоматически сгенерированный код C написан скриптами Python, и объем автокодирования в проекте сильно варьируется в зависимости от того, кто является руководителем FSW.