Компьютер на Луне

На днях президент США, Барак Обама, закрыл новую лунную программу США. Если вы мечтали при жизни попрыгать по лунной поверхности или слетать в отпуск на лунную базу то стоит отложить свои планы в долгий ящик, с грустью пересмотреть серию Футурамы про лунопарк и продолжить мечтать о яблонях на Марсе. Но я хочу написать немного не об этом. Я хочу вспомнить первую попытку человека высадится на луну и о вычислительной технике, которая сделала эту попытку реальной.

Многие наверно помнят что американская лунная программа называлась Аполлон и некоторые возможно даже видели фильм «Аполлон 13» с Томом Хэнксом в главной роли про драматическую судьбу тринадцатой миссии программы Аполлон. В фильме есть сцена, когда астронавты перепрограммируют бортовой компьютер, вводя набор цифр на клавиатуре подобия большого калькулятора. Вот об этом компьютере я и хочу рассказать.

(Apollo Guidance Computer с клавиатурно-дисплейным модулем. Источник .)

AGC — Apollo Guidance Computer был первым цифровым бортовым компьютером построенным на интегральных схемах. Он устанавливался на борт командного и лунного модулей и отвечал за навигацию и управление кораблём. AGC являлся первым компьютером в котором можно заметить прообраз современным встраиваемых (embeded) систем. Разработан компьютер был в начале шестидесятых годов в MIT. В компьютере использовались интегральные схемы компании Fairchild Semiconductor — создателя первых коммерческих интегральных схем. Основой компьютера были логические блоки ИЛИ-НЕ, построенные на резисторно-транзисторной-логике (как рассказывал нам преподаватель по схемотехнике, грелись RTL схемы похлеще современных компьютеров).

Существовало две версии AGC — ранняя BLOCK I и более поздняя BLOCK II. Первая версия насчитывала 4100 интегральных схем, вторая 5600. Процессор оперировал 16и битными словами, из которых 14 бит использовались под данные, один бит под знак и один был флагом переполнения. Обьём оперативной памяти составлял 2048 слов, а обьём ПЗУ составлял 36 кило-слов (72 килобайта для более простого понимания). ПЗУ основывалась на тех же принципах что использовались в ОЗУ на ферритовых матрицах. однако ферритовые сердечники использовались в ней лишь как трансформаторы, он не менял своего магнитного состояния а лишь объединял линию считывания с линией возбуждения «бит» — если сердечник был связан с линией «бит» — то на выходе имелся сигнал, интерпретирующийся как логическая единица, если связи не было — получался логический ноль.

(Увеличенный участок ферритовой матрицы. Источник .

Компьютер имел четыре основных регистра:

A: аккумулятор;

Z: счётчик команд;

Q: хранил остаток от деления а также адрес возврата при передаче управления;

LP: хранил младшую часть результата команды умножения.

Также он имел ряд вспомогательных регистров для управления банками памяти, адресацией, вводом/выводом.

Набор инструкций состоял из 12 команд — арифметические команды, команды управления, доступ к памяти и логическое побитовое И. Естественно все вычисления производились с числами с фиксированной точкой. Имелось в наличии пять линий прерываний — одна для обновления экрана, одна реагировала на нажатие кнопок на клавиатуре, одна для часов реального времени, линия прерывания окончания загрузки слова из памяти и прерывание сигнализирующее об аппаратном сбое. Также AGC имел 20 независимых ячеек памяти, которые могли работать в трёх режимах, в зависимости от сигналов на их входах — растущий счётчик, убывающий счётчик и регистр сдвига. Переполнение счётчика могло вызывать срабатывание прерывания — в частности так было устроенно обновление дисплея и часов. Они срабатывали при переполнении счётчиков, управляемых сто герцовыми аппаратными часами.

Работал AGC на частоте в 2,048 MHz – такой себе рядовой микроконтроллер по сегодняшним меркам. И эта вещь вела корабль с тремя астронавтами на борту к луне, и сажала Лунный модуль.

Также в компьютере был предусмотрен режим пониженного энергопотребления (при полной нагрузке он потреблял 70 Ватт). В таком режиме компьютер фактически был выключен, потреблял 5-10 Ватт и просыпался каждые 1.2 секунды. Предполагалось использовать данный режим на средних участках полёта, когда отсутствует необходимость в частом уточнении и корректировке курса, однако им так ни когда и не воспользовались.

(Начало листинга программы Лунного модуля миссии Аполлон 13. Источник .)

Когда создавался AGC, то ни какого подобного ПО и техник программирования не существовало. ПО писалось на ассемблере. На борту имелась небольшая операционная система реального времени с кооперативной многозадачностью, способная выполнять до восьми задач (jobs) «одновременно». Также в ОС имелся компонент Список Ожидания (Waitlist) который по таймеру мог выполнять небольшие задачи (tasks), согласно расписания (schedule). Эти задачи также могли добавлять себя в расписание а также запускать и останавливать jobs. (Всё это мне напомнило Symbian’овские активные задачи с их шедулером, активными объектами и его вариации — таймера).

Все задачи (jobs) имели свой приоритет, одна из задач, имевшая наиболее низкий приоритет, называлась dummy job и была аналогом современного «Бездейстия системы» 🙂 Эта задача выполняла диагностические проверки, а также выключала индикатор активности на панели компьютера. Если этот индикатор гас, это означало что компьютеру нечем заняться 🙂

Также в MIT была разработана виртуальная машина для AGC, которая позволяла выполнять программы написанные на языке более высокого уровня. Этот язык содержал набор команд позволявших производить вычисление с более высокой точностью, а также содержал более расширенные инструкции — вплоть до операций над матрицами и векторами. Использовался он для программирования навигационных расчётов, однако как и всякая виртуальная машина выполнялся заметно он медленнее, более прожорлив по памяти, хотя имел плюс — позволял в одном коде смешивать высокоуровневый и нативный код. Чтобы облегчить жизнь программистам была создана система контроля версий YUL.

(Панель управления AGC в командном модуле. Источник .)

Имелось также подобие шела — астронавт мог запускать задачи (jobs) выводить на экран значение различных ячеек памяти в восьмеричной и десятичной системах, а также управлять task’ами для периодического вывода некоторых значений на дисплей.

Немного подробнее рассмотрим дисплей и систему ввода. Управление AGC и юзабилити вещи несколько не совместимые. Всё управление осуществлялось при помощи цифровой клавиатуры как у калькулятора. Астронавт мог задавать действие (глагол) и то, над чем действие должно быть произведено (существительное). Для отображения численных значений имелось три пяти разрядных индикатора. Три было выбрано не спроста — зачастую они отображали вектор положения корабля, его скорость и т. п. В командном модуле имела два клавиатурно-дисплейных модуля, в Лунном — только один.

(Памятка со списком «глаголов» и «существительных» на панели командного модуля. Источник .)

AGC с честью исполнил возложенные на него задачи и даже использовался на начальной стадии разработки системы управления электродистанционной системы управления шатла (AGC был установлен на экспериментальный F8 для демонстрации потенциальной возможности применения ЭДСУ).

Не обходилось и без ошибок — во время первой посадки на луну сработало два сигнала о нехватке памяти и вычислительных ресурсов — как оказалось в последствии, программа Лунного модуля продолжала обрабатывать данные с радара сближения с командным модулем который требовал 14% вычислительных ресурсов, при том что программа посадки требовал 90% ресурсов. По совету с земли астронавты проигнорировали эти сигналы и провели успешную высадку на луну. В дальнейшем эта ошибка ПО была устранена.

AGC, вернее LGC — Lunar Guidance Computer можно смело назвать первым компьютером на луне и дай бог чтоб не последним.

Если вас зацепила данная тема советую посетить этот ресурс (английский) — тут много материалов по вычислительным системам аполлона и Джемини вплоть до мануалов к ассемблеру и листингов программ. Ну или просто погулите на тему AGC/LGC Apollo. Кстати один безумец в 2004 году построил свой аналог AGC 🙂

Пометьте публикацию своими метками Метки лучше разделять запятой. Например: программирование, алгоритмы