Какой язык программирования использовался в миссии apollo для бортового управляющего компьютера
20 июля 2009 года в честь 40-летия высадки на Луну распечатки с исходным кодом программы для бортового управляющего компьютера КА «Аполлон» (Apollo Guidance Computer, AGC) были оцифрованы и выложены в интернете. Прошло семь лет — и сейчас этот уникальный образец компьютерной истории получил вторую жизнь. Сегодня исходный код для AGC на ассемблере опубликован на Github в полном виде, открыт для поиска, комментариев, форков и т.д.
В коде можно найти вызовы ставших знаменитыми ошибок с кодами 1201 и 1202, которые так беспокоили Нила Армстронга, и многое другое.
На Github репозиторий Apollo-11 быстро взлетел на 1-е место в списке самых популярных репозиториев за сутки (можно не сомневаться, что в рейтинге за неделю у него будет 1-е место уже завтра). Там действительно есть на что посмотреть. Особенно интересно почитать некоторые названия процедур (BURN_BABY_BURN--MASTER_IGNITION_ROUTINE.s) и комментарии в оригинальном коде.
В программе есть «временный» код, как и во многих современных программах.
А вот версия 1969 года популярного комментария «Это никогда не должно произойти».
- Построить сервисный модуль.
- Пролететь до окололунной орбиты.
- На окололунной орбите запустить перемешивание в кислородных баках.
Конечно, он имеет в виду знаменитую аварию с оборудованием служебного модуля «Аполлон-13», после которой модуль пришлось экстренно возвращать на Землю с помощью неординарных манёвров.
Вообще, к настоящему времени сохранилась всего одна физическая копия распечаток программы лунного модуля. Книга с распечаткой хранится в музее Массачусетского технологического института.
Код программы написал Дон Айлс с коллегами. Лично Айлс является автором около 2000 строк кода, которые отвечали за посадку лунного модуля.
Управляющие команды «Аполлона» можете попробовать запустить в эмуляторе (это лишь симулятор компьютера, без самого космического аппарата).
Эмулятор компьютера космического аппарата Apollo
Инструкция к эмулятору Apollo
Компьютеры Apollo Command Module (CM) и Lunar Module (LM) осуществляли посадку на лунную поверхность в автоматическом режиме. Компьютер управлял двигателями и сервомоторами в реальном времени.
Бортовой управляющий компьютер КА «Аполлон»
Дисплей бортового управляющего компьютера
Управление осуществлял Apollo Guidance Computer (AGC). Бортовой компьютер оснащался ОС реального времени с поддержкой многопоточности, он управлял всеми системами, получая сигналы с радаров, телескопов, гироскопов и акселерометров.
В книге «Цифровой Аполлон» хорошо рассказано, как программа расставляла приоритеты и распределяла процессорное время.
Технические спецификации бортового управляющего компьютера КА «Аполлон»
Временные эталоны работы AGC задавались кварцевым резонатором с частотой в 2,048 МГц. Память компьютера состояла из 2048 слов перезаписываемого ОЗУ и 36 К слов ПЗУ с линейной выборкой на многократно прошитых сердечниках. Цикл чтения-записи ОЗУ и ПЗУ занимал 11,72 мкс. Длина слова составляла 16 бит: 15 бит данных и 1 бит чётности. Формат 16-битного слова процессора включал в себя 14 бит данных, бит переполнения и бит знака.
Расположенный на борту космического корабля «Аполлон» управляющий компьютер (Apollo Guidance Computer, AGC) помог кораблю попасть на Луну и сесть на её поверхность. ПО AGC было физически вплетено в постоянное запоминающее устройство на многократно прошитых сердечниках [core rope memory]. Кен Ширриф с единомышленниками восстанавливают AGC (на фото ниже), которому не хватает памяти на сердечниках, вместо которой установлены коробочки-симуляторы такой памяти. Эти коробочки использовались во время разработки программ и наземного тестирования, чтобы инженерам не приходилось постоянно прошивать память. У симулятора отсутствует документация, поэтому я [автор записи в блоге / прим. перев.] провел его инженерный анализ, собрал интерфейс, и мы при помощи симулятора запускали на нашем AGC программы. Однако в процессе мы столкнулись с некоторыми сложностями.
Компьютер AGC со снятой крышкой. Видно системную плату с кучей проводов. В местах для памяти видны коробочки-симуляторы. Интерфейсные платы на переднем плане современные.
Компоновка «кордвуд»
Компоновка «кордвуд» активно использовалась в AGC для создания аналоговых схем, и она же присутствует и в симуляторах памяти (см. фото ниже). Белые круги в центре – это концы резисторов и диодов, закреплённых в модуле вертикально, и с припаянными с обеих сторон контактами. Компоненты плотно упакованы, словно брёвна, из-за чего такая компоновка и называется кордвуд. Импульсные трансформаторы находятся под большими серыми кругами. Такие же есть с другой стороны модуля, и из отверстий выходят их оранжевые, жёлтые, красные и коричневые провода. Чёрные провода соединяют схему кордвуд с цифровой логикой. Вверху на фото видно колышки, на которых смонтированы диоды и резисторы, вместе с соединением с контактами, подключающимися к AGC.
Главная цель компоновки кордвуд – обеспечивать электрическую изоляцию между схемами AGC и коробками-симуляторами памяти. В современных схемах эту функцию выполняют оптоизоляторы, но симуляторы использовали вместо них небольшие импульсные трансформаторы. Поскольку каждая коробка получает сигналы, предназначенные для трёх разных модулей памяти, множество диодов объединяют три сигнала в один. Резисторы управляют током, проходящим через импульсные трансформаторы.
Разбираться в строении аналоговых кордвуд-схем было тяжело. Во-первых, компонент не видно, поскольку они интегрированы в модуль. Приходилось использовать мультиметр, чтобы понять, где они находятся. Во-вторых, поскольку в компоновке кордвуд контакты выступают с двух сторон, я много времени провёл за переворачиванием коробки в поисках нужных контактов. Наконец, я не смог придумать удобного способа нарисовать диаграмму компоновки кордвуд, не порождавшего лабиринт из линий.
На Github опубликован исходный код «Аполлона-11»
Исходный код для для бортового управляющего компьютера КА «Аполлон» (Apollo Guidance Computer, AGC) на ассемблере опубликован на Github в полном виде, открыт для поиска, комментариев, форков и т.д.
В коде можно найти вызовы ставших знаменитыми ошибок с кодами 1201
и 1202, которые так беспокоили Нила Армстронга, и многое другое.
На Github репозиторий Apollo-11 быстро взлетел на 1-е место в списке самых популярных репозиториев за сутки .
Там действительно есть на что посмотреть. Особенно интересно почитать некоторые названия процедур (BURN_BABY_BURN--MASTER_IGNITION_ROUTINE.s) и комментарии в оригинальном коде.
А вот версия 1969 года популярного комментария «Это никогда не должно произойти».
Для воспроизведения ошибки в программе следует повторить такую последовательность действий:
1. Построить сервисный модуль.
2. Пролететь до окололунной орбиты.
3. На окололунной орбите запустить перемешивание в кислородных баках.
«Если в модуле есть проблема с проводкой, то ошибка может быть воспроизведена.
Будьте осторожны, потому что ситуация может опасна для тестировщика, который пытается воспроизвести ошибку», — отмечает не лишённый чувства юмора разработчик на Github.
Он имеет в виду знаменитую аварию с оборудованием служебного модуля «Аполлон-13», после которой модуль пришлось экстренно возвращать на Землю с помощью неординарных манёвров.
Управляющие команды «Аполлона» можно попробовать запустить в эмуляторе (это лишь симулятор компьютера, без самого космического аппарата).
«Аполло́н» — программа пилотируемых космических полётов НАСА, принятая в 1961 году с целью осуществления первой пилотируемой высадки на Луну, и завершённая в 1975 году. Всего по программе «Аполлон» были совершены 6 успешных высадок астронавтов на Луну.
В этой программе использовались космический корабль «Аполлон» и серия ракет-носителей «Сатурн», которые были позднее использованы для программы «Скайлэб» и участвовали в советско-американской программе «Союз — Аполлон».
AS-201 ("Аполлон-2") - первый полёт в рамках миссии, произведённый 26 февраля 1966 года. Выполнялся без экипажа. Длительность полёта - 37 минут.
AS-202 ("Аполлон-3") - ещё один тестовый полёт без экипажа, состоялся 25 августа 1977 года. Длительность - 1 час 33 минуты.
"Аполлон-1". Во время подготовки к первому пилотируемому полёту по программе «Аполлон», 27 января 1967 во время наземных произошёл сильный пожар. В огне погибли астронавты Вирджил Гриссом, Эдвард Уайт и Роджер Чаффи. Название "Аполлон-1" эта несостоявшаяся миссия получила по настоянию одного из руководителей НАСА. На пусковом комплексе установили мемориальную табличку, посвящённую погибшим астронавтам, на которой выгравировано:
"В память о тех, кто принёс наивысшую жертву для того, чтобы другие могли достать до звёзд. Через тернии к звёздам, в добрый путь, команда „Аполлона-1“"
"Аполлон-4" - беспилотный пуск, произведённый 9 ноября 1967 года. На корабле в качестве полезной нагрузки был установлен макет лунного модуля. Длительность полёта - 8 часов 37 минут. Отделение первой ступени ракеты снималось бортовыми кинокамерами, которые отделялись на высоте 70 км и приземлялись на парашютах. Эти съёмки использовались во множестве документальных и художественных фильмов, в том числе в сериале "Star Trek".
"Аполлон-5" - беспилотный запуск 22 января 1968 года с лунным модулем на борту. Во время полёта на орбите Земли отрабатывалось разделение ступеней лунного модуля, а также моделировалась работа двигательной установки для взлёта с поверхности Луны. В общем полёт продолжался около 11 часов.
"Аполлон-6" - беспилотный запуск 4 апреля 1968 года. На борту был габаритно-весовой макет лунного модуля. Данная миссия считается неудачной, так как корабль не удалось вывести на расчётную орбиту в запланированном режиме. Полёт продолжался около 10 часов.
"Аполлон-7" - первый пилотируемый запуск в миссии, 11 октября 1968 года. Экипаж: Уолтер Ширра, Донн Айзли, Уолтер Каннингем. За почти 11 дней было совершено 163 витка по орбите вокруг Земли, было успешно проведено множество испытаний и экспериментов.
"Аполлон-8" - 21 декабря 1968 года. Экипаж: Фрэнк Борман, Джеймс Ловелл и Уильям Андерс. В рождественский Сочельник (24 декабря) они вышли на орбиту Луны и совершили 10 витков вокруг неё. В общем полёт продолжался чуть более 6 дней.
На картинке: Земля с расстояния 30000 км. Первая полная фотография Земли, снятая живым человеком.
"Аполлон-9" - 3 марта 1969 года. Экипаж: Джеймс МакДивитт, Дэвид Скотт, Рассел Швайкарт. За 10 дней был совершён 151 виток вокруг Земли. В ходе этого полёта требовалось максимально полно отработать все системы для полёта к Луне.
"Аполлон-10" - 18 мая 1969 года. Экипаж: Томас Стаффорд, Джон Янг, Юджин Сернан. "Генеральная репетиция" высадки на Луну. Было совершено 32 витка вокруг Луны, и на лунной орбите выполнялись все необходимые операции по работе двигателей и расстыковке отсеков.
На картинке: восход Земли над лунным горизонтом, сфотографировано экипажем "Аполлона-10"
"Аполлон-11" - первая в истории высадка на Луну, 20 июля 1969 года. Нил Армстронг и Эдвин Олдрин оставались на Луне 21,5 часов, и на 2,5 часа выходили на поверхность. Всё это время пилот командного модуля Майкл Коллинз ожидал их на окололунной орбите. Астронавты установили в месте посадки флаг США, разместили комплект научных приборов и собрали 21,55 кг образцов лунного грунта, которые были доставлены на Землю.
"Аполлон-12" - вторая высадка на Луну, 19 ноября 1969 года. Экипаж: Чарльз Конрад, Ричард Гордон и Алан Бин. Посадка примерно в 1500 км от "Аполлона-11". Целью было фотографирование Луны, сбор грунта, проведение сеансов телевизионной связи с Землёй и многое другое. Также перед экипажем стояла задача найти на Луне аппарат "Сервейер-3" и доставить его на Землю, чтобы изучить влияние длительного пребывания в лунных условиях.
"Аполлон-13" - экспедиция, проходившая 11-17 апреля 1970 года. Экипаж: Джеймс Ловелл, Джон Суаргейт, Фред Хейз. Во время этого полёта произошла серьёзная авария (взрыв на корабле), что привело к огромному количеству проблем в дальнейшем. Вернуть экипаж удалось с огромным трудом. На время операции по спасению экипажа ряд стран, в том числе СССР, объявили режим радиомолчания на использовавшихся частотах.
Именно во время этой экспедиции прозвучала знаменитая фраза "Хьюстон, у нас проблема".
Интересный факт: за несколько месяцев до полёта вышел фильм «Потерянные» с очень схожим сюжетом — в результате аварии на корабле трое астронавтов «застревают» на орбите Земли с ограниченным запасом кислорода. Непосредственные очевидцы назвали множество совпадений между фильмом и событиями миссии «Аполлон-13». Но самое любопытное то, что инженеры технической поддержки "Аполлона" признавались, что этот фильм повлиял на ход их рассуждений после аварии и помог прийти к правильному решению.
"Аполлон-14" - 3 высадка на Луну, 5 февраля 1971 года. Экипаж: Алан Шепард, Стюарт Руса, Эдгар Митчелл. Было произведено 2 выхода длительностью примерно по 4,5 часа каждый. Производился сбор образцов, масштабная фото- и видео- съёмка.
На корабле в специальном контейнере летали около 500 семян деревьев, и эти деревья были посажены по всей территории США. (На 2016 год известно местонахождение 75 деревьев).
"Аполлон-15" - 4я высадка на Луну, 30 июля 1971 года. Основной акцент делался на научные исследования. Экипаж: Дэвид Скотт, Альфред Уорден, Джеймс Ирвин. Командир экипажа Дэвид Скотт и пилот лунного модуля Джеймс Ирвин провели на Луне почти трое суток (чуть менее 67 часов). Общая продолжительность трёх выходов на лунную поверхность составила 18 ч 30 мин. На Луне экипаж впервые использовал лунный автомобиль, проехав на нём в общей сложности 27,9 км. Было собрано и затем доставлено на Землю 77 килограммов образцов лунного грунта.
"Аполлон-16" - 5я высадка на Луну, 21 апреля 1972 года. Ещё одна миссия с акцентом на научные исследования. Экипаж: Джон Янг, Томас Маттингли и Чарльз Дьюк. На лунную поверхность были впервые доставлены: детектор космических лучей и ультрафиолетовая фотокамера. До полёта «Аполлона-17» миссии «Аполлон-16» принадлежали рекорды самого продолжительного пребывания на лунной поверхности (71 час 2 минуты), наибольшей продолжительности лунных ВКД (20 часов 14 минут) и наибольшей массы собранных и доставленных на Землю образцов лунной породы (95,7 кг). Кроме того, астронавты привезли на Землю 3793,5 м фото- и киноплёнки, отснятой на Луне и окололунной орбите.
"Аполлон-17" - 6я и последняя высадка на Луну, 11 декабря 1972 года. Экипаж: Юджин Сернан, Роналд Эванс, Харрисон Шмит. Астронавты оставались на Луне чуть более трёх суток, 74 часа 59 минут 40 секунд. За это время они совершили три выхода из корабля общей продолжительностью 22 часа 3 минуты 57 секунд. Было собрано и привезено на Землю 110,5 кг образцов лунной породы.
На самом деле, картинка для привлечения внимания слегка лукавая -- на ней запечатлен не сам компьютер Аполлона (далее -- AGC, Apollo Guidance Computer), а так называемый DSKY (DiSplay and KeYboard), или, говоря по-современному, интерфейс пользователя AGC. О DSKY я ещё напишу ниже, а пока вот фото восстановленного комьютера (бежевый ящик справа на фотографии):
Этот конкретный экземпляр использовался для обучения экипажей Аполлонов на Земле. После завершения программы его сдали на свалку по цене лома (!), как и много других ставших ненужными артефактов эпохи. Но, к счастью, этот AGC был выкуплен каким-то энтузиастом, долго лежал у того дома, и, в конце концов, очутился в месте, где его создали, а теперь и восстановили: в Массачусетском технологическом институте (МТИ).
Выглядит неказисто, конечно, но на деле перед вами -- громадная веха, один из первых комьютеров на микросхемах, прадедушка современных компьютеров. Для того времени спользование микросхем было очень смелым и рискованным техническим решением, но иного выхода не было: без применения новейших на тот момент технологий, разработчики и близко не смогли бы уложиться в заданную массу и габариты. В результате, AGC стал тогдашним шедевром минитюаризации: при массе в 32 килограмма и энергопотреблении 55 Вт, он имел аж четыре килобайта ОЗУ и 74 килобайта ПЗУ! А если точнее, 2048 слов ОЗУ и 36864 слов ПЗУ, с длиной каждого слова в 16 бит. Логическая схема компьютера (кликабельно):
Давайте теперь заглянем внутрь этой "коробки" (кликабельно):
Слева лоток "А", в котором находятся модули логики и интерфейса. Связки проводов в левой части лотка это источник питания, который преобразовал 28 вольт от космического корабля в 4 и 14 вольт для использования в AGC. Справа лоток "B", в котором находятся схемы памяти, генератор и сигнализация. В пустом месте должен был быть модуль памяти ядра.
Что за модуль памяти ядра, спросите вы? В это место вставлялось постоянное запоминающее устройство (ПЗУ). Оно была ферритовым, т.е. если совсем по-простому, когда некий провод проходит через магнитный сердечник в форме кольца -- это логическая единица, когда нет -- ноль. Главных преимуществ у этого метода хранения информации было два. Во-первых, имеем высокую для тех времен плотность хранения информации: на AGC через или вокруг каждого кольца проходило 192 провода, т.е. каждое кольцо хранило 12 слов данных. А во-вторых этот метод был сверхнадежен для космических условий, ибо космические лучи имеют весьма неприятное свойство менять состояние случайных битов в определенных типах накопителей информации, и функционерам НАСА хотелось иметь уверенность, что состояние ПЗУ ACG те лучи затронуть не смогут. Стоит отметить, что программное обеспечение замораживалось где-то за десять месяцев до полета.
Вот фотография одного из этих модулей:
И увеличенный вид самих колец с проводами:
Только представьте себе, какой ответственной, и в то же время адовой работой было плетение этих "узоров"! Занимались этим исключительно женщины, в силу лучшей мелкой моторики. Для них у членов лаборатории приборов МТИ была даже аббревиатура LOL, или "Little Old Ladies", т.е. "маленькие пожилые женщины":
Хотя на деле, конечно, отнюдь не все они были пожилыми:
"Плетение" крупным планом:
В том же блоге по тэгу Аполлон есть еще несколько интересных постов, включая пост, где они описывают использование восстановленного AGC для. майнинга биткоинов! Впрочем, для майнинга одного-единственного блока старичку понадобилось бы время, которое примерно в миллион раз превышает возраст вселенной, так что разбогатеть таким способом не выйдет.
Возвращаясь к написанному выше: в этом восстановленном экземпляре AGC блок ПЗУ отсутствует, потому что его в свое время решили не делать для наземного комьютера: уж очень дорог был процесс создания такого ПЗУ. Вместо этого, в ходе тренировок на земле AGC подключали к эмулятору ПЗУ, через штекер слева-сверху на фотографии ниже:
Что интересно, ни самого эмулятора, ни даже его подробного технического описания не сохранилось, так что при реставрации AGC тот пришлось создавать чуть ли не с нуля:
Еще одна фотография "вскрытого" AGC (кликабельно):
Ну и блок питания (пост об оном из вышеупомянутого блога):
Теперь стоит немного описать интерфейс AGC, т.е. DSKY. Вот аутентичный DSKY с выставки:
Команды в него вводились в формате "Verb-Noun" ("глагол-существительное" ).
- Verb: некое действие -- вывести или обновить информацию на дисплее, поменять программу, и т.д.
- Noun: данные над которыми производится действие Verb'a -- скорость, углы, время, и т.д.
Кому интересно, в этой презентации, в числе прочего, подробнее про DSKY и описание нескольких режимов работы оного: The Apollo Guidance Computer Architecture and Operation.
Для примера, ниже на картинке изображен дисплей DSKY при вводе программы 63:
Современные UX-шники, конечно, от такого интерфейса сразу повесились бы. Чего стоит то, что позиция дробного знака может меняться, но на дисплее дробный знак вообще никак не отображается, нужно просто помнить в какой ты программе. Всего тех программ было 45. Verb'ов и noun'ов было 80 и 90 соответственно.
Но астронавты, конечно, помнили всё это -- не зря же они до автоматизма отрабатывали всё на тренажерах. Более того, в одной из миссий (Аполлон-14), астронавты даже ввели в компьютер самый настоящий патч! Контакты кнопки аварийного прерывания посадки на Луну начали замыкаться плавающим там куском припоя, что обнаружилось незадолго до начала посадки. Если контакты снова случайно замкнулись бы во время посадки, то та бы сорвалась -- что, после аварии Аполлона-13, запросто могло привести к отмене всей программы. Инженеры на Земле всего за два часа написали и протестировали патч, который заставил нужную часть программы "думать" что та уже в режиме отмены посадки. Зачитали нужные команды по радисвязи на борт, астронавты вручную ввели их в компьютер лунного модуля (ЛМ), и всё обошлось.
Я, впрочем, нифига не астронавт, триножоров не заканчивал, так что просто от балды понажимал на кнопки на эмуляторе DSKY, который был там на выставке :)
Стол этот пользовался особой любовью посетителей:
Кстати, а многие заметили и опознали кусок фотографии на снимке выше?
Это Маргарет Гамильтон, на снимке она стоит рядом с распечатками текста программы, которую создали она и её команда в МТИ. Именно благодаря её коду Аполлон-11 смог сесть.
Дело было вот в чем. Радар для орбитальной стыковки ЛМ делал около 12800 запросов в секунду при максимально широком режиме сканирования, что составляло около 15% производительности комьютера лунного модуля (LGC). Инженеры специально оставили именно такой резерв для максимального ожидаемого количества подобных запросов. Но тут вмешался закон подлости: LGC и груманновская система аварийного взлета (AGS) были запитаны индивидуальными блоками питания, каждый с переменным током с частотой 800Гц, причём фаза между ними не была синхронизована. Когда радар находился под контролем системы аварийного взлета, и в то же время работал еще и LGC, примерно в 1-2% случаев определенная комбинация фаз источников питания приводила к тому, что количество запросов от радара начинало превышать те самые 15%. По мнению инженеров "Груманна", несмотря на этот недостаток, такого сочетания режимов принципиально не должно было возникнуть, так что на проблему попросту махнули рукой. Отчасти на это решение могла повлиять некоторая вражда между "Груманном" и лабораторией приборов МТИ: в 1964 году груманновцы попытались было "отобрать" у МТИ бортовой компьютер Аполлона, и были отшиты с особым цинизмом.
Так вот. Во время полета Аполлона-10, т.е. генеральной репетиции посадки Аполлона-11, ЛМ снизился до высоты 15 километров, и потом снова начал взлет. Во время взлета система навигации и управления нештатно повела себя из-за неверных настроек автопилота: так, корабль сделал восемь неожиданных и довольно резких разворотов по крену. Помятуя об этом, во время посадки Аполлона-11 Базз Олдрин оставил радар орбитальной стыковки включенным (т.е. под управлением AGS) -- дабы при аварийном прерывании посадки, у него и Нила было бы больше времени на поиск второго корабля и маневрирование. При этом выпала неудачная комбинация фаз источников питания (повторюсь, вероятность в районе 1-2%!), и компьютер попросту перестал справляться с выполнением всех задач, выдав астронавтам те самые широко известные в узких кругах предупреждения 1202 и 1201. Если бы не код команды Маргарет, который в таких случаях заставлял LGC игнорировать все второстепенные задачи, то неизвестно, чем кончилось бы дело. Стоит отметить, что во второстепенные задачи вошло даже отображение данных на DSKY, т.е. тот какое-то время попросту перестал показывать астронавтам расстояние и время до посадки, чем изрядно шокировал Базза :)
И раз уж упомянул посадку, самое время вернуться к восстановленному AGC. Он там, на выставке, был не просто для красоты. Один из членов МТИшной команды посадил с его помощью ЛМ в Orbiter'е: компьютер считывал данные с органов управления и с симулированных в Orbiter датчиков, и выдавал соответствующие команды двигателям и DSKY:
Рядом была лего-модель лунного модуля (да, такая же, как у меня), на которой AGS "зажигал" в реальном времене посадочный двигатель:
Дюзы маневрирования тоже загорались:
Видео "посадки", пардон за небольшую шевеленку:
И еще видео, уже не моё:
Основные члены команды, слева направо: Mike Stewart (сидит спиной к объективу на снимке выше), Carl Claunch, Ken Shirriff, Marc Verdiell:
Кен читает лекцию об AGC перед "полетом":
Вот и всё. Надеюсь, пост понравился. Если что-то неверно, или какие-то снимки у вас неправильно отображаются (например, повернуты набок) -- напишите в комментариях, пожалуйста.
ЗЫ В дополнение к уже упомянутым в посту ссылкам, вот ссылки по которым описан процесс восстановления: часть 1, часть 2.
Ещё могу порекомендовать книгу Left Brains for the Right Stuff, за авторством одного из создателей AGC, Хьюга Блэйр-Смита. Весьма интересный взгляд изнутри на процесс создания компьютера (плюс, есть немного информации про компьютер Шаттла). Я свою купил на этой же выставке, с дарственной подписью автора, но и на Амазоне она тоже имеется.
Ну и наконец, очень подробная книга об AGC за авторством Frank O'Brien: The Apollo Guidance Computer Architecture and Operation.
Заключение
Бортовой управляющий компьютер «Аполлона» использует память на многократно прошитых сердечниках. Поскольку во время разработки постоянно переделывать такую память было бы непрактично, вместо неё использовались симуляторы. Я провёл инженерный анализ симулятора и создал интерфейс для его работы при помощи BeagleBone. Мы с успехом запустили программы на AGC посредством этого интерфейса. Однако симулятор памяти оказался проблемным и ненадёжным.
@CuriousMarc сделал видео, где подробно показана наша работа с симулятором памяти:
20 июля 2009 года в честь 40-летия высадки на Луну распечатки с исходным кодом программы для бортового управляющего компьютера КА «Аполлон» были оцифрованы и выложены в интернете.
Основная статья на GT:
Я же Вам принес частично переведенные лулзы из обсуждения одного бага. (Сам репозиторий уже оброс такими шутками и станет скорей всего библиотекой проблем миссий Apollo)
Проблемы с симулятором
Симуляторы памяти на многократно прошитых сердечниках не были собраны по стандартам бортового управляющего компьютера «Аполлона», и в итоге с их отладкой мне пришлось долго провозиться. Многие соединения нарушились, их нужно было пропаивать снова (не знаю, сломались ли они от времени, или когда я разбирался в схеме работы). Также мы обнаружили короткое замыкание в одном дипстике и вышедшую из строя ИС.
Больше всего проблем было с дипстиками, поскольку многие контакты перемежались между дипстиками и ИС. Проблема была в том, что контакты ИС располагались на манер сэндвича между контактами на держателе дипстика и блока, куда они вставлялись. Пластиковые дипстики выгибаются наружу, из-за чего контакты периодически не работают. Согнув ножки ИС в виде буквы S, Марк сумел обеспечить им контакт с обеих сторон, по крайней мере, на некоторое время. Но через несколько часов мягкие ножки ИС выгибались обратно, контакты вновь начинали работать плохо, поэтому долговременного решения этой проблемы у нас не было.
Самой интересной проблемой была гонка двух сигналов от AGC, которые должны были прекращаться одновременно. Они питали оба конца катушки импульсного преобразователя, который не должен был выдавать сигнал. Однако один сигнал отставал от другого, что приводило к появлению паразитного импульса. К сожалению, цифровая логика в коробке симулятора была асинхронной, этот импульс блокировал неверный бит адреса в флип-флопах, и в результате происходил доступ к неправильному месту в памяти. В итоге мы отследили эту проблему и установили дополнительные конденсаторы, фильтрующие импульс. К сожалению, мы взяли слишком большие конденсаторы и сигнал в других случаях задерживался слишком сильно, что привело к появлению других ошибок. Потом мы поставили конденсаторы поменьше, и, наконец, сумели успешно запускать на AGC программы при помощи винтажных симуляторов памяти на сердечниках.
Результаты инженерного анализа
Отследив все контуры, я понял, как работает симулятор, и нарисовал схемы. По сути, одна коробка декодирует адрес, с которому идёт доступ, а вторая отправляет нужные данные в AGC (назову их «адресной коробкой» и «коробкой данных»).
Адресная коробка получает сигналы и преобразует их в двоичный вид. Задача не простая, поскольку сигналы приходят в виде импульсов тока большой мощности и напряжения 14 В, которые предназначены для переключения сердечников. Также эти импульсы разделены во времени, поскольку одни переключают сердечник в одну сторону, а другие – обратно. Наконец, импульсы отправляющиеся к сердечникам, содержат не только адрес, но и сигнал на выбор одного из 6 модулей, и на выбор одной из 12 нитей в модуле.
Адресная коробка использует импульсные преобразователи, превращая импульсы 14 В в ТТЛ-сигналы. Там содержится куча логики AND-OR для преобразования сигналов в двоичные адреса (а это нетривиально, поскольку в каждом модуле содержится по 6 килослов, это не степень двойки, поэтому требуется множество побитовых манипуляций). Флип-флоп блокирует адрес, когда тот доступен. Наконец, RC-цепь мультивибратора управляет таймингом, определяя на основании различных сигналов готовность адреса, и то, когда нужно отправлять результат в AGC.
Коробка с данными устроена проще. Она получает 16 бит данных от внешней системы и отправляет сигналы в усилители AGC, симулируя милливольтные сигналы от сердечника. Эти сигналы генерируются импульсными преобразователями. Адресная коробка и коробка данных общаются по проводам объединяющей панели AGC.
С внешней системой коробки общаются по дифференциальным сигналам, чтобы исключить шум от длинных кабелей. В коробках содержатся регуляторы на 5 В LM109, питающие ТТЛ. Одна коробка получает нерегулируемый DC через внешний разъём и отправляет нерегулируемый DC в другую через объединяющую панель AGC (что, как по мне, довольно странно).
Симулятор памяти на многократно прошитых сердечниках
Процесс прошивания памяти требовал серьёзного времени и денег, поэтому на время тестирования и разработки требовалась альтернатива. Вместо прошитых сердечников НАСА использовала их симуляторы, позволявшие AGC загружать данные из внешней системы. Наш AGC использовался для наземного тестирования, поэтому у него не было прошитых сердечников, а был их симулятор. Он состоит из двух коробочек, подключаемых в разъёмы для прошитых сердечников, причём каждая коробочка занимает по три слота памяти. Их видно на левой стороне AGC на фото ниже, и у них круглые разъёмы военного типа для подключения к внешнему компьютеру.
Коробки симуляторов устанавливаются в левую часть AGC вместо реальных модулей памяти.
И хотя у нас есть подробная документация на AGC, я не смог найти документацию на симулятор. Пришлось применить инженерный анализ, проследив все схемы и поняв, что делают коробки. Наружное их изучение мало что даёт. С одной стороны каждой коробки есть разъём MIL-Spec для подсоединения к внешней системе. С другой стороны есть три группы по 96 контактов, подсоединяющихся к AGC. Каждая группа контактов занимает место одного модуля памяти на сердечниках.
Вскрытие коробок показало нестандартную технику сборки. Частично в контурах использовался метод, конструктивно сходный с кордвудом – компоненты крепились вертикально при помощи отверстий в металлическом блоке. С обеих сторон блока контакты были припаяны к проводам. Другие схемы в коробках использовали стандартные интегральные схемы (TTL 7400). Но в отличие от современных печатных плат, чипы крепились внутри пластиковых модулей под названием «дипстик» [Dipstik, англ. — щуп] и были смотаны вместе проводами.
Цифровая логика и дипстик
Дипстик [Dipstik] был подключаемым модулем, представленным в 1968 году для облегчения прототипирования интегральных схем. Он заменил печатные платы системой упаковки, дававшей удвоенную плотность.
Идея состояла в пластиковом блоке коннектора с соединением контактов накруткой снизу для соединения схемы. Интегральные схемы устанавливались на держатель, вставлявшийся в блок коннекторов. У держателя сверху были ушки для пайки для установки дополнительных компонентов, например, развязывающих конденсаторов. На фото ниже показаны модули дипстик с одним вынутым держателем. На каждом держателе помещалось 5 ИС. Контакты ИС помещались между контактами держателя и контактами блока коннектора. Эта идея казалась хорошей, однако в итоге была ненадёжной. Дипстик оказался провальным проектом.
Ниже на фото показаны соединённые при помощи накрутки проводов контакты с нижней части дипстиков. Мне было чрезвычайно трудно их отслеживать, невозможно было идти по каждому проводочку в море одинаковых синих проводов. Мне приходилось прозванивать всё мультиметром. Затем я уже смог нарисовать схематическую диаграмму и думать над тем, что она делает. В сумме в симуляторе использовалось порядка 50 ИС.
Судя по маркировке компонентов, коробки симулятора собирали в 1971-м. И хотя тогда прошло лишь несколько лет с момента проектирования AGC, технологии в симуляторах уже выглядят более продвинутыми, что иллюстрирует быстрый прогресс ИС с середины 1960-х до начала 1970-х. AGC был собран на основе простых интегральных схем, в каждой из которых содержится два вентиля NOR и встроена примитивная резисторно-транзисторная логика (РТЛ). В коробках симуляторов есть уже более сложные чипы 7400-й серии, содержащие более десяти элементов на транзисторно-транзисторная логике (ТТЛ). В отличие от устаревших плоских ИС в AGC, коробки симуляторов используют микросхемы в корпусе DIP (dual in-line package), а такие корпуса используются до сих пор.
BeagleBone в качестве интерфейса
Разобравшись с работой симулятора, дальше нужно было создать интерфейс, способный выдавать данные от программы в симулятор. Я использовал BeagleBone, крохотный одноплатный компьютер на базе Linux. Преимущество BeagleBone в том, что на нём стоят быстрые микроконтроллеры, способные в реальном времени реагировать на запросы к памяти от AGC.
Интерфейсом служит плата, воткнутая в BeagleBone. Каждый из двух кабелей идёт на свою коробку симулятора.
Я разработал интерфейсную плату для подключения к BeagleBone. Она довольно простая: дифференциальные линейные приёмники AM26C32, преобразующие дифференциальные сигналы симулятора в логические сигналы 3,3 В для BeagleBone, и дифференциальные линейные драйверы AM26C31 для отправки сигналов в симулятор. Плату я спроектировал в KiCad и заказал изготовление у PCBWay, спонсора восстановления AGC.
Я написал программу, работающую на микроконтроллере BeagleBone, PRU. Это, по сути, конечный автомат, ожидающий адреса от симуляторной коробки, ожидающий сигнала тайминга, читающий слово из BeagleBone RAM, и отправляющий слово в симулятор. Программу я выложил на Github.
Память на многократно прошитых сердечниках
В AGC находилось шесть модулей памяти на многократно прошитых сердечниках, каждый из которых хранил всего 6 килослов информации (порядка 12 Кб). Модули памяти немного напоминали ROM-картриджи для видеоигры, и хранили ПО в постоянном, но стираемом виде. Программы были записаны путём вплетания проводов, проходивших через магнитные сердечники. Проходящий через сердечник провод обозначал бит 1, а обходивший стороной – бит 0. Вплетя 192 провода через или вокруг сердечника, можно было хранить 192 бита, что давало гораздо большую плотность, чем перезаписываемая память на магнитных сердечниках, хранившая по одному биту на сердечник.
Память на многократно прошитых сердечниках (Блок I) с AGC
Изготовление такой памяти было кропотливым процессом, занимавшим 8 недель и стоившим по $15 000 за модуль. Опытные женщины продевали провода вручную, прошивая один за другим сердечники пустотелой иглой, через которую был продет провод (на фото ниже). Им помогала автоматическая система, считывавшая программу с перфоленты и располагавшая отверстие над массивом сердечников. Ткачиха продевала иголку через отверстие, проводя провод там, где нужно. После этого память монтировалась на модуле вместе с сотнями резисторов и диодов, и заливалась эпоксидкой для надёжности в полёте.
Женщина прошивает постоянную память, внося в неё программу
Лунный стол.
Используя цифровые файлы, извлеченные из архивов НАСА, французская дизайнерская студия Harow разработала стол, который реплицирует реальную топологию поверхности Луны.
На поверхности стола Apollo 11 представлены скульптурные стеклопластиковые плиты в виде лунного кратера. Покрытие этого толстого сегмента представляет собой слой смолы, который позволяет полностью просматривать его провалы и щели, обеспечивая покрытие на неровной местности. Ножки из латуни и алюминиевого сплава также отдают дань уважения многочисленным миссиям Apollo.
Читайте также: