“我们的正前方窗口正对着地球。” 当登月舱“鹰”号侧转至窗口朝上的姿态时,巴兹·奥尔德林从电脑屏幕上移开目光,看到了近二十五万英里外的地球。
“确实是,”尼尔·阿姆斯特朗同意道,并补充说:“休斯顿,(我希望)你们能看到我们的 Delta-H(高度变化)。” 地球此刻并不是他的主要关注点。任务指挥官全神贯注于将航天器首次成功降落在月球表面。他只剩下三万英尺的高度……
“确认。” 指令通信员查理·杜克回答道。房间里的飞行管制员们听着他们的对话,密切关注着屏幕上的数字,寻找任何可能导致中止任务的异常情况。
随后,阿姆斯特朗的声音再次在无线电中响起,这次带着一丝紧迫:“是 1202……那是什么?报一下 1202 程序警报……”
1202 程序警报几乎出现在每一次关于阿波罗 11 号登月的叙述和戏剧化演绎中。这可以理解;这是本已充满戏剧性的事件中的一个关键时刻,它本可能导致任务中止,让阿波罗 12 号的指挥官皮特·康拉德成为历史上首位登陆月球的人。但它没有。众所周知,阿波罗 11 号成功着陆,而这个警报也只成为了故事的一个情节。那么,究竟是什么让 1202 程序警报差点导致阿波罗 11 号的登月失败?要回答这个问题,我们需要回顾一下阿波罗导航计算机的工作原理。

阿姆斯特朗在登月舱模拟器中进行训练。(来源:NASA)
美国宇航局
阿波罗导航计算机简介
到了阿波罗任务飞往月球的时候,运行任务的软件程序竟然——勉强——能够装进一套只读磁芯存储器里。这意味着信息片段可以随时被调用,并几乎同时运行,这非常重要。以登陆月球的时刻为例。计算机需要同时接收大量数据点才能实现成功着陆。它必须知道登月舱的位置和移动方向,这些信息被称为状态向量。它需要根据该位置,以及速度、高度和发动机性能数据来维持正确的姿态。它还需要不断调整中止轨迹,以便在出现任何可能导致中止的情况时,能将乘员安全带回轨道。
现在,请花一秒钟想想一次完整的月球任务——进入地球轨道,点燃发动机前往月球,分离登月舱,中途调整航向,进入月球轨道,着陆,离开月球表面,然后返回地球。你就能体会到在任何给定时刻,会有多少信息通过这台计算机。
为了简化起见,每个任务(在这里,“任务”是指单次任务事件,例如登月)都被分解成几个部分。这些部分或程序是可管理的模块,可以单独运行,同时使整个系统更加可靠。
如果你一直跟下来,就能发现这会产生一个潜在的新问题。阿波罗导航计算机是一台单处理器计算机。那么,它如何能够同时运行多个程序——构成一个完整任务事件的那些部分呢?嗯,它实际上并没有。但凭借相对较快的处理速度和相对缓慢的人类感知速度,它的运行速度足以平稳地完成任务。程序也根据优先级进行调度和运行,并设有中断任何程序的机制,以防出现至关重要的事情。
在阿波罗导航计算机的情况下,它有一个 12 个字的内存区域,称为核心组(Core Set)。这包含了执行给定程序的所有信息。指令舱中有六个核心组,登月舱中有七个。在每个 12 字的核心组中,处理信息占用五个字,每个字分别用于程序的优先级、入口点地址、BBANK 寄存器的副本、标志,最后一个指向向量累加器(VAC)区域。剩下的七个字用于临时变量或额外存储……无论它们是什么。它们被称为多功能累加器(MPAC)。
简而言之:核心组十二个字,五个字内存用于执行程序,剩下的七个 MPAC 按需处理额外信息。
程序的调度由执行程序(Executive)负责。它首先查看任务的起始地址及其优先级,然后将其传递给 NOVAC 例程。该例程会扫描核心组,查看程序是否有可用执行空间,如果有,则确定空间位置。然后,它调度并运行该程序。
通过大量的测试,麻省理工学院仪器实验室的团队设计了这台计算机,确保在任务的任何时刻都不会满负荷。总会有空间留给下一个程序,有规则可以中断当前程序以立即运行更重要的任务,或者有空间在当前计算机正在处理的任务结束后调度下一个程序。但当阿波罗 11 号下降到月球表面时,计算机却没有了核心组空间。这就是 1201 和 1202 程序警报的由来。
阿波罗 11 号的 1202 警报
登月舱进入 69 英里乘以 50,000 英尺的轨道准备着陆后不久,乘员打开了会合雷达,用于跟踪指令服务舱。这是一项安全措施。雷达追踪 CSM,以便在任务中止时知道将登月舱引导至何处。乘员将雷达置于 SLEW 模式,这意味着它需要由宇航员手动定位,同时也意味着它没有向计算机发送数据。
宇航员和任务控制中心的人员都不知道的是,雷达耦合数据单元(Coupling Data Units)**正在**向阿波罗导航计算机灌输反中断信号。这是由于计算机电源设计结构中的一个疏忽。这些信号占用了一点点计算机的处理时间,而这个虚假的作业在后台持续运行,占用空间。因此,在任何人不知情的情况下,这个信号阻止了与着陆相关的关键程序完成。当新任务发送到计算机时,已经没有地方存放了。正在运行和已调度的作业占用了它们的核心组和 VAC 区域。
最终,执行程序发现没有地方存放新程序了。这触发了 1201 警报,指示“执行程序溢出——无核心组”(Executive Overflow — No Core Sets),以及 1202 警报,指示“执行程序溢出——无 VAC 区域”(Executive Overflow — No VAC Areas)。这些警报反过来又触发了软件重启。所有作业都被取消,无论优先级如何,然后根据它们的表序重新开始,速度之快足以保证没有丢失导航数据。但问题并未解决。计算机仍然因相同的虚假雷达数据而过载,阻止新程序运行。总共触发了四次 1202 警报和一次 1201 警报。
最终,巴兹·奥尔德林注意到了一种关联。在第二次 1202 警报时,他呼叫道:“是同一个警报,而且它似乎在我们发出 16/68 指令时出现。” 16/68 代码——动词 16 名词 68——用于显示到着陆点的距离和登月舱的速度。这个指令本身并没有给计算机带来很大的负担,但加上已有的负荷,这额外的处理能力似乎触发了 1202 警报。意识到这一点后,解决方案很简单:直接向休斯顿询问数据,而不是从计算机调用。
与此同时,休斯顿尽管收到了警报,但还是给了阿波罗 11 号“绿灯”(GO),因为警报之间的间隔很长——它们发生在任务经过时间 102:38:22;102:39:02;102:42:18(这是 1201 警报);102:42:43;以及 102:42:58。如果它们间隔很近,重启过程可能会导致导航数据丢失,但即使只有几秒钟的间隔,也意味着关键信息得以保留。计算机的表现正如设计的那样,在没有正当理由的情况下,它会保护自己,而不会取消登月任务。
安全着陆
尼尔·阿姆斯特朗和巴兹·奥尔德林在训练中都没有遇到过 1202 程序警报。他们的模拟训练中充满了各种其他警报,其中大多数都会让他们伸手去按中止按钮。这是正确的反应。在模拟训练中,你会训练正确的反应。但当他们看到 1202 和 1201 程序警报时,那是真实的,这意味着正确的反应是完成任务目标。如果不是迫不得已,他们不会放弃登陆月球。
休斯顿的人们也做出了同样的反应。“我们允许这个警报继续,”查理·杜克呼叫道,尽管他说话时并不完全冷静。宇航员和飞行管制员们看着“鹰”号上的第二个 1202 警报亮起,三分钟后紧跟着一个 1201 警报,然后是最后两个几乎同时出现的 1202 警报。
“鹰号,看起来很棒。你们可以继续,”杜克的呼叫从任务控制中心传来。多亏了一群聪明的计算机程序员,他确认阿波罗 11 号仍然可以继续登陆月球。














