APP下载

载人航天工程高可靠嵌入式软件设计方法

2022-03-10束韶光刘俊阳

导弹与航天运载技术 2022年1期

束韶光,崔 宇,刘俊阳

(北京航天自动控制研究所,北京,100854)

0 引 言

随着计算机技术和设备数字化的飞速发展,航天系统从早期以硬件设备为主导、软件实现硬件系统特定功能的年代,逐渐迈入以软件为神经中枢,贯穿于航天系统的各条脉络的年代。如今的航天软件,既可在天上实现飞行控制,又可在地面完成各项检测任务,其可靠性已成为影响航天系统质量的关键因素。

近年来,中国运载火箭型号进入了跨越式发展的关键时期,大量软件和硬件的新技术在载人运载型号中得到了应用与推广。这些新技术的应用,造成软件功能和复杂度的不断增加。当前的软件已不再是简单堆叠起来的独立配置项,而是有机结合的复杂分布式软件系统。软件产品作为中国运载型号的重要组成部分,直接影响航天任务的成败,可能造成人员伤亡、设备损坏和环境破坏等事故,在这种背景下,载人航天任务对软件可靠性提出了更高要求,而运载火箭承担着空间站工程的发射和运载的重要任务,软件可靠性更是倍受关注,其中承担关键重要功能的嵌入式软件的可靠性设计又是一个重要环节。

航天型号关键软件大多是飞行中使用的嵌入式软件,固化在航天箭载计算机中,与硬件关系密切,协同完成特定功能;航天型号大部分为强实时系统,具有严格的时限要求,要求软件在一定时间完成相应的处理,系统处理结果不仅要求逻辑正确,而且要求时间时序正确可靠。

软件的错误或缺陷(不可靠)会导致任务的失败,甚至导致灾难性的后果。1996年6月4日,阿里安5运载火箭因64位浮点向16位带符号整数值的数据转换问题导致首飞失败。1998年12月,美国火星轨道器数据数制转换问题,导致毁坏。1999年4月,美国某军事卫星发射任务中,由于运载器某个常量输入错误,并且地面试验未检查出,导致系统工作异常。2009年8月19日,韩国首枚运载火箭罗老号,由于测量高压罐压力的软件出现了问题取消发射。大量的事故案例表明,软件设计和数据设计过程中,都需要对可能发生的故障进行分析,采取充分的可靠性措施,避免出现缺陷或消除故障,来确保系统不发生失效。

软件可靠性一般是指在规定的条件下和规定的时间内,软件无失效运行的概率,软件可靠性设计是软件可靠性工程的重要内容,实质是在常规的软件设计中,应用各种必须的方法和技术,使程序设计在兼顾用户的各种需求时,全面满足软件的可靠性要求。软件的可靠性设计贯穿于研制过程始终。本文主要从载人航天嵌入式软件的程序设计和数据设计两个方面来具体描述高可靠嵌入式软件的一些设计方法。

1 程序可靠性设计方法

运载型号的嵌入式软件的代表产品是控制系统飞行软件,由它自主、实时完成对火箭的飞行控制,保障载荷精确入轨。同样在火箭发射流程中,也有些嵌入式软件与发射点火这类安全关键的功能相关。针对具有这些安全关键功能的程序,都需要采取充分的可靠性设计措施,来确保软件安全可靠运行,避免发生危险事件,导致任务失败。而程序的查错容错设计、多版本容错设计、同步输出设计是保障嵌入式软件可靠性的重要方法。

1.1 查错容错设计

软件查错容错设计是指在业务逻辑功能设计基础上,增加某些特定可靠性措施,使程序在运行过程中自动查找存在的错误并控制错误影响的一种设计方法。它主要包括检查点设计和巡回检测设计两个方面。

1.1.1 检查点设计

检查点设计是在程序的相关部位设置检查点,检查是否发生了故障。检查点设置和执行的原则有以下两点:

a)接口原则:在设计时考虑其它硬件或软件单元存在着错误;

b)实时原则:当错误征兆被侦测到后,应尽快处理,限制错误的损害程度。

嵌入式软件的检查点的选取是为了有效和及时地识别故障,从而让软件的业务逻辑不应该因为故障特别是瞬发故障而不能继续执行任务。

原则上讲,嵌入式软件在与其他硬件交互时,往往需要进行检查点设计来完善可靠性措施。对于有时间应答要求的操作,可以设置一个计时器,当在预定的时间内未获得应答要求时,则可推断必定出现了故障。如软件通过硬件进行信号采集,对等待外部信号的程序可进行超时处理,在采集过程中插入检查点程序,实现使用定时器来控制循环动作的上限,使得程序能在规定时间内(无论采集成功或失败)退出等待外部信号的状态,避免程序陷入死循环,从而避免出现程序“假死”现象。飞行控制软件中AD采样单元在采样速率陀螺模拟量数值时采取了该方法。AD采样单元中对某一路AD通道的采样流程见图1。

图1 速率陀螺信号单个通道采集设计流程Fig.1 Rate Gyro Signal Acquisition Design Diagram

图1中加粗线的程序段就是一个简单的检查点设计。程序在未判断出AD转换结果寄存器有效前,会循环读取该寄存器的值,为了避免AD转换结果寄存器出现异常而无法退出循环的故障情况发生,在此处设置检查点,通过对AD读取次数进行控制来完成AD采样的可靠性退出机制,能有效避免硬件错误的影响范围和程度。

另外软件与软件之间的交互过程中也往往需要设计检查点。以三冗余的飞行控制软件与组合导航软件通过双口RAM交换信息的设计方法为例。单模的组合导航软件在读取三冗余的飞行控制软件前,需要通过读取三CPU双口RAM硬件同步信号判断三CPU数据是否准备好,当组合导航软件判断存在未准备好数据的CPU时,会进入判断硬件同步信号的循环中。为了避免硬件同步信号出现异常无法退出循环的故障情况发生,组合导航软件在查询同步信号状态处设置了检查点,通过设置超时时间完成可靠性退出机制。组合导航软件读取双口RAM检查点设计见图2。

图2 组合导航飞控导航数据的录取设计流程Fig.2 Navigation Data Admission Design Diagram

图2中加粗线的的程序段是组合导航软件的2个检查点。根据图2中流程可知,无论数据准备好的飞行控制软件是2个还是小于2个,均会进入循环查询的检查点,区别仅是所设置的超时时间不同,此项可靠性设计使得组合导航软件能在飞行控制软件各种异常状态下均能继续正常运行。

1.1.2 巡回检测设计

巡回检测设计,即软件主动对硬件及程序或数据进行循环检查的设计,其中包括定时或低优先级的巡检等。嵌入式软件中主要检测以下几个方面:

a)对RAM中代码区进行CRC校验,以保证正确的操作;

b)对RAM中诸元区进行CRC校验,以保证正确的操作;

c)对关键及重要的标志字及逻辑功能进行校核。

嵌入式软件启动后,会完成各关键数据及关键硬件寄存器的初始化工作,同时在后台对存放在RAM区的代码段和诸元数据段进行了循环CRC校核,确保程序与数据上传及搬移的正确性,循环校核任务工作在火箭点火前。图3给出了飞行控制软件的自检流程,它是巡回检测的典型应用。

图3 飞行控制软件巡回自检流程Fig.3 Flight Control Software Tour Self-check Flow Chart

1.2 多版本容错设计

版本程序设计由个开发小组各自独立实现相同功能的相异程序和表决器组成,各相异程序的运算结果经过比较(表决)以确定输出。在表决器不能分辨出对错的情况下,采取少数服从多数的表决方式确定输出。

火箭的点火时序程序采用了3版本程序设计。点火时序程序是控制系统能顺利完成火箭点火控制工作的重要组成部分,它由3个功能相同、版本不同、相互独立的程序组成。3个程序由3个开发人员独立完成,点火1时序程序的输出经过硬件控制与点火2时序程序、点火3时序程序的输出三取二后完成火箭的点火和紧急关机时序的控制。3个软件在实现相同时序控制功能的前提下,采用了不同的设计方法:

a)点火1时序程序的计时零点为点火,后续时序的输出采用相对于点火零点的绝对时间;

b)点火2时序程序的计时零点为点火,时序的输出采用相对于前一时序的相对时间;

c)点火3时序程序使用了跑表型延时接通定时器和延时断开定时器,时序的接通以点火计时到为条件;本路断开以本路接通作为起始,延时断开。

3种不同的设计方法避免了共因失效,即避免了软件同因一种逻辑故障机理失效的可能性,从而提高了软件系统的可靠性。

1.3 同步输出设计

载人航天中使用到的三冗余软件在完成相同的功能时,由于输入的随机性以及软件运行方式的差异性 ,存在三冗余软件在相邻的不同周期收到同一输入信号的情形,三冗余软件信号响应时刻的不同,会导致输出结果会有所差别。为避免上述情况的发生,嵌入式软件采用了交互表决策略进行同步处理。

以三冗余驱动信号输出嵌入式软件为例,在三CPU输出前需要软件进行三CPU同步判别:运行在单个CPU上的每个软件通过查询三CPU同步状态,以及表决功能完成三CPU同步输出。三CPU同步输出判别流程见图4。

图4 三CPU同步输出流程Fig.4 Three CPU Synchronous Output Flow Chart

图4描述的同步输出基本逻辑如下:

a)本机在决定是否要输出前,需确定本机及另外两机是否准备好输出;

b)如果本机和另外两机均准备好,则本机立即输出,此时另外两机也会立即输出,可以确保此情况三机同步输出;

c)如果本机未准备好,而另外两机准备好,则进入超时等待机制;如果超时时间Timerout 1过了本机仍未准备好输出,则本机不输出,另外两机输出;

d)如果本机准备好,而另外只有1机准备好,则进入超时等待机制,如果超时时间Timerout 2过了三机仍未全部准备好,则本机和另外一机输出。

这种同步策略从逻辑上保障了只要有两机准备好时就能实现输出的脉冲严格同步,确保脉冲驱动功能的可靠性。

2 数据可靠性设计方法

火箭使用的数据主要包括计算常量、内部变量、诸元数据以及实时采集的数据。计算常量固化在软件代码中。诸元数据与当次飞行任务密切相关,它随着飞行任务不同而变化,需要在临发射前生成并装订到箭载计算机内存中,供飞行软件使用。实时采集的数据主要包括电压、压力、液位等。本章以诸元数据为例阐述嵌入式软件中数据的可靠性设计方法。

2.1 诸元数据生成设计

诸元数据设计过程中,考虑到在人工输入、计算、生成、使用等环节可能引入错误,因此采取了相应的可靠性设计方法进行避错、查错,同时从流程上规范诸元数据生成及验证的过程,具体流程如图5所示。图5中阐述了诸元数据设计含诸元输入数据确认、诸元数据自动生成、诸元数据完整性确认、诸元数据验证等工作,本节分别从诸元产生的全生命周期中各个阶段阐述可靠性设计和验证的技术方法。

图5 诸元数据设计及验证流程Fig.5 Data Design and Verification Process

为避免人工生成诸元数据过程中引入操作错误,通过诸元生成系统读取诸元原始数据以及配置文件,自动生成箭上飞行控制软件能够识别的二进制格式的诸元文件。诸元原始数据由多组文件组成,如制导诸元、姿控诸元、时序诸元等数据输入文件。配置文件也由多组文件组成,与诸元数据输入文件相对应,它规定了相应诸元的数据类型、数目、计算约束条件等信息。诸元数据自动生成软件依次读取诸元原始数据输入文件中的数据,转换成为目标处理器识别的二进制数据,根据配置文件排列顺序。图6为诸元自动生成系统的示意图。

图6 飞行诸元数据设计和生成系统Fig.6 Flight Metadata Design and Generation System

2.2 诸元正向生成的可靠性设计

a)诸元输入数据合理性检测。

根据查错设计原则,对读到的数据进行合理性检测,当检测到输入数据不合理时立即中止诸元生成工作,并向用户反馈该错误。合理性检测主要包括:

1)变量范围合理性检测。如助推段俯仰、偏航切换网络时间的非负性判断。

2)数组变量非负性和单调性检测。如为对飞行时和各段飞行时t的非负性和单调性检查,以及每行数据时间间隔合理性检查。

b)数组型诸元数据外推设计。

为保证飞行控制软件使用诸元数据时工作于内插状态,将数据进行外推,最终装订量满足装订时间范围后如果仍未填满数据空间,则将数据进行外推扩展,直至填满整个装订数据空间,对飞行控制软件起到内插保护的效果。

2.3 诸元数据完整性确认设计

为确保诸元数据的完整性,对诸元数据进行完整性检验设计。在二进制诸元文件开头增加诸元数据开始标志,尾部增加诸元数据结束标志以及校验信息,使飞行控制软件能在启动运行后,根据文件中诸元数据开始标志和结束标志计算出诸元文件长度,根据诸元文件的长度以及文件中的CRC值循环进行诸元段CRC校验,如果计算的CRC校验码与文件中自带的CRC校验码相等,则诸元数据没有损坏,否则说明诸元数据在传输或存储过程中发生损坏。二进制格式的诸元数据空间分配示意见图7。

图7 二进制诸元文件结构Fig.7 Binary Metafile Structure Diagram

2.4 诸元数据的反向比对设计

为验证编译器在诸元数据源码向目标码转换过程的正确性。对诸元数据目标码进行快速逆向解析、比对和翻译,并在源码中定位,生成比对报告,验证诸元目标码和源码的一致性。设计上是先以内存map文件和诸元模板文件为基础,把诸元目标码逆向生成源码,其中要解决目标码中诸元变量的源码定位、分析和格式翻译等诸多问题。再利用诸元模板、误差容限配置进行诸元比对。它能确保生成诸元数据目标码产品同源码完全一致,避免由于生成过程缺陷影响最终诸元数据产品的正确性。计算溢出错误便可通过诸元数据的反向比对进行检验。计算溢出错误,就是在计算过程中,变量的值超过了该变量类型的有效范围。通过反向生成得到的源文件同初始源文件进行比对,即可检验出计算溢出错误。图8为诸元源文件和逆向生成源文件比对设计示意。

图8 诸元源文件和逆向生成源文件比对设计示意Fig.8 Schematic Diagram of Comparison Design between Data Source Files and Reverse Generated Source Files

3 结束语

本文重点从程序可靠性设计与数据可靠性设计两方面入手,介绍高可靠嵌入式软件中与可靠性相关的重要而具体设计的方法,也正是这些方法的实践和应用,使火箭系统冗余方案能有效发挥作用,从而圆满完成载人航天工程发射任务。