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

评论

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

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

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

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

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

#1 楼

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

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

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

评论


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

–帕特里克·休斯(Patrick Hughes)
2012年8月6日在6:21

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

– MSalters
2012年8月6日上午8:16​​

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

–猎犬
2012年8月6日上午11:43

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

– Stefan
2012年8月6日在13:02

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

–whatsisname
2012年8月6日15:02

#2 楼

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

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

资料来源:Benjamin Cichy在2010年航天器飞行软件研讨会(FSW-10)上的主题演讲,幻灯片,音频和视频(从任务概述,幻灯片80的体系结构讨论开始)。是从哪儿来的?”

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

Simulink是可能的。它是MATLAB组件,在机械工程师中,因此在大多数导航和控制工程师中也很流行,并允许他们在不认为自己正在编码的情况下对其进行“编码”和模拟。

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

第三种也是最有可能的可能性是通信代码。对于所有空间系统,您需要从地面软件向飞行软件发送命令,并从飞行软件接收遥测,并使用地面软件对其进行处理。每个命令/遥测数据包都是异构数据结构,并且必须使双方都从完全相同的数据包定义中进行工作,并对数据包进行格式化,以便在一侧将其正确格式化,然后在另一侧进行解析。这涉及正确处理很多事情,包括数据类型,大小和字节序(尽管后者通常是全局的;您可以在板载多个处理器时使用不同的字节序)。表面。双方都需要大量重复的代码来处理诸如日志记录,命令/遥测验证,限制检查和错误处理之类的事情。然后您可以做更复杂的事情。假设您有一个命令来设置硬件寄存器值,并且该值将以遥测方式发送回特定的数据包。您可以生成监视该遥测点的地面软件,以确保在设置该寄存器值时,最终遥测会更改以反映该更改。当然,某些遥测点比其他遥测点更重要(例如,主总线电流),并且指定为以多个数据包下降,这涉及在飞行侧进行额外的复制以及在地面侧进行重复数据删除。 >
所有这些,(我认为)编写一组静态文本文件(以XML,CSV或某些DSL /功能丰富)(通过Perl / Python脚本)运行要容易得多(我认为) ,然后保存!代码!

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

评论


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

– Jim Raden
2012年8月6日17:47

@JimRaden一次探查失败的直接损失在数亿美元至数十亿美元之间,而在进行一次重做尝试时可能需要数年(如果有的话)进行质量保证,这是合理的。数十名/数百名研究生失去了多年的工作并不得不重新开始其博士学位研究工作而产生的间接成本,以及依靠这些数据来提供任职期限研究的各种新教授,是另一个重大打击,但要困难得多比NASA预算中的订单项量化。

–丹在火光中摆弄
2012年8月6日18:41

自动生成的C是什么?请告诉我这不是Simulink。 :-)

–威廉·佩恩(William Payne)
2012年8月6日在20:54

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

–不
2012年8月7日在9:36



从ICD自动生成代码有点酷。我喜欢这个主意!我会使用YAML而不是XML。 :-)

–威廉·佩恩(William Payne)
2012年8月7日13:41