火星好奇号漫游车的内置软件是什么?


544

火星“好奇号火星车成功着陆,其中一部宣传视频“ 7分钟的恐怖”吹嘘着有50万行代码。毫无疑问,这是一个复杂的问题。但这是很多代码,当然背后要花很多精力。有人知道这个项目吗?我只能想象这是某种嵌入式C语言。


91
为什么要假设项目中只涉及一种语言。
钻机

5
好的一点,当然,它可能具有广泛的相关技术。我想进一步了解所有这些内容:)
InfinitiesLoop

3
哪一部分?飞船?月球车?仪器?地面系统?正如其他评论所指出的,在不同的组件中可能使用了几种语言。对于某些时间紧迫的组件使用汇编程序并不是没有问题的。
GreenMatt 2012年

67
老实说,当我看到500kloc的身影时,发现自己在想“只有吗?” 如果是Haskell,这本来可能是现实的,但是阅读了一些有关先前项目及其底层语言的信息,这似乎太低了。下面引用的2.5mio loc C代码更可信。
菲利普·卡梅纳尔斯基

19
一个更有趣的问题是“用什么语言?” “用什么过程?” 。正是这一过程与众不同,而且NASA几十年来一直在使用严格的过程。
dmckee 2012年

Answers:


506

它的运行250万行C上的RAD750处理器由制造BAE。该JPL有更多的信息,但我怀疑很多的细节没有公布。看来测试脚本是用Python编写的。

底层操作系统是Wind River的 VxWorks RTOS。可以使用C,C ++,Ada或Java编程有问题的RTOS。但是,只有C和C ++是操作系统的标准配置,扩展支持Ada和Java。Wind River提供了有关VxWorks的方式和原因的大量详细信息。

底层芯片组几乎是坚固的。乍一看它的规格似乎不高,但每15年只能拥有一个且只有一个“蓝屏”。请记住,这是受到辐射的轰炸,辐射会杀死人类很多次。在太空中,坚固性胜于速度。当然,这种鲁棒性是有代价的。在这种情况下,这是很酷的200,000美元至500,000美元。

一位Erlang程序员谈论了好奇心上计算机和代码库的功能。


48
JPL C语言编码标准,专门用于嵌入式环境,而不是所谓的“地面软件”。 lars-lab.jpl.nasa.gov/JPL_Coding_Standard_C.pdf
Patrick Hughes,

80
@Dynamic:这是一项非常重要的任务,因此NASA不会冒险。人类编写程序集会犯更多错误,这是一个可衡量的事实。
MSalters

22
编译后的C代码是机器代码,汇编语言是机器代码,我看不出有什么区别。当您精疲力尽时,性能并没有太大的区别。
Ramhound 2012年

23
NASA对代码非常谨慎。一切(一切)都首先在规范中完成,然后反复审查,检查和完善。当将其放入生命代码流中时,几乎是该规范参考的剪切和粘贴。对测试脚本的关注程度至少与代码一样重要,除非特别需要,否则不允许使用“浮华的”或聪明的代码技巧。
Stefan 2012年

99
@Amarghosh:是的,看看您的手机在高辐射环境(如外太空)中的运行情况如何:)
whatsisname 2012年

175

该代码基于MER(精神机会)的代码,而MER(精神机会)基于其第一个着陆器MPF(寄居者)。它运行了350万行C(其中大部分是自动生成的),并在BAEVxWorks操作系统制造的RA50处理器上运行。手工编码了超过一百万行。

该代码实现为150个独立的模块,每个模块执行不同的功能。高度耦合的模块被组织成组件,这些组件对它们包含的模块进行抽象,并“指定特定的功能,活动或行为”。这些组件被进一步组织为层次,并且“不超过10个顶级组件”。

资料来源:本杰明·西奇Benjamin Cichy)2010年航天器飞行软件研讨会(FSW-10)上的主题演讲,幻灯片,音频和视频(以任务概述,幻灯片80的架构讨论开始)。


Hacker News上的某人问:“不确定大多数C代码是自动生成的。是什么?”

我不确定100%,尽管在该年或不同的年份可能有一个单独的介绍其自动生成过程的演示文稿。我知道这在FSW-11会议上是一个普遍的话题。

Simulink是可能的。它是MATLAB组件,在机械工程师中,因此在大多数导航和控制工程师中也很流行,它使他们可以“编码”并模拟事物,而无需考虑他们正在编码。

基于模型的编程无疑是业界逐渐意识到的一件事,但是我不知道它在JPL上的流行程度如何,或者他们在项目开始时是否会选择使用它。

第三种也是最有可能的可能性是通信代码。对于所有空间系统,您需要从地面软件向飞行软件发送命令,并从飞行软件接收遥测,并使用地面软件对其进行处理。每个命令/遥测数据包都是异构数据结构,并且有必要使双方都从完全相同的数据包定义中进行工作,并对数据包进行格式化,以便在一侧将其正确格式化,然后在另一侧进行解析。这涉及正确处理很多事情,包括数据类型,大小和字节序(尽管后者通常是全局的;您可以在板上安装多个具有不同字节序的处理器)。

但这仅仅是表面。双方都需要大量重复的代码来处理诸如日志记录,命令/遥测验证,限制检查和错误处理之类的事情。然后您可以做更复杂的事情。假设您有一个命令来设置硬件寄存器值,并且该值将以遥测方式发送回特定的数据包。您可以生成监视该遥测点的地面软件,以确保在设置此寄存器值时,最终遥测会更改以反映该更改。当然,某些遥测点比其他遥测点更重要(例如,主总线电流),并指定为以多个数据包下降,这涉及在飞行侧进行额外的复制以及在地面侧进行重复数据删除。

有了所有这些,(在我看来)编写一组静态文本文件(以XML,CSV或某些DSL /您拥有的东西),通过Perl / Python脚本运行它们要容易得多,而且容易!码!

我不在JPL工作,因此除了一个例外,我无法提供视频中没有的任何细节。我听说自动生成的C代码是由Python脚本编写的,并且项目中自动编码的数量根据FSW主管的不同而有很大差异。


8
这可能会为制造VxWorks的承包商Wind River带来一些启示windriver.com/news/press/pr.html?ID=10901 我已经读到NASA的团队成员的工作是寻找尽可能多的bug。他们可以在控制系统中由另一个团队编写代码。发现错误的团队会得到错误发现团队的奖励,他们在发现神秘错误方面确实非常出色。当发现错误时,将进行5Y型分析,以找出如何改进软件开发流程以消除将来出现类似错误的可能性。一个非常艰苦而昂贵的过程。
吉姆·拉登

15
@JimRaden如果一次重试失败的直接损失从数亿美元到数十亿美元不等,并且需要数年(如果有的话)进行一次重做尝试,就可以证明QA中存在极端的妄想症。数十名/数百名研究生失去了多年的工作并不得不重新开始其博士学位研究工作而产生的间接成本,以及依靠这些数据来提供任期研究的各种新教授,是另一个重大打击,但要困难得多比NASA预算中的订单项要量化。
丹·尼利

1
自动生成的C是什么?请告诉我这不是Simulink。:-)
威廉·佩恩

2
@William Payne主题演讲指出,其中一些是自动生成的协议编码/解码例程(用于与地球通信),由python程序根据XML描述生成。
2012年

1
从ICD自动生成代码有点酷。我喜欢这个主意!我会使用YAML而不是XML。:-)
威廉·佩恩
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.