火星“好奇号 ” 火星车成功着陆,其中一部宣传视频“ 7分钟的恐怖”吹嘘着有50万行代码。毫无疑问,这是一个复杂的问题。但这是很多代码,当然背后要花很多精力。有人知道这个项目吗?我只能想象这是某种嵌入式C语言。
火星“好奇号 ” 火星车成功着陆,其中一部宣传视频“ 7分钟的恐怖”吹嘘着有50万行代码。毫无疑问,这是一个复杂的问题。但这是很多代码,当然背后要花很多精力。有人知道这个项目吗?我只能想象这是某种嵌入式C语言。
Answers:
它的运行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程序员谈论了好奇心上计算机和代码库的功能。
该代码基于MER(精神和机会)的代码,而MER(精神和机会)基于其第一个着陆器MPF(寄居者)。它运行了350万行C(其中大部分是自动生成的),并在BAE和VxWorks操作系统制造的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主管的不同而有很大差异。