Уже почти совершив третью в истории человечества посадку на поверхность Луны, миссия Apollo 14 оказалась под угрозой срыва. Бортовой компьютер космического корабля передал в центр управления полетом на Земле, что была нажата кнопка прерывания посадки. Однако экипаж сообщил, что кнопки не касались. Инженерам на Земле удалось спасти миссию Apollo 14, выполнив один из самых гениальных приемов в компьютерной истории.
Начало проблем Apollo 14
По сути миссия Apollo 14 должна выполнить задачи, которые были возложены на Apollo 13. Экипаж – капитан Алан Шепард, пилот лунного модуля Эд Митчел, пилот командного модуля Стю Рооса, – должны были прилуниться на склонах Фра Мауро. Это территория рядом с экватором Луны и немного к югу от гигантского кратера Коперника. Считается, что склоны Фра Мауро является выброшенной породой во время создания Моря дождей. А это значит, что поверхность склонов может содержать породу из глубин Луны и пролить свет на происхождение спутника нашей планеты.
Через восемь месяцев после Apollo 13 инженеры добавили к Apollo 14 больше кислорода и батарей, чтобы люди имели больше шансов вернуться на Землю. Также внесли программные изменения, например, бортовой компьютер научился распознавать изменение высоты поверхности Луны при приближении к зоне посадки.
Підписуйтесь на наш канал в Telegram: https://t.me/techtodayua
Во второй половине дня 31 января 1971 года после 40-минутной задержки Apollo 14 стартовал на ракете-носителе Saturn V. Особенность миссий Apollo – лунный модуль необходимо вывести из защитного отсека ракеты-носителя и пристыковать его к командному модулю. При выполнении этого маневра два космических корабля не смогли состыковаться и затребовали нескольких попыток.
Следующие четыре дня пути прошли без проблем. Через 82 часа Apollo 14 оказался на орбите Луны и еще за несколько часов для экономии горючего лунного модуля опустил свою орбиту до 14,5 км в перигее (нижняя точка орбиты).
За четыре часа до отправки лунного модуля компьютеры сообщили на Землю, что нажата кнопка прерывания миссии. Шепард доложил, что экипаж не трогал клавишу. Это означало одно – глюк в лунном модуле и конец миссии. Нажатие этой кнопки мгновенно запускает двигатели модуля для его старта с Луны.
Гениальное решение для спасения
Бортовой навигационный компьютер Apollo Guidance Computer продвинутый даже по современным меркам. Несмотря на его чрезвычайную медлительность – 80 тысяч инструкций в секунду, – он поддерживал технологии, которые считаются привычными в сегодняшних компьютерах. Среди них – поддержка байт-кода, почти как это реализовано в Java, и обновление программы дистанционно «по воздуху». При этом объем оперативной памяти составлял всего 2000 слов (это как 2000 байтов для современного компьютера).
Apollo Guidance Computer выполнял два типа задач – Jobs и Waitlist Tasks. Первые работали независимо по графику, имели выделенную память и повышенный приоритет. Большинство программ класса Jobs писали так, чтобы они быстро выполнялись и обычно выполняли лишь одну функцию.
Надежная работа Apollo Guidance Computer гарантировалась тем, что он всегда держал свободные ресурсы для выполнения задач. Если их не окажется, он выдает код ошибки 1202, что произошло во время миссии Apollo 11.
Особенность Jobs была в том, что их можно было запускать с той же точки, где они прекратили работать. Данные хранились в памяти. Это спасло Apollo 11, чей компьютер пришлось несколько раз перезагружать.
Программы класса Waitlist Tasks были еще проще и короче, чем Jobs. Благодаря этому они не нуждались в выделенной памяти и управлении процессами. Они выполняли критические задачи, например, считывание данных акселерометра, выключение двигателей, проверка кнопки прерывания миссии и тому подобное. Эти задачи выполнялись через жестко заданные промежутки времени.
Apollo Guidance Computer мог обрабатывать до восьми задач Jobs, пять из которых выполнялись независимо. При этом более критические задачи имели меньший приоритет. Например, программа посадки на поверхность Луны Program 63 имела один из самых низких приоритетов. Это длинная и сложная программа, поэтому ее прерывание более приоритетными программами позволяло выполнять насущные задачи.
Гениальный хак
В NASA порекомендовали экипажа вручную выставить правильное значение ячейки памяти, содержащей флаг прерывания миссии LETABBIT. Для этого можно было в нужный момент перепрограммировать ее. Или можно было тщательно постучать по бортовому компьютеру, что и сделали космонавты. Действие помогло, но после одного оборота вокруг Луны проблема проявилась снова.
Стало понятно, что проблема где-то в кнопке прерывания миссии – кусок олова мог случайно замыкать контакт. Однако разобрать кнопку в космосе оказалось невозможным.
Программист Дон Айлс разработал процедуру для сброса флага LETABBIT. Нужна была модификация Program 63. Она вызвала ряд Jobs и Waitlist Tasks. Одной из Jobs была программа SERVICER, которая считывала положение и ускорение корабля и планировала Routine R11 срабатывать каждые 0,25 секунд. R11, в свою очередь, сначала проверяла флаг LETABBIT – флаг прерывания миссии.
И вот гениальный хак: заставить R11 считать, что прерывание миссии уже в процессе. Тогда программа не реагирует на статус кнопки прерывания миссии.
Проблема была в том, что нормальная работа двигателей Apollo при снижении – на тяге 10% в течение 26 секунд. Это дает время для выравнивания корабля, после чего двигатели запускались на 100%. При прерывании миссии последнее действие необходимо было выполнить вручную.
Было еще несколько сопутствующих проблем от такого хака, однако Айлс разработал способы их смягчения.
Меньше чем через две минуты после начала процедуры посадки, команда смогла снова отдать управление посадкой компьютеру Apollo Guidance Computer.
Как будто было мало проблем
Экипажу оставалось еще восемь минут, чтобы прибыть на Луну. Однако через четыре минуты, находясь на высоте 11 км от поверхности, Шепард и Митчелл заметили, что есть проблемы с радаром. Без него нельзя было определить точную высоту и скорость снижения.
Радар не показывал высоту – по неизвестным причинам радар переключился с дальнего на ближний режим. На высоте 9700 метров Митчел сообщил на Землю о проблеме. В центре управления посоветовали перезагрузить радар.
На высоте около 3700 километров удалось привлечь альтернативную систему, которая позволила совершить посадку.
После миссии
Программисты поняли, что нужна дополнительная защита от случайных сбоев. В код Apollo Guidance Computer добавили еще одну переменную, которая позволяла экипажу обходить кнопки прерывания миссии.
Также починили радар – ему запретили переключаться между режимами, если он не мог корректно спозиционировать себя в текущем режиме.
По материалам: Arstechnica