Pull to refresh

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

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

Многие наверно помнят что американская лунная программа называлась Аполлон и некоторые возможно даже видели фильм «Аполлон 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 :)

Tags:
Hubs:
Total votes 69: ↑66 and ↓3+63
Comments103

Articles