宗 喆 ,杨志斌 ,袁胜浩 ,周 勇 ,Jean-Paul BODELEIX ,Mamoun FILALI
1(南京航空航天大学 计算机科学与技术学院,江苏 南京 211106)
2(高安全系统的软件开发与验证技术工信部重点实验室(南京航空航天大学),江苏 南京 211106)
3(IRIT-University of Toulouse,Toulouse 31062,France)
安全关键软件(safety-critical software)[1]是指应用于航空、航天和核能等领域的安全关键系统中,且其运行失效会引起系统处于危险状态,从而导致人员伤害、重大财产损失或者环境破坏等灾难性后果的一类软件,它对功能正确性、实时性、安全性等性质有极高的要求.随着系统复杂性的急剧增加,未来安全关键软件越来越多地采用异构构件组合架构,即构件由不同供应商以OEM(original equipment manufacturer)方式提供,各构件可能具有不同特性,例如使用不同的计算模型(状态机、同步数据流、异步执行模型、连续时间模型等)或实现语言,使得整个软件系统呈现异构性[2,3].异构软件系统的执行与交互语义也从完全同步发展到全局异步-局部同步GALS(globally asynchronous locally synchronous)方式,即不同构件具有各自的时钟控制(称为多时钟,multirates),构件之间采用异步通信方式.
近年来,多范式建模方法MPM(multi-paradigm modeling)[4,5]已成为安全关键异构软件设计的研究热点.多范式建模方法可以通过模型转换、模型组合、混合建模和混合仿真等方式对软件系统中使用的不同领域知识、不同视图以及不同抽象层次进行建模,充分发挥各种建模语言的描述能力.在安全关键系统领域,常用的建模语言主要包括Modelica[6]、SysML[7]、UML Marte[8]、AADL[9]、EAST-ADL[10]、SCADE[11]、Simulink[12]、Ptolemy II[13]等.其中,AADL(architecture analysis and design language)是由美国汽车工程师协会SAE 提出的面向安全关键系统的一种建模语言标准(SAE AS5506).AADL 以层次化构件的方式表达系统的软硬件架构.一方面,AADL可以非常方便地表达多时钟、GALS、异步通信等异构软件特征;另一方面,AADL 提供定义新属性集和附件(annex)等多种扩展方式,使得AADL 逐渐成为安全关键异构软件多范式建模的重要选择.
在支持多领域知识的多范式建模方面:Modelica 是一种面向对象的建模语言,用于对大型、复杂和异构系统进行建模,并支持多领域建模.例如,航空航天领域的安全关键异构系统涉及机械、电气、液压控制等多种领域模型.Sodja 等人[14]提出一种模型简化技术,对基于Modelica 的信息物理融合系统CPS(cyber-physical system)多领域模型进行模型简化,以降低基于Modelica 的异构模型的验证与执行过程的复杂性.
在不同抽象层次的多范式建模方面:Hugues 等人[15]提出一种基于SysML 和AADL 的安全关键系统设计、验证及代码生成方法.其中,SysML 主要用于系统高层建模与分析,当该系统分解给软件来实现时,就转换到AADL,用AADL 以逐步求精的方式进行软件设计与实现.Wang 和Hugues 等人[16]则进一步提出面向未来开放式航空电子系统的多范式建模方法,即SysML 用于系统工程建模,转换到基于AADL 的软件架构设计,并进一步转换到基于FACE[17]的开放式航空电子系统架构实现和基于SCADE 的软件构件功能实现.
在支持多种功能行为表达的多范式建模方面:AADL 提供行为附件BA(behavior annex)[18]对基于控制流方式的构件功能行为进行表达;正在制定中的AADL Hybrid Annex[19]则支持基于Hybrid CSP(communicating sequential processes)对构件的连续行为模型进行构造;Zhan 和Zhan 等人[20]使用AADL 与Simulink 进行混合建模,扩展AADL 描述系统连续行为的表达能力;欧空局ESA 提出基于AADL、Simulink 和规范与描述语言SDL(specification and description language)[21,22]的多范式建模方法TASTE[23-25].TASTE 基于AADL 语言子集描述系统框架,并使用Simulink、SDL、C/Ada 等描述系统功能行为,目前,TASTE 主要支持串行Ada 代码自动生成和集成.
随着安全关键异构软件对计算性能要求的不断增加,使用多核处理器成为航空航天领域的迫切需求.我们提出AADL 及行为附件BA、同步语言SIGNAL、SDL、Simulink、C、Ada 的多范式建模方法:AADL 用于表达安全关键异构软件架构,AADL 行为附件BA、同步语言SIGNAL、SDL、Simulink 分别支持状态机、同步数据流、异步执行模型、连续时间模型等多种计算模型,并基于抽象语法标记ASN.1(Abstract Syntax Notation One)[26,27]对异构模型间的交互数据建模.SDL 作为一种异步建模语言,其主要特征是:可以准确描述软件的异步功能行为,用于表达安全关键软件异步行为.我们在前期研究[28,29]中提出了同步语言SIGNAL 和AADL 的混合建模及多核代码自动生成方法,本文则主要介绍AADL 和SDL 的混合建模(两种语言的多范式建模,我们称其为混合建模)及Ada 多任务代码生成方法.两者的区别在于:同步语言SIGNAL 主要基于数据流等式表达AADL构件的功能行为,侧重于对数值计算相关的算法过程进行建模,例如GNC 系统中对地斜开关算法等;而SDL 则侧重基于控制流方式表达构件功能行为,侧重于对系统控制流程进行建模,如GNC 系统中的航天器三轴姿态角度修正控制模块等.
AADL-SDL 混合建模过程可分为自顶向下和自底向上两个方向:在自顶向下的建模过程中,首先,采用AADL 描述系统体系结构,并基于AADL 数据组件描述系统中涉及的数据类型;其次,对于具体功能行为采用SDL 模型进行描述,并给出AADL 数据组件到ASN.1 的转换,以保证异构构件间交互数据的一致性.而在自底向上的建模过程中,首先,采用SDL 语言描述具体组件功能,并基于ASN.1 描述SDL 模型和外部环境(即其他组件或系统输入/输出)之间的交互;其次,基于AADL 描述系统体系结构,并通过属性集扩展的方式规定AADL 体系结构模型和SDL 功能行为模型之间的调用关系和数据交换方式.例如,安全关键系统已经存在多个功能模块的SDL 模型,如何基于AADL 将这些不同功能模块自底向上地集成起来,构成完整的系统体系结构模型.
本文考虑自底向上的AADL-SDL 混合建模过程,主要贡献包括:
(1) 提出一种AADL 与SDL 混合建模方法,包括AADL-ASN.1 和AADL-SDL 扩展属性集方法.其中,AADL-ASN.1 扩展属性集主要用于描述混合模型中不同构件间的数据类型,AADL-SDL 属性集用于支持在AADL 体系结构模型中集成SDL 模型对应的功能行为.
(2) 提出一种面向多核处理器的AADL-SDL 混合模型到Ada 多任务代码生成方法.首先,基于AADL 体系结构模型生成Ada 框架代码;其次,根据混合模型中的ASN.1 数据属性生成Ada 数据类型代码.然后,基于混合模型中的线程运行时属性生成Ada 运行时代码;最后,基于SDL 模型生成Ada 多任务代码,并将所有生成代码进行集成.
(3) 基于AADL 开源建模工具Osate[30,31]实现了AADL-SDL 混合建模工具ASCM(AADL and SDL comodeling tool)和多任务Ada 代码生成工具AS2MTA(AADL and SDL to multi-task ada code generator),并使用实际工业案例AOCS 对本文所提方法的有效性进行了分析.
(4) 相较于前期工作,本文扩展了AADL 多范式建模框架对软件控制流程的描述能力,在支持状态机、同步数据流、连续时间模型等多种计算模型的基础上,增加了异步执行模型的建模过程.生成的Ada 代码相较于前期工作,增加了流程控制代码的并发过程,提升了代码的运行效率.
本文第1 节介绍AADL、SDL 建模语言和ASN.1 标准的基本概念.第2 节概述面向安全关键异构软件的AADL 多范式建模框架.第3 节对本文提出的AADL-SDL 混合建模方法进行详细阐述.第4 节给出AADL-SDL混合模型到多任务Ada 代码生成方法.第5 节介绍AADL-SDL 混合建模工具ASCM 和多任务Ada 代码生成工具AS2MTA.第6 节通过对工业界案例导航、制导与控制系统GNC 建模与代码生成进行分析并与部分前期研究进行比较,对本文所提方法及原型工具进行评估.第7 节对多范式建模、混合建模和代码生成相关工作进行分析.第8 节总结全文,并对未来研究内容进行初步探讨.
AADL 作为一种针对嵌入式系统的多范式建模语言,通过AADL 构件以及构件之间的连接,从软件结构、软件运行时环境和硬件结构这3 个方面对嵌入式系统体系结构进行建模描述.
1) 软件结构:支持通过线程、线程组、进程、数据、子程序等构件以及连接对软件的内部结构进行描述.通过上述构件的组合,建立具有层次化的软件体系结构模型.
2) 软件运行时环境:支持通过分发协议、通信协议、调度策略、模式变换协议以及分区机制等属性对软件执行模型进行建模.
3) 硬件结构:支持通过处理器、虚拟处理器、存储器、外设、总线、虚拟总线等构件以及连接对系统的硬件执行平台进行建模.
此外,AADL 支持基于自定义属性集(property set)和基于附件的扩展.其中,基于自定义属性集的扩展支持AADL 构件与多种异构模型之间通过自定义属性进行关联,以实现AADL 模型与多种异构模型间的集成.基于附件的扩展支持在AADL 核心构件的基础上通过增加附件的方式,提升AADL 建模语言的描述能力,例如:Behavior Annex 扩展基于控制流方式的构件功能行为表达能力;Hybrid Annex 扩展AADL 支持对构件的连续行为模型进行构造;Error Model Annex[32]扩展了AADL 描述系统故障行为的能力.AADL 核心构件、AADL 扩展属性集和AADL 附件共同组成完整的AADL 模型.
规范与描述语言SDL 支持使用半图形、半文本的方式描述特定类型的嵌入式系统的功能行为.SDL 有图形表示法GR(graphical representation)和文字短语表示法PR(phrase representation)两种.其中,GR 用一系列的符号和图形来描述系统,比较直观;PR 用语句来描述系统,便于计算机处理.这两种表示方法在语义上是等效的,它们之间可以互相转换.SDL 建模元素主要分为结构元素、定义元素和行为元素.
结构元素:主要用来描述整个系统模型的分层结构,包括系统(system)、功能块(block)、进程(process)和过程(procedure).图1 给出了一个SDL 系统模型结构,其中,SDL 系统层包括两个SDL 功能块B1 和B2,B1、B2 分别通过SDL 信号c1、c3 与系统外界交互,B1、B2 之间则通过SDL 信号c2 进行交互.SDL 功能块B1 中进程P1、P2 分别通过SDL 信号R1 和R2 与外界交互,P1 和P2 之间通过信号R3、R4 进行交互.SDL 进程P1 中描述了当前进程的行为,并且定义了SDL 过程Proc1,Proc1 对当前过程的功能行为进行建模.
Fig.1 An example of SDL system model structure图1 SDL 系统模型结构示例
定义元素:对软件中需要使用到的各种数据(data)、临时变量(variable)和子功能模块之间的信号(signal)进行建模描述.
行为元素:对进程(process)/过程(procedure)模块中的功能行为进行建模.行为元素包括开始状态(start)、状态(state)、触发器(trigger)、行为(action)、表达式(expression)等.其中,开始状态和状态用来基于自动机的方式对系统行为进行建模;触发器包含输入(input)和保存(save)元素,用来对子系统的中断行为进行建模,通常与通信信道组合使用,描述中断信号的传入和相关数据的保存;行为包含输出(output)、任务(task)过程调用(procedure call)、分支选择(switch)和进程创建等,主要用来对具体功能行为中需要的输出操作、顺序流程、外部过程调用、分支选择和进程创建等过程进行建模;表达式(expression)支持以伪代码的形式对具体行为进行建模描述.
ASN.1 作为一种国际标准,用于描述通过电信协议传输的数据.ASN.1 提供了一种对数据进行表示、编码、传输和解码的标准格式,能够有效地对异构系统之间的通信数据进行建模.在网络管理、安全电子邮件、移动网络和空中交通管制等领域有着广泛的运用.国际电信联盟ITU(International Telecommunication Union)也在标准ITU-T Z.105[33]中推荐在SDL 模型中使用ASN.1 描述数据类型.
ASN.1 中定义了整型(INTEGER)、布尔(BOOLEAN)、字符串(IA5String,UniveraslString,…)和位串(BIT STRING)等基本数据类型,并且支持有序集合(SEQUENCE)、有序数组(SEQUENCE OF)、无序集合(SET)和无序数组(SET OF)等复杂数据类型的构造.此外,ASN.1 还支持压缩编码规则PER(packed encoding rule)、可辨别编码规则DER(distinguished encoding rule)和XML 编码规则XER(XML encoding rule)等数据编码、解码规则的描述.因此,ASN.1 也广泛应用于需要计算机通信和其他需要编码数据的行业.
安全关键异构软件的AADL 多范式建模框架如图2 所示.核心思路是基于AADL 描述系统体系结构,基于AADL BA、同步语言SIGNAL、SDL、Simulink、C 和Ada 等描述功能行为,以及基于AADL 数据构件和ASN.1扩展属性集描述异构模型间的交互数据.
Fig.2 AADL multi-paradigm modeling framework图2 AADL 多范式建模框架
本文主要给出AADL 和SDL 混合建模及面向多核处理器平台的Ada 代码自动生成方法,主要涉及图2 中红色虚线标注的部分.
(1) 提出一种自底向上的AADL 与SDL 混合建模方法.首先,为了保证AADL 模型与SDL 模型交互数据的一致性,提出AADL-ASN.1 扩展属性集,以支持在AADL 模型中使用ASN.1 进行数据建模.其次,为了支持在AADL 模型中使用SDL 描述构件功能行为,提出AADL-SDL 扩展属性集,主要包括AADL 模型与SDL 模型间的接口映射、多线程调度、线程分发策略等相关属性,从而支持AADL 和SDL 的混合建模.
(2) 提出一种面向多核处理器平台的AADL-SDL 混合模型到Ada 多任务代码的生成方法.首先,基于AADL 体系结构模型生成对应的Ada 框架代码;其次,基于AADL 数据构件与AADL-ASN.1 属性集生成Ada数据类型代码;然后,基于AADL 构件与AADL-SDL 属性集生成Ada 运行时代码;最后,基于SDL 行为模型生成Ada 多任务代码,并将所有生成的代码进行集成.
(3) 基于AADL 开源建模工具Osate 与SDL 开源建模工具OpenGEODE[34]实现了AADL-SDL 混合建模工具ASCM 和Ada 多任务代码生成工具AS2MTA,并且使用实际的工业案例GNC 系统对本文所提方法进行评估.
本节主要对AADL-SDL 混合建模方法的具体内容进行详细介绍.首先,为了支持SDL 模型与AADL 模型间的数据交互建模,在第3.1 节给出AADL-ASN.1 交互数据属性集扩展.其次,在第3.2 节给出AADL-SDL 混合建模属性集扩展以支持将SDL 模型以自底向上的方式集成到AADL 架构模型中.
由于SDL 模型通过ASN.1 描述数据类型,在进行自底向上的AADL-SDL 混合建模的过程中,为了保证SDL模型与AADL 模型之间数据交互的一致性,本文提出AADL-ASN.1 交互数据属性集扩展以支持在AADL 模型中使用ASN.1 进行数据建模.该属性集主要包括对基本数据类型和复杂数据类型进行建模的相关属性.其中,基本数据类型包括整型(INTEGER)、实数(REAL)、布尔(BOOLEAN)和字符串(IA5String,UniveraslString,…)等;而复杂数据类型包括有序集合(ASN1_Sequence)、有序数组(ASN1_Sequence_of)、无序集合(ASN1_Set)和无序数组(ASN1_Set_of)等.
AADL-ASN.1 属性集扩展的主要属性见表1.
Table 1 The ASN.1 data properties表1 ASN.1 数据性质
其中,属性Is_Base_Type 支持与AADL 数据构件绑定,属性值的类型为aadlboolean,用于描述当前AADL构件是否为基本数据类型.属性的定义如下:
由于ASN.1 语法中支持通过数据范围定义数据类型,因此,在AADL-ASN.1 扩展属性集中增加了实数(浮点)取值范围Real_Value_Range、整数取值范围Integer_Value_Range、串长度String_Size、数组长度范围Sequence 等属性.具体定义如下:
ASN.1 支持的数据类型包括基本数据类型和复杂数据类型.具体定义如下:
属性Support_Data_Type 的类型为枚举类型,定义了AADL-ASN.1 属性集支持的所有ASN.1 数据类型,作为属性Data_Type 的属性值,与Data_Type 组合使用描述数据类型.例如,使用Support_Data_Type 中的元素ASN1_Boolean 为Data_Type 赋值,Data_Type=>ASN1_Boolean 定义了当前AADL 数据构件的类型为ASN.1 布尔类型.
除了使用Data_Type 定义数据类型,AADL-ASN.1 属性集还支持对4 种复杂数据类型进行详细描述.需要使用的属性定义如下:属性ASN1_Item 是一个record 类型,定义了复杂数据类型中的基本元素,即复杂数据类型中的成员变量.其中,ID_Value 定义的当前变量在有序集合(ASN1_Sequence)和有序数组(ASN1_Sequence_of)中的序号,如果是无序的结构,ID_Value 默认值为–1.Name_Value 定义当前变量的变量名,Type_Value 定义当前变量的类型,Default_Value 定义当前变量的默认值.属性ASN1_Sequence、ASN1_Sequence_of、ASN1_Set 和ASN1_Set_of 分别定义上述4 种复杂数据类型.其中,ASN1_Sequence 和ASN1_Set 的属性值的类型为list,list 中的元素为ASN1_Item.ASN1_Set_of 和ASN1_Sequence_of 的属性值为record,record 的成员item 类型为list 定义数组中的元素,成员Type_Value 定义数组中元素的类型,成员Count 定义数组中元素的个数,Type_Rename_To 定义引用类型.
在第3.1 节中主要介绍了AADL-ASN.1 交互数据属性集扩展,本节将给出AADL-SDL 混合建模属性集扩展的主要内容.在AADL-SDL 混合模型中AADL 构件的功能行为使用SDL 模型表达,SDL 功能行为模型在执行过程中的运行时属性通过AADL-SDL 混合建模属性集进行建模.属性集中主要包括SDL 模型运行时的分发策略、分发周期等运行时属性,数据构件的操作类型、访问权限属性,SDL 行为模型的相关属性等.AADL-SDL混合建模属性集扩展的主要内容见表2.
Table 2 Properties of the SDL model表2 SDL 模型相关属性
属性Connections_Types 定义AADL 构件间端口数据传输的类型,支持立即传输(immediate)和延迟传输(delay),属性定义如下:
属性Supported_Connection_Types 的类型为枚举类型,定义了两种支持的连接类型Immediate 和Delay,作为属性Connection_Types 的属性值.例如将Supported_Connection_Types 中的Immediate 赋值给属性Connections_Types,Connections_Types=>Immediate 定义立即传输的数据传输连接.
AADL-SDL 支持对周期(periodic)、偶发(sporadic)、非周期(aperiodic)等线程分发策略进行建模,具体使用到的属性如下:
属性Supported_Dispatch_Protocols 是枚举类型,作为属性Dispatch_Protocols 的属性值支持上述3 种分发策略.例如,Supported_Dispatch_Protocols 中的Periodic 定义了周期分发策略,Dispatch_Protocols=>Periodic 绑定的AADL 线程构件采用的就是周期分发策略.
属性Deadline 继承了AADL 的时间属性Time,描述AADL 线程的最长执行时间.例如,Deadline=>500ms,当前线程构件的最长执行时间为500ms.
属性Dispatch_Period 描述不同分发策略下AADL 线程构件的需要描述的时间片段.例如,AADL 线程构件绑定Dispatch_Period=>10ms,在周期分发策略下,定义了线程的分发周期为10ms.在偶发(sporadic)分发策略下,定义了相邻触发事件的最小时间间隔为10ms.
属性Period_Offset 定义了采用周期分发策略的线程的启动偏移时间.例如,在未设置当前属性的周期线程中,默认在系统启动时就启动线程.Period_Offset=>10ms 绑定的线程,在系统启动后延迟10ms 启动线程.
除了线程的分发过程,AADL-SDL 属性集还支持对数据的操作与访问类型.数据的操作类型包含保护数据(protected)与非保护数据(unprotected).数据的访问类型包括只读、只写和读写.属性的具体定义如下所示:
其中,属性Support_Operation_Kinds 与Support_Permissions 是枚举类型,分别定义属性Data_Kind 与Access_Permission 的属性值.例如,Data_Kind=>Protected、Access_Permission=>Read_Only 描述了当前AADL数据构件定义的数据为保护类型并且只读.
AADL-SDL 属性集定义了对SDL 模型的接口描述,以确保AADL 模型能够与SDL 模型的接口兼容.使用到的主要属性如下所示:
AADL-SDL 扩展属性集支持通过SDL system 实现AADL 构件的功能行为,通过SDL signal 实现数据交互.其中,属性Supported_Element_Types 定义了AADL 构件支持的SDL 元素,属性Element_Name 描述当前AADL构件对应的SDL 实现的名称,属性Element_Type 定义了当前构件在SDL 中实现为signal 或system,属性Source_Language 定义当前构件的具体实现.此外,如果AADL 中的数据传输过程含有参数,则使用属性Signal_Type 描述参数的类型.
AADL-SDL 混合模型的Ada 多任务代码生成主要包括两个部分:AADL 体系结构模型到Ada 多任务代码的生成和SDL 功能行为模型到Ada 多任务代码的生成.本节将详细介绍上述代码生成方法的具体内容.
AADL 模型到Ada 多任务代码的生成方法主要包括3 个部分.(1) AADL 结构模型到Ada 框架代码的生成方法;(2) AADL 数据构件到Ada 数据类型代码的生成方法;(3) AADL 线程构件到Ada 运行时代码的生成方法.
4.1.1 AADL 结构模型到Ada 框架代码的生成方法
AADL 结构模型主要由系统构件、进程构件、线程构件和子程序构件等多种构件组成.AADL 结构模型生成的Ada 框架代码主要包含多个Ada 过程(procedure)、函数(function)、任务(task)以及相互之间的调用过程.AADL 系统构件与进程构件对应Ada 代码中的过程,系统构件和进程构件中的特征(feature)、数据子构件(data subcomponent)和连接(connection)分别对应Ada 过程的形参、局部变量和保护对象.AADL 线程构件和子程序构件分别对应Ada 代码中的任务和函数.Ada 框架代码中每个Ada 过程、函数、任务只包含输入输出参数、局部变量声明与调用关系,不包含软件功能行为代码.
4.1.2 AADL 数据构件到Ada 数据类型代码的生成方法
AADL 数据构件生成Ada 数据类型代码的过程包括如下步骤:首先,AADL 数据构件通过绑定AADLASN.1 属性集对AADL-SDL 混合模型中使用的ASN.1 数据类型进行建模,得到AADL 数据模型;其次,通过AADL2ASN1 转换算法生成ASN.1 数据文件;然后,通过ASN.1 编译工具Asn1Scc[35]读取ASN.1 数据文件,并生成对应的Ada 数据类型代码.AADL 数据模型到ASN.1 数据文件的转换算法如下所示:
算法输入为AADL 数据模型AADL_Data,输出为ASN.1 数据ASN1_Data.首先获取AADL 数据模型中的全部属性data_properties(第4 行).通过函数setConfig 和setType 分别从属性中解析出ASN.1 数据的名称、ASN.1数据文件路径等配置信息和ASN.1 数据的类型,并赋值给ASN1_Data(第5 行~第6 行);其次,通过函数getIs_Base_Type 获取属性Is_Base_Type 的值(第7 行),判断当前数据是否为基本数据类型(第8 行).如果是基本数据类型,则通过函数setID、setRange 和setValue 分别获取ASN.1 数据的编号、范围和默认值,并赋值给ASN1_Data(第8 行~第11 行).如果不是基本数据类型,则通过函数getSubDatas 获取复杂数据类型所有的成员变量,并存入链表subdatas 中,遍历链表subdatas,对链表中每个元素递归调用算法AADL2ASN1,并将返回值添加到ASN1_Data 的成员变量中(第12 行~第18 行).最后,返回ASN.1 数据ASN1_Data.
4.1.3 AADL 线程构件到Ada 运行时代码的生成方法
AADL 线程构件生成的Ada 代码主要包括两部分:Ada 运行时代码和Ada 任务执行代码.其中,Ada 任务执行代码通过SDL 行为模型生成(详见第5.2 节),因此本节主要介绍Ada 运行时代码的生成.
根据第4.4 节中对AADL-SDL 属性集的介绍,本文提出的AADL-SDL 混合建模方法中,主要支持AADL周期调度、偶发调度和非周期调度这3 种线程调度策略.
Ada 运行时代码生成主要采用Ada 语言提供的generic 机制,即提供一种参数化模板的方式来定义Ada 运行时代码模板.本节主要考虑Ada 运行时代码的生成过程,具体任务功能通过调用SDL 模型生成的SDL_procedure 来实现.
AADL 周期线程调度策略生成对应的Ada 周期任务代码模板APTCT(Ada periodic task code template)见表3.AADL 线程通过属性 Dispatch_Protocols=>Periodic 定义当前线程的分发策略为周期性分发,通过属性Dispatch_Period=>TIME(ms)定义当前线程的周期.TIME 用来表示时间数值.例如,绑定属性Dispatch_Protocols=>Periodic 与Dispatch_Period=>20ms 的AADL 线程对应的Ada 任务通过时间触发执行,以20ms 为周期,每隔20ms 触发1 次.
周期性任务代码模板的主要参数包括变量与过程.例如,变量Task_Period 表示任务执行周期.过程SDL_procedure 为SDL 行为模型生成的Ada 任务执行过程代码,通过关键字in/out 设置Ada 任务执行过程的传入传出参数.
Table 3 Ada periodic task code template (APTCT)表3 Ada 周期任务代码模板
AADL 偶发线程调度策略对应的Ada 偶发任务代码模板见表4.AADL 线程通过属性Dispatch_Protocols=>Sporadic 定义当前线程的分发策略为偶发,通过属性 Dispatch_Period=>TIME(ms);规定了任务连续分发(dispatch)的最小时间间隔为TIME(ms).例如,绑定属性Dispatch_Protocols=>Sporadic 与Dispatch_Period=>20ms的AADL 线程对应的Ada 任务通过接收外部参数或者队列内参数触发执行,即如果队列不为空,那么读取队列内数据并触发过程;如果队列为空,接收到外部数据,那么读取外部数据并触发任务.并且,由于属性Dispatch_Period=>20ms 规定了触发最小时间间隔为20ms,即每次任务执行结束后,需要等待20ms 才能从队列或者外部读取下一个数据并触发任务.
Ada 偶发任务代码模板ASTCT(Ada sporadic task code template)与Ada 周期任务代码模板不同,首先,Ada偶发任务的阻塞发生在任务体中,通过调用函数Wait_For_Incoming_Events 监听端口是否有事件到达;其次,计算最小到达间隔时间Minimal_Inter_Arrival 来确保相连相邻任务分发之间存在最小时间间隔.
Table 4 Ada sporadic task code template (ASTCT)表4 Ada 偶发任务代码模板
AADL 非周期线程调度策略对应的Ada 非周期任务代码模板AATCT(Ada aperiodic task code template)见表5.
Table 5 Ada aperiodic task code template (AATCT)表5 Ada 非周期任务代码模板
AADL 线程通过绑定属性Dispatch_Protocols=>Aperiodic 定义当前线程的分发策略为非周期,非周期调度没有时间属性.例如,绑定属性Dispatch_Protocols=>Aperiodic 的AADL 线程对应的Ada 任务在执行过程中通过接收外部参数或者队列内参数触发执行,通过参数触发执行的过程与偶发调度相同,不同的是偶发调度设置了触发最小时间间隔,而非周期调度没有.非周期任务只要接收外部参数或者队列不为空就会触发执行.
Ada 非周期任务模板和偶发任务模板的主要区别是,前者生成的代码中没有最小到达间隔时间Minimal_Inter_Arrival 的限制,当Wait_For_Incoming_Events 监听到事件时,就触发当前线程,执行当前线程的功能任务.
通过对上述Ada 任务代码模板设置不同的参数,实现Ada 任务代码的生成,对于多个任务间的数据交互,使用Ada 队列代码模板AQCT(Ada queue code template)实现不同任务间的数据交互,将队列创建为Ada 保护类型(protected),以支持多任务调用,Ada 队列对应的代码模板声明如下所示:
其中,queue_size 定义当前队列容量;Signal_Type 通过参数化的方式定义队列中元素的类型;通过进入点put,get 实现入队出队操作,put 和get 参数s为队列中的元素,t为入队出队延迟时间,通过设置参数t的值,支持在周期不同的任务之间进行数据交互;Initialize 实现队列的初始化操作;Size 获取当前队列中的元素个数.
欧空局ESA 开发的OpenGEODE 开源工具支持从SDL 模型中生成串行Ada 代码,在此基础上,我们提出面向多核的SDL 多任务代码生成方法.如图3 所示,首先,将SDL 系统结构(system 和block)转换为Ada 多任务框架代码;其次,将SDL 块结构(block)之间的异步通信(无延迟/延迟)转换为基于Ada 非延迟/延迟队列的通信机制,从而支持目标多任务通信;最后,基于分别编译技术,利用OpenGEODE 将SDL 块中的进程和过程层编译为目标Ada 代码.
首先,图3 深色部分给出了SDL 系统结构到Ada 多任务框架内代码的生成.如表6 所示,SDL system 构件转换为Ada procedure,其中,SDL 模型与环境的交互转换为procedure 中的参数,以支持被AADL 模型生成的Ada线程所调用.而SDL 中层次化的Block 结构,将转换为对应的嵌套Ada Task 结构.
Table 6 Ada code generated from SDL system structure表6 SDL 系统结构生成方法
其次,SDL 异步通信转换方法包括非延迟通信和延迟通信(如图3 红色部分所示).对于SDL 非延迟通信,本文采用Ada 队列的方式实现SDL 不同块间采用异步通信机制,具体实现见表7:异步队列(asyn_queue)定义为保护类型,以保证并发调用入队/出队(put/get)操作过程的正确性.
对于延迟通信,由于实际的延迟取决于真实物理环境(网络、线路)中的约束,因此仅定义出队和入队操作.为了方便后续案例的分析与实验,本文通过对出队操作进行随机设置延迟时间访问,从而实现仿真延迟通信.具体实现见表7,包含参数传入和随机值设置两种方式,其中,RandomGenerator 函数用于生成随机延迟时间(默认范围为0~10s),delay 表达式用于设置延迟出队操作.
Fig.3 Ada multi-task code generated from SDL图3 SDL 到Ada 多任务代码生成
Table 7 Ada queue code template表7 Ada 队列代码模板
最后,对于 SDL 模型中的功能行为(由 process 和 procedure 组成,如图 3 青色部分所示),本文利用OpenGEODE 已有串行Ada 代码生成功能,自动生成对应的Ada procedure,并根据通信类型将其对应接口和异步通信队列操作相关联,其中,输入对应出队操作,输出对应入队操作.
原型工具主要包含两部分:AADL+SDL 混合建模工具ASCM(AADL and SDL co-modeling tool)和多任务Ada 代码生成工具AS2MTA(AADL and SDL to multi-task Ada code generator).
ASCM 支持AADL+ASN.1 和AADL+SDL 的混合建模功能,支持ASN.1 数据文件的生成.ASCM 工具整体框架如图4 所示.
Fig.4 The structure of ASCM图4 ASCM 工具结构
ASCM 支持AADL 软件体系结构建模、ASN.1 数据建模和SDL 功能行为建模,并通过ASN.1 属性集和SDL属性集实现AADL 体系结构模型、ASN.1 数据模型和SDL 功能行为模型这3 种模型的集成,最终实现AADLSDL 的混合建模.其中,对于AADL 体系结构建模ASCM 使用RNL2AADL[36]支持从RNL(restricted natural language)到AADL 架构模型的自动生成.
AS2MTA 支持AADL 模型到Ada 代码框架的生成、SDL 模型到Ada 行为代码的生成以及Ada 代码框架与Ada 行为代码的集成,AS2MTA 工具的整体框架如图5 所示.
AS2MTA 主要分为5 个部分.
1) AADL2Ada:基于Ada 代码生成工具AADL2Ada,AS2MTA 支持AADL 软件体系结构模型生成Ada 代码框架.
2) ASN2Ada:基于开源ASN.1 编译工具Asn1Scc,AS2MTA 支持ASN.1 数据类型生成Ada 数据定义代码.
3) SDL2Ada:基于开源SDL 建模工具OpenGEODE,AS2MTA 支持SDL 模型到Ada 任务行为代码的生成.
4) AS2MTA 支持ASN.1 属性集与AADL 数据构件生成Ada 数据访问接口,以支持Ada 数据定义代码的外部调用.
5) AS2MTA 支持SDL 属性集与AADL 构件生成Ada 运行时代码,以支持Ada 框架代码对多个Ada 任务行为代码的多任务调度.
Fig.5 The structure of AS2MTA图5 AS2MTA 工具结构
ASCM 与AS2MTA 通过Java 实现,工具的具体模块与代码规模见表8.
Table 8 Statistics of tool implementation表8 工具实现数据统计
工具的主要特点包括:
(1) 建模方面:ASCM 工具基于AADL 开源建模工具Osate 进行功能扩展,集成了SDL 开源建模工具OpenGEODE,提供了AADL-SDL 混合建模平台;扩展了AADL-ASN.1 属性集和AADL-SDL 属性集,并集成到ASCM 工具中,支持ASN.1 属性集与AADL 数据构件到ASN.1 数据文件的自动生成与同步,简化了ASN.1 数据模型的建模过程,并保证AADL 模型与SDL 模型交互数据的一致性.
(2) 代码生成方面:AS2MTA 基于Ada 代码生成工具AADL2Ada 进行功能扩展,集成了ASN.1 开源编译器Asn1Scc 与SDL 开源建模工具OpenGEODE,支持AADL-SDL 混合模型到多任务Ada 代码的生成.
(3) 系统应用方面:与实际工业界合作,使用ASCM 工具对GNC 系统进行了AADL-SDL 混合建模,并使用AADL-SDL 混合模型通过AS2MTA 工具生成对应的多任务Ada 代码.
本节将使用AADL-SDL 混合建模工具ASCM 和多任务Ada 代码生成工具AS2MTA 对实际的工业界案例进行AADL-SDL 混合建模与多任务Ada 代码生成.并且,在仿真环境下对生成的多任务Ada 代码进行运行测试,并与前期研究进行对比分析.最后,结合对比分析结果对本文方法的有效性进行分析评估.
导航、制导与控制系统GNC(guidance navigation &control)主要负责航天器姿态和轨道确定与控制.GNC由导航传感器(例如,导航相机、星敏传感器、陀螺仪和加速度计)、姿态轨道控制系统AOCS(attitude and orbit control system)和执行器(例如,反作用飞轮、喷嘴和发动机)组成.其中,AOCS 主要负责执行轨道确定、轨道控制、姿态确定和姿态控制等任务.此外,通常需要在导航传感器和AOCS 之间添加一个数据处理单元DPU(data processing unit),用来对导航传感器发送的数据进行预处理.图6 所示为GNC 系统的简化框图.
Fig.6 GNC system structure图6 GNC 系统结构
为了方便介绍本文所提出的方法,我们主要以AOCS 为例,详细介绍AADL-SDL 混合建模方法和Ada 多任务代码生成方法.AOCS 系统主要包括姿态确定、姿态控制、轨道计算和轨道控制等9 个模块,总计124 个子模块和21 种计算模式.
AADL-SDL 混合建模过程主要分为4 个部分.
(1) 基于SDL 对子系统的功能行为建模.
(2) 基于AADL-ASN.1 交互数据属性集对系统中的交互数据进行建模.
(3) 基于AADL 对系统体系结构进行建模.
(4) 基于AADL-SDL 混合建模属性集将SDL 功能行为模型与对应的AADL 构件进行集成.
6.2.1 基于SDL 的功能行为建模
以AOCS 系统中轨道计算模块的轨道根数计算(Orbital_Elements_Calculation)为例,详细介绍SDL 功能行为建模过程.轨道根数计算的输入参数包括轨道倾角、轨道角速度、航天器当前时钟、地面注入时间、轨道递推初始值等,其计算过程包括长期项计算(Long_Term_Calculation)、短周期项计算(Short_Period_Term_Calculation)、平根数计算(Mean_Orbit_Elements_Calculation)和瞬根数计算(Instantaneous_Elements_Calculation)等.对应的SDL 模型结构如图7 所示.
首先,使用ASN.1 标准对轨道根数计算过程的数据进行建模,以轨道倾角i_0 为例,轨道倾角的数据类型为浮点数,范围为0~180 的闭区间.因此,定义范围在0~180 之间的浮点数类型FLOAT_::=REAL(0..180),并使用该浮点数类型定义轨道倾角i_0:=FLOAT_.其次,使用SDL 信号(signal)将轨道倾角数据从SDL 系统传递到SDL功能块中.轨道倾角的SDL 信号的定义为signal i_0(FLOAT_),参数的类型与轨道倾角的类型相同.然后,定义读取轨道倾角并进行相关数值计算的SDL 功能块roq,并将signal i_0(FLOAT_)作为roq 功能块的输入信号之一.最后,在roq 功能块内定义roq 参数计算的SDL 进程,并在SDL 进程内部定义具体计算行为.
6.6.2 基于AADL-ASN.1 交互数据属性集的交互数据建模
在AADL-SDL 混合建模过程中,通过AADL-ASN.1 交互数据属性集描述异构模型间的交互数据.本节以AOCS 控制系统中的轨道根数为例,详细介绍AADL-SDL 混合模型中数据类型的建模过程.轨道根数主要包含轨道倾角(Orbital_Inclination)、升交点黄经(Longitude_Of_The_Ascending_Node)、离心率(eccentricity)、近日点辐角(Argument_Of_Perihelion)、半长轴(Semi_Major_Axis)和平近点角(Mean_Anomaly)这6 个必要参数.其中,轨道倾角、升交点黄经、近日点幅角和平点近角描述的数据使用ASN1_Real 进行建模,其角度范围为0~180的闭区间.以轨道倾角数据为例,对应的AADL 数据构件定义如下所示:
离心率对应的数据构件的数据类型为浮点数,使用ASN1_Real 进行建模,且离心率的范围为0~1.因此,为属性Asn1_Properties::Real_Value_Range 赋值为0.0..1.0.半长轴对应飞行器运行轨道的半长轴,数据类型也为浮点数.离心率和半长轴对应的AADL 数据构件定义如下:
轨道根数数据构件(Orbital_Elements)的类型为包含6 个元素的无序集合,通过绑定属性Asn1_Properties::Base_Type=>ASN1_Set 与Asn1_Properties::ASN1_Set 对Orbital_Elements 的内部结构进行建模,对应的AADL数据构件定义如下:
6.2.3 基于AADL 的系统体系结构建模
本节主要介绍AOCS 系统的AADL 体系结构模型,如图8 所示.
Fig.8 AADL architecture model of AOCS system图8 AOCS 系统体系结构模型
AOCS 系统的体系结构模型包括AADL 系统构件(AOCS_Init).在AOCS_Init 构件中定义姿态确定子系统构件(Pose_Check_Init)、姿态控制子系统构件(Pose_Control_Init)、轨道计算子系统构件(Orbit_Calculate_Init)和轨道控制子系统构件(Orbit_Control_Init).Orbit_Calculate_Init 构件中定义轨道根数计算对应的AADL 线程构件Orbital_Elements_Calculation;然后,使用AADL 数据构件与AADL-ASN.1 属性集扩展对各个子系统间的交互数据进行建模(见第4.2 节);最后,使用AADL-SDL 属性集扩展将Orbital_Elements_Calculation与轨道根数计算过程的SDL 模型进行关联(见第4.3 节).
此外,AOCS 系统的各个子系统构件中的不同功能模块可采用不同计算模型表达功能行为,并通过扩展属性集的方式实现多种异构构件与AADL 体系结构模型的集成.例如,针对具有较多数据流计算特征的构件使用同步语言SIGNAL 建模(如,姿态控制子系统中的消除偏模块[28,29]);针对具有较多控制流特征的构件,可以使用AADL Behavior Annex 的状态机进行描述;对于部分构件,可以重用已有的C/Ada 代码描述;对于具有异步行为特征的构件,可以使用SDL 进行建模(如,轨道根数计算模块).
6.2.4 AADL-SDL 模型集成
本节以AOCS 系统的轨道根数计算过程为例详细阐述基于AADL-SDL 混合建模属性集的AADL-SDL 模型集成过程.首先,通过需求文档获取轨道根数的计算过程的相关参数与具体的计算行为细节;其次,以第4.3 节中的轨道根数数据构件Orbital_Elements 作为轨道根数计算过程的输入参数,对航天器运行过程中的轨道瞬根数、平根数等参数进行周期性的迭代计算,平均执行周期为1.5s.
其中,AADL 子程序构件OE_Msg 用来描述轨道根数计算构件与其他AADL 线程构件间的数据交互.交互数据的类型为Orbital_Elements,属性Source_Language=>SDL 和Element_Type=>signal 定义当前subprogram 构件对应SDL 模型中的signal.OE_Msg 定义如下:
轨道根数计算过程对应的AADL构件Orbital_Elements_Calculation 其主要结构如下所示.首先,子程序构件OE_Msg 定义了Orbital_Elements_Calculation 的输入输出端口in_msg 和out_msg;其次,属性Signal_Name 描述了对应的SDL 行为模型的输入输出端口为OEC_In 与OEC_Out;然后,属性dispatch_Protocols=>Periodic 和Dispatch_Period=>1500ms 描述了当前线程为周期线程,周期大小为1 500ms.Orbital_Elements_Calculation 的详细定义如下所示:
6.3.1 Ada 框架代码和数据类型代码的生成
首先,基于Ada 代码生成工具AADL2Ada 生成对应的Ada 代码框架.然后,基于ASN.1 开源编译工具Asn1Scc 生成Ada 数据类型代码.AOCS 系统对应的代码整体结构如图9 所示,其中,system_satellite_attitude_orbit_control_init_impl 为顶层系统,包含功能函数库(system_commonfunc_init)、主控系统(system_ctrl_process_init)、轨道计算(system_obtcalmain_init)、轨道控制(system_obtctrl_init)、姿态确定(system_poscheck_init)和姿态控制(system_posctrl_init)这6 个子系统和数据类型定义(dataview-uniq).其中,主控系统(system_ctrl_process_init)中还包含8 个子功能模块.
Fig.9 Ada framework code for AOCS图9 AOCS 系统Ada 框架代码
6.3.2 Ada 运行时代码生成
本节结合第4.1.3 节给出的Ada 运行时代码的生成过程,以Orbital_Elements_Calculation 为例进行AADLSDL 混合模型到多任务Ada 代码的生成.轨道根的计算过程属于周期执行过程,因此,AS2MTA 选用第4.1.3 节中提到的Ada 代码模板APTCT 进行代码生成工作,由于轨道根计算过程的执行周期为1 500ms,因此,APTCT的参数设置可见表9.
Table 9 The parameters of Ada runtime code template in Orbital_Elements_Calculation表9 轨道根计算过程的Ada 运行时代码模板参数设置
通过Ada 代码模板生成对应的运行时代码,通过队列模板生成各个任务间的交互代码.图10 展示了多个Ada 任务通过Ada 队列代码进行任务间的交互过程,AADL 模型中包括轨道根数计算线程在内一共n个线程构件.以Orbital_Elements_Calculation 线程构件与T2 线程构件为例,Orbital_Elements_Calculation 构件通过Ada周期任务代码模板APTCT 生成对应的Ada 周期任务代码Orbital_Elements_Calculation_a.T2 构件生成对应Ada周期任务代码T2_a.Orbital_Elements_Calculation 构件与T2 构件之间的交互数据OE_Msg 通过Ada 队列代码模板AQCT 生成Orbital_Elements_Calculation_a 与T2_a 进行交互的队列代码OEC_2_T2_Queue.
Fig.10 Ada runtime code图10 Ada 运行时代码
6.3.3 SDL 模型到多任务代码生成
本节以第6.2.1 节轨道根数计算SDL 行为模型为例,详细介绍SDL 行为模型到Ada 多任务代码的生成过程.轨道根数计算SDL 行为模型分别对应于编译后的部分目标Ada 代码,见表10.
Table 10 Multi-tasking Ada code from SDL表10 SDL 多任务Ada 代码
其中,Ada 过程Orbital_Elements_Calculation 根据SDL 模型中system 组件生成,其参数列表根据SDL 模型与环境交互方向分别使用关键字in 和out 进行标注.Orbital_Elements_Calculation 过程中包括25 个Ada task,分别根据源SDL 模型中的block 组件生成.对于不同块之间的异步通信,根据输入信号对应的块名声明对应的延迟队列.对于块中的具体功能,基于OpenGEODE 生成对应的Ada 目标代码.以AQ 块与U_块为例,U_过程为U_task 的计算部分,由OpenGEODE 生成.此外,U_task 中还包括两类特殊的Ada 过程:RI_U_和PI_AQ,其中,PI_U_负责从DP 块对应的延迟队列中取数据,而RI_AQ 负责将计算结果放入AQ 块对应的延迟队列中.
首先,使用SDL 对AOCS 系统的软件功能模块内部行为进行建模.SDL 模型的统计数据见表11.
Table 11 SDL model statistics of AOCS system表11 AOCS 系统SDL 模型统计
其次,使用限定自然语言生成AADL 工具RNL2AADL[36],通过自然语言需求模板对AOCS 系统自然需求文本中的软件架构信息进行抽取,并通过抽取的软件架构信息生成AADL 系统体系结构模型,体系结构模型主要包括4 个主系统和309 个软硬件构件,其中主要包括1 个顶层系统构件、4 个一级子系统构件、125 个二级子系统构件、72 个3 级子系统构件、259 个子程序构件、632 个线程构件.除了描述系统结构的构件外,还包括148 个数据构件,主要对整个系统中各个构件之间进行通信交互的数据报文建模;1 146 个数据访问连接;902 个外部过程访问连接.AADL 软件体系结构模型的统计数据见表12.
Table 12 The statistical data AADL model of AOCS system表12 AOCS 系统AADL 模型统计
最后,通过AADL-SDL 扩展属性集实现上述SDL 功能行为与AADL 体系结构模型的集成.
在第2 节中,我们提出了AADL 及行为附件BA、同步语言Signal、SDL、Simulink、C、Ada 的多范式建模总体框架,本文主要研究AADL 和SDL 混合建模方法.通过和工业界的合作与确认,这里选用适用范围、生成代码特征等指标对AADL-SDL、AADL-BA[37]、AADL-Signal[28,29]这3 种混合建模方法进行评价,分析结果见表13.
Table 13 The comparison and evaluation of AADL-BA,AADL-Signal,AADL-SDL表13 AADL-BA、AADL-Signal、AADL-SDL 混合模型对比评估结果
如表13 所示,AADL-BA、AADL-Signal 与AADL-SDL 混合建模方法的对比分析结果如下.
(1) 适用范围:在通过混合模型进行代码生成的过程中,AADL-BA 通过自动机模型生成代码,代码生成过程采用的编程策略以系统的状态变化为核心,生成代码适用于需要进行频繁状态切换的反应式系统.AADLSignal 通过数据流等式描述数值的计算过程,具有同步并发的描述语义,适用于对系统中数值计算的算法与同步调度算法进行建模与代码生成.如航天嵌入式系统中的轨道计算、姿态计算等相关算法.AADL-SDL 侧重于描述系统实现过程的流程控制与异步行为,可以清晰地展示出系统不同功能模块间的流程划分,实现代码的解耦,提升各部分代码的复用性.
(2) 生成代码特征:针对AADL-BA 混合建模,由于BA 将系统行为抽象为状态与状态迁移.生成代码中引入了状态机结构,适合对软件行为中的状态变换行为进行建模.针对AADL-Signal 混合建模,Signal 采用数据流等式的方式进行建模,模型抽象程度较高,适用于对软件行为中数值计算相关的算法内容进行建模.针对AADLSDL 混合建模,SDL 支持对系统行为中的业务流程与异步控制进行建模.可以准确、清晰地描述出软件行为中的流程控制行为.
对比分析结果,正是体现了安全关键异构软件系统需要进行多范式建模的必要性.AADL-BA、AADLSignal 及AADL-SDL 混合建模方法能够较完整地支持安全关键异构软件系统的建模要求.
6.5.1 与AOCS 已有代码对比分析
首先,针对AOCS 系统AADL-SDL 混合模型,基于AS2MTA 进行多任务的Ada 代码生成,并且,选取生成代码规模和代码运行时间两个指标来对本文所提出的方法进行评估.针对这两个指标,我们分别选取AOCS 系统源代码和AS2MTA 生成代码在多核仿真环境下进行实验结果统计,其中,AOCS 系统源代码的相关实验由实际工业界进行,并为我们提供处理后实验结果数据.实验具体结果见表14.
通过表14 中的数据可知,AS2MTA 生成的代码规模比AOCS 系统源码要大,主要原因包括:(1) 生成多任务运行时;(2) 本文的代码生成方法还未包含编码策略的优化等过程.
Table 14 The test results of generated code (I)表14 生成代码运行测试结果(I)
AS2MTA 生成的代码的平均执行时间与AOCS 系统源码的平均执行时间的数据统计情况如图10 所示.
Fig.11 Average code execution time图11 代码平均执行时间统计
通过分析表14 和图10,我们得出AS2MTA 生成的代码的平均执行时间与AOCS 系统源码的平均执行时间对比分析结果.相较于单核仿真环境下AS2MTA 的生成代码,多核仿真环境下的生成代码平均执行时间有所提升.但是,与AOCS 系统源码相比,在运行代码体量较大的情况下,AS2MTA 生成多任务代码的运行时间较短.但在运行代码体量较小的情况下,AOCS 系统源码的执行时间较短.造成这种现象的主要原因可能是,虽然并发运行多任务代码会提升运行速率,但是创建多任务的过程会占用部分时间,在运行代码体量较小的情况下,创建多任务的时间占用了大部分的运行时间,描述功能逻辑的代码实际运行时间只占用了运行时间的一小部分,代码的并行执行对代码运行效率产生的提升效果无法弥补创建任务对代码运行效率产生的降低效果,导致多任务代码的运行效率低于AOCS 系统源代码的运行效率.在运行代码体量较大的情况下,描述功能逻辑的代码实际运行时间远大于任务创建时间,则创建任务对代码运行效率产生的影响就可以忽略不计,并行代码的运行效率就会高于源代码的运行效率.未来,我们将对AS2MTA 的生成代码进行优化.
6.5.2 与AADL-BA、AADL-Signal 生成代码对比分析
本节针对代码规模和代码运行时间两个指标,分别选取前期研究中 AADL-BA 混合模型生成代码与AADL-Signal 混合模型生成代码和AS2MTA 生成代码在仿真环境下进行实验.实验具体结果见表15.
Table 15 The test results of generated code (II)表15 生成代码运行测试结果(II)
AADL-BA 生成代码、AADL-Signal 生成代码的平均执行时间与AS2MTA 生成代码的平均执行时间的数据统计情况如图11 所示.
Fig.12 Average code execution time图12 代码平均执行时间统计
通过分析表15 和图11,AS2MTA 生成的代码的平均执行时间与AADL-BA 和AADL-Signal 生成代码的平均执行时间对比分析结果如下.
1) 单核仿真环境下的平均执行时间:AS2MTA 生成代码相较于AADL-BA 与AADL-Signal 的生成代码的平均执行时间,是最短的.在单核仿真环境下运行,多任务并发对代码执行效率的提升影响较低,影响代码运行效率的主要因素为代码结构.AADL-BA 为所有生成代码引入状态机结构,对于功能行为中的状态变换,通过状态机代码可以提升运行效率,对于不适用状态机的功能行为,则由于状态机代码的结构复杂而降低了代码的执行效率,因此,AADL-BA 的平均执行时间最长.AADL-Signal 侧重于考虑数值计算行为中的并发,运行测试也只针对于数据计算的代码实现过程,因此,相较于AADL-BA 代码的平均执行时间有所降低.AADL-SDL 侧重于多个控制流程间的并发,在单核仿真环境下,AADL-Signal 与AADL-SDL 生成代码的平均执行时间没有明显差距,AADL-SDL 相较于AADL-BA,由于代码生成结构的优化,缩短了代码的平均执行时间.
2) 多核仿真环境下的平均执行时间:相较于单核仿真环境,多核仿真环境下3 种建模方法的生成代码运行效率都有所提升.与前期研究相比,AS2MTA 生成代码的平均执行时间最短,运行效率最高.并且,通过分析图10可知,AADL-Signal 侧重于数据计算过程的并发行为,姿态确定和轨道计算两个模块的主要内容是航天器各种姿态参数与轨道参数的计算过程.因此,在姿态确定和轨道计算两个模块中,AADL-Signal 生成代码的运行效率较高,AS2MTA 生成代码的运行效率没有明显提升.但是,姿态控制与轨道控制模块的主要职责是根据参数对航天器的姿态与轨道进行调整,代码结构以流程控制为主,因此,相较于AADL-Signal,使用AS2MTA 生成代码的执行效率有明显提升,代码平均执行时间大幅度缩短.
本文的相关工作主要包括3 个方面:多范式建模、混合建模和基于模型的代码生成.
Vangheluwe 在文献[4]中介绍了多范式建模与仿真,并将多范式建模的研究方向分为3 个部分:(1) 多形式化建模,涉及到描述的不同形式化模型之间的耦合和转换.(2) 模型抽象,涉及到不同抽象级别上模型之间的关系.(3) 元建模,描述模型的模型.
Mosterman 在文献[5]中将Vangheluwe 描述的多范式建模方法的3 个研究方向抽象为多范式建模的3 个维度:多抽象、多形式化和元模型.并且,基于这3 个维度引入了领域独立的多范式建模框架,通过一个混合动力系统的案例,描述了多范式建模方法的统一框架.
Morozov 将多范式建模方法应用在信息物理系统CPS(cyber-physical systems)中[38],使用UML 定义了CPS系统的元模型,并使用汽车喷漆的案例概述了元模型的使用过程.
Blouin 提出了一种对嵌入式系统架构模型进行定量分析的多范式建模语言QAML(quantitative analysis modeling language)[39],QAML 通过利用AADL、SysML、MARTE、AUTOSAR 等多领域建模语言对嵌入式系统架构模型进行定量分析.
Blouin 和Borde 在文献[40]中提出AADL 作为一种多范式建模语言,由于具有可以扩充其他形式语义的特性,因此可以作为系统多范式建模方法的核心.同时,介绍了ADL 在MPM4CPS 中的应用,并使用一个机器人案例说明AADL 多范式建模的具体用法,描述了自顶向下以AADL 架构模型为中心组合使用SysML、MARTE和UML 等模型,从需求分析开始,然后进行系统设计、设计分析和验证,最后自动生成代码的设计流程.
SysML[7]作为一种针对系统工程领域的图形化建模语言,侧重于复杂系统的整体架构.适合在系统开发生命周期的初期对系统进行需求捕获、边界定义、逻辑架构设计等,由于缺乏形式语义,在系统详细设计与实现阶段的应用较少.AADL 基于构件对软件体系结构进行建模,提供进程、线程、子程序、处理器、外部设备等多种构件,适合在系统开发生命周期后面的阶段进行详细的设计和具体实现.本文提出的混合建模方法主要面向多任务Ada 代码生成工作,需要对系统详细设计以及实现细节进行建模,因此,本文使用AADL 对系统体系结构进行建模.
多领域的模型集成作为一种多范式建模方法,不同领域建模语言之间的混合建模过程是多领域的模型集成的重要组成部分.AADL 主要通过扩展附件和混合建模实现多领域的模型集成.
AADL 目前支持Behavior Annex[18]通过集成时间自动机模型对软件行为中的状态控制进行描述;BLESS Annex[41]则在Behavior Annex 的基础上为自动机添加BLESS Assertions,使其支持自动化的推理证明.Error Model Annex[32]通过集成故障属性、故障概率等故障模型对软件行为中的失效事件进行描述;Hybird Annex[19]通过集成Hybrid CSP 对系统物理层的连续行为进行描述.
Zhan 提出了AADL 与Simulink/Stateflow 混合建模方法[20],相较于Hybrid Annex 对系统物理层连续行为的描述,Zhan 使用Simulink/Stateflow 描述AADL 系统体系结构模型中物理层的连续行为,通过contract 对AADL物理层构件进行约束.
Ouni 使用AADL 与Capella 进行混合建模[42],通过INGEQUIP 保持交互信息在不同模型间的一致,通过Capella 描述系统设计初期的功能需求、非功能需求以及平台约束,并将Capella 模型集成到AADL 模型中,组合两种模型进行调度分析、行为验证、结构验证等工作.
欧空局ESA 提出AADL、Simulink、SDL 的多范式建模方法TASTE[23-25],TASTE 通过AADL 部分子集描述系统体系结构,并通过TASTE 扩展属性集将AADL 系统体系结构模型与Simulink、SDL 等行为模型进行集成.通过集成代码生成工具Ocarina[43]进行基于AADL 模型的代码生成.通过集成Simulink Coder、Qgen、OpenGEODE 等工具实现Simulink、SDL 等行为模型代码的生成.TASTE 基于OpenGEODE 实现SDL 模型到Ada 代码的生成,目前主要支持串行Ada 代码自动生成和集成.本文结合TASTE 的工作,使用分别编译技术实现了SDL 行为模型到多任务Ada 代码的自动生成与调度,并且支持与AADL 模型生成Ada 代码进行集成.
Baouyaa 使用TASTE 工具集对火车控制系统进行建模[44],使用AADL 描述系统体系结构,使用SDL 描述系统行为,并对铁路系统的相关性质进行了验证.
在面向安全关键软件的AADL 多范式建模的前期研究中[28,29],我们基于同步语言Signal 对AADL 语义进行了扩展,使用Signal 对AADL 模型中的并发行为进行了描述,并支持AADL-Signal 混合模型到多任务代码的生成.本文基于SDL 进一步扩展了AADL 语义,对软件系统中的异步行为进行了描述,并且实现了AADL-SDL到多任务Ada 代码的生成.
本文提出一种AADL 和SDL 混合建模方法,支持以自底向上的方式对安全关键软件系统进行混合建模,并给出面向多核处理器平台的代码自动生成方法.首先,提出AADL 与SDL 混合建模方法,包括AADL-ASN.1和AADL-SDL 扩展属性集方法.其中,AADL-ASN.1 扩展属性集主要用于描述混合模型中不同构件间的数据类型,AADL-SDL 属性集用于支持在AADL 体系结构模型中集成SDL 模型对应的功能行为.其次,提出面向多核处理器的AADL-SDL 混合模型到Ada 多任务代码生成方法,包括框架代码、数据类型代码、运行时代码以及多任务功能代码的自动生成.然后,基于AADL 开源建模工具Osate 实现了AADL-SDL 混合建模工具ASCM 和多任务Ada 代码生成工具AS2MTA,并且使用实际工业案例对本文所提方法的有效性进行了分析.
在未来的工作中,我们将进一步开展以下3 个方面的研究工作.
1) 工具扩展方面:目前的代码生成工作依赖于开源SDL建模工具OpenGEODE,因此,AADL-SDL 混合模型中采用的SDL 标准与OpenGEODE 工具保持一致,SDL 标准目前已经更新到SDL 2010,未来考虑开发支持SDL 2010 标准的SDL 建模工具,并实现ASCM 和AS2MTA 到SDL 2010 的移植.
2) 组合验证方面:研究AADL-SDL 混合模型的形式化组合验证方法.由于混合模型中存在异步通信,因此需考虑与异步通信有关的形式化验证.
3) 生成代码的智能优化方面:面对复杂编程场景有时需要依靠编程人员的经验灵活选择编程策略,未来将研究基于人工智能的编程策略自动优化.