有人能够解释一下NASA如何设计他们的航天器架构以确保能够修复部署代码中的错误吗?
我从未建立过任何“实时”类型的系统,这是在阅读了这篇文章后浮现出来的问题:
http://pluto.jhuapl.edu/overview/piPerspective.php?page=piPerspective_05_21_2010
“在下周唤醒宇宙飞船时,我们将首先执行的主要任务之一是上传近20个次要错误修复和其他代码增强到我们的故障保护(或“自动驾驶响应”)软件。”
有人能够解释一下NASA如何设计他们的航天器架构以确保能够修复部署代码中的错误吗?
我从未建立过任何“实时”类型的系统,这是在阅读了这篇文章后浮现出来的问题:
http://pluto.jhuapl.edu/overview/piPerspective.php?page=piPerspective_05_21_2010
“在下周唤醒宇宙飞船时,我们将首先执行的主要任务之一是上传近20个次要错误修复和其他代码增强到我们的故障保护(或“自动驾驶响应”)软件。”
我曾经是公共电话交换系统软件的开发人员,该系统对可靠性、可用性、生存能力和性能有着非常严格的限制,这接近于航天系统所需的要求。虽然我没有参与过航天项目(在IBM期间我与许多前航天飞机程序员合作过),也不熟悉VXworks,但它是许多航天器使用的操作系统(包括火星探测器,它有着惊人的运行记录)。
补丁更新的核心要求之一是,系统必须从头开始设计以支持补丁更新。这包括模块结构,使得可以添加新变量并替换方法,而不会干扰当前操作。这通常意味着更改方法的旧代码和新代码都将存在,而打补丁操作只是更新类或模块的分派向量。
强烈建议将打补丁(和撤销补丁)软件集成到操作系统中。
在我从事电话系统工作时,我们通常在系统中使用补丁和模块替换功能来加载和测试我们的新功能以及错误修复,远在这些更改提交构建之前。每个开发人员都需要习惯于将打补丁和替换模块作为他们日常工作的一部分。这建立了对这些组件的信任,并确保补丁和替换代码经常进行练习。
在这些系统上的测试比你在任何其他项目上遇到的测试都要严格得多。部署系统的完整和部分模拟将随时可用。可能还会有虚拟机环境,可以运行并测试完整负载。所有高于单元测试级别的测试计划都将得到编写和形式审查,就像正式的代码检查一样(这也将是常规的)。
设计容错系统,包括软件设计,是必不可少的。虽然我不知道特定于航天器系统,但类似高可用性集群可能是标准配置,同时具备同步和异步运行的能力,并能在故障转移期间在两侧之间传输信息。这种系统结构的附加好处是,如果需要,可以将系统分割成两部分,重新加载未活动状态的一侧以获得新的软件负载,并在生产系统中进行测试,而不连接到系统网络或总线。当你确认新软件正常运行后,你可以直接切换到它。
就像打补丁一样,每个开发人员都应该知道如何进行故障转移,并应该在开发和测试过程中进行操作。此外,开发人员还应该知道会导致故障转移的每个软件更新问题,并应该知道如何编写补丁和模块替换,以避免尽可能少地进行必需的故障转移。
总的来说,这些系统从底层开始设计(包括硬件、操作系统、编译器,以及可能的编程语言),以适应这些环境。我认为Windows、Mac OSX、Linux或任何unix变种都不够稳健。其中一部分原因是实时要求,但整个可靠性和生存能力问题同样关键。
更新:另一个有趣的点是,这里有一个火星车司机的博客。这将让你了解维护操作航天器的日常生活。非常有趣!
http://www.boulder.swri.edu/pkb/ssr/ssr-fountain.pdf
需要注意的是: