面向IMA的AADL多范式建模及代码自动生成方法
2021-02-28杨志斌王铁鑫
邱 宝,杨志斌,周 勇,谢 健,王铁鑫,郭 鹏
1(南京航空航天大学 计算机科学与技术学院,南京 211106) 2(高安全系统的软件开发与验证技术工信部重点实验室,南京 211106) 3(航空工业计算所,西安 710065)
1 引 言
安全关键系统(Safety-Critical System)[1]是指应用于航空、航天、交通、能源等领域的复杂嵌入式系统,且其运行情况可能引起系统处于危险状态,从而导致重大财产损失、环境破坏或者人员伤害.航空电子系统就是一类典型的安全关键系统.
航空电子系统经历了独立式、联邦式、综合化(Integrated Modular Avionics,IMA)[2]以及近期提出的智能开放式(Future Airborne Capability Environment,FACE)[3]等阶段.随着计算机硬件能力的提高,使得航空电子系统综合化(IMA)成为可能.IMA是指在统一的硬件处理器上执行所有航电功能,为了保证各个航电功能安全执行,IMA 引入分区的概念,每个分区包含独立的地址空间、上下文数据以及实时任务,一个分区的错误行为不能影响到其它分区.为了支持在IMA架构上的应用软件开发,国际航空电子应用软件接口标准ARINC653(Avionics Application Software Standard Interface)[4]定义了一个多分区的运行时环境,并给出了一套通用的航空电子应用软件标准接口(APEX)以提高机载软件的模块化、可重用性和可移植性.目前,Wind River公司的VxWorks653[5]、LynuxWorks的LynxOS-178产品以及Green Hills公司的INTEGRITY-178B以及均采用了该标准,并通过DO178B的A级认证,为上层机载应用软件提供了高可靠的ARINC653实时操作系统.由DDC-I提出的Deos[6]操作系统,是第一个同时支持ARINC653和多核处理器的实时操作系统,并且通过了DO178C的A级认证.国内方面,航空工业计算所设计与实现的天脉操作系统也能够完整支持ARINC653标准.IMA存在分布式、异构、计算资源和物理资源强耦合等特点,不同分区的应用功能(例如,大气数据管理、飞行管理、飞控、火控等)可能需要不同的功能行为表达方式.
近年来,多范式建模方法(Multi-Paradigm Modeling,MPM)[7]已成为IMA设计的研究热点.多范式建模方法提供了多视角(Multi-View)、多抽象层次(Multi-Abstraction)和多领域(Multi-Domain)异构模型的组合与集成.多视角建模是指从系统的功能、非功能、数据、硬件、行为等多个视角为系统建模.多抽象层次建模指从需求层、逻辑架构层、物理层、执行平台层和应用软件运行层等不同的层次上从多方面描述正在设计的安全关键系统,从而支持包括需求分析、设计、实现、验证和集成在内的系统开发的过程阶段.多领域建模指系统模型可以由不同领域学科的子系统模型组成,领域专家可以利用不同的工具进行单独的建模.
在安全关键系统领域,常用的建模语言主要包括Modelica[8]、SysML[9]、AADL[10]、Simulink、SDL等.其中AADL以层次化构件的方式表达系统的软硬件体系结构,支持功能、非功能、执行平台等多视角建模.AADL 提供定义新属性集和附件(Annex)等多种扩展方式,使得AADL 逐渐成为安全关键软件多范式建模的重要选择.
在AADL多范式建模方面研究主要有:AADL提供Behavior Annex[11]对基于控制流方式的构件功能行为表达;正在制定中的AADL HyBrid Annex[12]则支持对构件的连续行为模型进行构造;Haolan Zhan 和Naijun Zhan等使用AADL 与Simulink 进行混合建模,扩展AADL 描述系统连续行为的表达能力[13];欧空局ESA 提出AADL、Simulink、SDL 的多范式建模方法TASTE[14].
在基于AADL模型的代码生成方面:Gilles Lasnier[15]等人提出了OCARINA工具,为AADL模型提供了面向IMA的ARINC653平台相关的C、Ada代码自动生成方法,其平台相关部分的系统分区信息以及平台接口等是通过代码生成器硬编码实现.Ying Wang等人提出了一种基于ARINC653平台的RT-Java代码生成方法,用于复杂的多任务协同交互环境下的航空电子软件[16].BaekGyu Kim等人提出了一种平台相关的C代码生成框架,使用AADL描述系统的软硬件体系结构,用代码片段存储库存储平台相关的代码片段[17].RAMSES[18]提出了一种基于软件体系结构描述逐级精化的模型驱动工程(MDE)方法,通过求精将抽象模型转化为包含了执行平台的时序特性的更精确的模型,以方便做系统的可调度性分析和代码生成.
本文提出一种面向IMA的AADL多范式建模及代码自动生成方法——MPM4IMA,本文的研究框架如图1所示.
图1 研究框架图
本文的主要贡献是:
1)多范式建模方法:首先,AADL用于表达系统软硬件架构;其次,通过扩展属性集MPM4IMA,使AADL模型能够使用AADL行为附件BA、SDL[19](Specification and Description Language)和同步语言SIGNAL[20]描述构件功能行为,分别支持状态机、同步数据流、异步执行模型等多种计算模型;最后,通过IMA属性集求精的方式向模型中添加IMA属性得到平台相关的AADL模型.
2)代码生成方法:给出面向IMA的代码自动生成规则,涉及任务、分区、内核3个层面的代码自动生成,其中任务层是描述系统的功能行为,包含SDL、SIGNAL、BA和数据构件的代码生成;分区层主要是为任务分配资源,包含分区的初始化、分区任务代码和分区部署;内核层是管理分区和资源配置来实现安全性和可靠性需求,包含内核服务和内核配置文件.
3)工具实现:基于开源工具OSATE对本文所提方法进行原型工具实现,并以航空领域的飞机空气增压系统(Airplane Air Compressor System)作为案例,验证所提方法的可行性和有效性.
本文的结构如下.第2节介绍ARINC653标准、AADL、SDL和SIGNAL;第3节介绍面向IMA的AADL多范式建模方法;第4节介绍面向IMA的AADL模型的代码生成方法;第5节介绍方法的原型工具;第6节基于飞机空气增压系统案例对工具进行应用验证;第7节对已有的AADL建模和代码生成相关工作进行介绍;最后第8节是对研究工作的总结和展望.
2 研究背景
2.1 ARINC653
ARINC653标准是一种航空电子应用软件标准接口规范,主要定义了基于IMA平台的应用软件分区的操作环境,其目的是在航电分区操作系统与应用软件之间定义一套通用的应用执行接口(APEX).
在ARINC653规范中,每个分区由一个或多个并发执行的进程组成,共享处理器资源.如图2所示,ARINC653的体系结构包括应用软件层、APEX接口层、内核软件层、硬件层4个部分.其中应用软件层由应用分区和系统分区(可选)组成,主要是描述分区内的ARINC653应用进程的并发执行.APEX接口层定义了标准服务接口以及接口行为,包含分区管理、进程管理、分区间通信、分区内通信、健康监控、时间管理等服务.核心软件层通过时间分区和空间分区为以上两层提供安全隔离的分区运行时环境和基础的APEX服务接口实现.
图2 ARINC653体系结构图
2.2 AADL
AADL是一种针对嵌入式实时系统的多范式建模语言.它是一种基于构件的建模语言,通过软件构件,硬件构件和复合构件描述系统的软硬件体系结构.其中软件构件用于软件体系结构建模,包括数据、子程序、线程、线程组、进程;硬件构件方面,AADL通过处理器、虚拟处理器、存储器、外设、总线、虚拟总线等构件以及构件间的连接来描述系统硬件组成部分的体系结构;复合构件指的是AADL的系统构件,它组合软硬件构件,层次化地建立系统的体系结构.
在AADL核心构件的基础上,AADL还提供了两种扩展机制,分别是自定义属性集和扩展附件.自定义属性集扩展允许为具体的应用或标准提供新的属性集,例如表达ARINC653标准的分区属性,AADL定义了ARINC653属性集.为了方便表达构件内部的功能行为,法国IRIT实验室提出了Behavior Annex(BA)对线程和子程序构件的具体行为进行详细描述[21].
2.3 SDL
规范与描述语言SDL[19,22]支持使用半图形、半文本的方式描述特定类型的嵌入式系统的功能行为.SDL 建模元素主要分为结构、定义和行为.结构:主要用来描述整个系统模型的分层结构,包括系统、功能块、进程和过程.定义:对软件中需要使用到的各种数据、临时变量和子功能模块之间的信号进行建模描述.行为:对进程/过程模块中的功能行为进行建模,包括开始状态、状态、触发器、行为(Action)、表达式等.
2.4 SIGNAL
SIGNAL[20,23]是一种声明式数据流同步语言.基于同步假设理论,SIGNAL定义了一类对象,称为信号(Signal),它是一种带类型的无限长的值序列.在给定逻辑时刻下,信号可以是“存在”状态并具有对应的数值,或者是“缺失”状态,记为⊥.信号处于存在状态时,对应逻辑时刻组成的集合构成信号对应的逻辑时钟.在SIGNAL中,两个信号同步当且仅当其逻辑时钟相同[22].
SIGNAL 语言通过数据流等式进行建模,它提供4 类基本的数据流等式结构:1)瞬时函数(y:=f(x1,x2,…,xn));2)延迟(y:=x1 MYM init c);3)条件采样(y:=x1 when x2);4)确定性合并(y:=x1 default x2).此外,按照时钟关系划分,4类基本结构可以被分为单时钟操作(瞬时函数和延迟)和多时钟操作(条件采样和确定性合并):前者要求所有信号都是同步的,而后者允许信号可以不同步.例如,在确定性合并中,给定逻辑时刻下x1 或者x2 处于存在状态即可以保证y 处于存在状态.
3 面向IMA的AADL多范式建模方法
面向IMA的AADL多范式建模方法主要包含多范式功能建模和IMA属性集求精两个部分组成,总体框架如图3所示.第一部分用AADL表达系统软硬件架构,用BA、SIGNAL及SDL对构件功能行为进行表达,第2部分是IMA属性集求精.
图3 多范式建模方法框架图
3.1 多范式功能建模
多范式功能建模主要包括两个步骤.首先,通过AADL表达IMA的软硬件架构模型;其次,扩展AADL属性集以支持基于BA、SIGNAL、SDL对构件功能行为进行表达.其中,BA是基于控制流方式对线程和子程序构件的具体行为进行详细描述;同步语言SIGNAL是一种声明式数据流同步语言,擅长对系统的同步数据流建模,例如用数学公式所表达的应用功能(傅里叶变换、欧拉角计算等)往往可以通过同步语言来建模;SDL 作为一种异步建模语言,其主要特征是可以准确描述软件的异步功能行为.
AADL表达IMA的软硬件架构模型,即IMA内核层、分区层和任务层.内核层:用AADL的System构件来表达IMA系统;AADL 的Processor构件和Memory构件分别代表IMA的处理器和内存;IMA的分区间通信有两种方式采样和队列,分别用AADL的Data Port和Event Data Port表示.分区层:AADL的Process构件用于表达IMA分区的软件部分,AADL的Virtual Processor表达IMA的分区运行时(硬件部分);AADL的Thread表达IMA的任务,IMA的分区内通信有4种方式即缓冲区、黑板、信号量和事件,其中缓冲区用同一进程内的Event Data Port表示,黑板用两个线程共享的Data表示,信号量用Data Access表示,事件用Event Port表示.任务层:AADL的Subprogram和BA用于表达IMA任务的功能行为.
定义AADL扩展属性集MPM4IMA以支持基于SIGNAL和SDL对任务的功能行为进行表达,如下MPM4IMA属性集所示.Supported_Languages表示AADL支持的语言扩展;Source_Language表示子程序实现的语言类型;Source_Text表示SIGNAL或SDL源文件名;Source_Location表示源文件的路径.我们给出一个Signal建模示例,如下subprogram所示,表示子程序example.impl的功能行为是用signal实现的,存储在名为example.sig的文件中,文件的位置在当前目录的上一级目录下.
property setMPM4IMAis
Supported_Languages:type enumeration(Ada95,Ada2005,C,Simulink_6_5,Signal,SDL);
Source_Language:inherit list of MPM4IMA::Supported_Languages applies to(subprogram,data,thread,thread group,process,system,bus,device);
Source_Text:aadlstring applies to(subprogram,data,thread,thread group,process,system);
Source_Location:aadlstring applies to(subprogram,data,thread,thread group,process,system);
end MPM4IMA;
subprogram implementation example.impl
properties
MPM4IMA::Source_Language=>(Signal);
Source_Text=> “example.sig”;
Source_Location=> “..”;
end example.impl
3.2 IMA属性集求精
通过多范式功能建模构造平台无关的AADL模型,需要进一步求精为平台相关模型.因此提出一种IMA属性集求精方法,求精的内容主要分为3个部分:调度、分区通信和任务运行时属性.
调度:在AADL模型中,我们使用处理器和虚拟处理器来分别表示IMA系统运行时及分区运行时.因此,这里将IMA调度属性以求精的方式添加到模型中.IMA系统包括两条属性即分区调度总时长和分区调度窗口,分别对应Processor的两条属性:Module_Major_Frame和Module_Schedule;IMA分区包括分区调度协议、分区名、分区ID,分别对应AADL的Virtual Processor的3条属性:Scheduling_Protocol、Partition_Name、Partition_Identifier.
分区通信:分区通信属性主要包括分区间通信和分区内通信属性.分区间通信:IMA的分区间通信有两种方式:队列和采样,其中,队列包含队列大小、延迟属性,分别对应AADL的Queue_Size、Timeout属性;采样包含端口刷新周期、端口方向和最长消息大小,分别对应AADL的Refresh_Period、in/out、MAX_Message_Size属性;分区内通信:IMA的分区内通信有4种方式:缓冲区、信号量、黑板和事件,其中缓冲区包含的属性有缓冲区大小、缓冲区读取规则,分别对应AADL的Queue_Size、Queueing_Discipline属性;信号量、事件、黑板包含的属性有延迟,对应AADL的Timeout属性.我们将这些属性以求精的方式添加到AADL模型中.
任务运行时属性:主要考虑分区内的任务的相关属性,主要包括任务分发协议、任务周期、任务优先级、任务的时间容量等,对应AADL线程构件的Dispatch_Protocol、Period、Priority、Time_Capacity属性等.
IMA属性集求精得到AADL平台相关模型,它作为代码生成器的输入,接下来介绍代码生成方法.
4 面向IMA的AADL模型的代码生成方法
IMA的代码结构由任务层、分区层和内核层3个部分组成,结构框架如图4所示.任务层是主要是分区应用,即分区的功能行为代码和数据结构.分区层主要是为任务分配资源;内核层主要是为分区分配资源,并对分区进行调度.
4.1 任务层
任务层代码生成规则主要包括BA、SIGNAL、SDL和数据构件的生成规则.在我们的前期研究中[24],给出了同步语言SIGNAL的代码自动生成方法和工具.因此,本文主要给出BA、SDL的代码生成规则.
4.1.1 数据构件代码生成规则
将数据构件的数据类型映射为相应的C语言数据类型,数据类型分为简单数据类型和数据结构.
规则1.AADL简单的数据类型映射到C语言简单数据类型.数据标识符转化为相应的C语言变量标识符.表1为简单数据类型的映射示例.
表1 基本类型映射示例
规则2.AADL数据结构映射为C语言的结构体.将数据构件名称、数据子构件名称和数据子构件类型映射为结构体名称、内部成员名称、内部成员类型.表2是一个AADL数据结构转换示例.
表2 结构体映射示例
4.1.2 BA代码生成规则
BA是由局部变量、状态和变迁3个部分组成.局部变量映射为C语言函数的局部变量,具体规则参照数据构件映射规则,状态映射为C语言中的枚举类型,变迁映射为C语言中的switch-case语句.
规则3.AADL状态映射为C语言的枚举类型,并且给初始状态、当前状态赋值.
规则4.AADL变迁映射为switch-case结构,每个状态映射为一个case,每个变迁映射为一个if-else结构,变迁的条件守卫映射为if-else的条件判断部分,变迁的行为动作映射为if-else的操作部分.
4.1.3 SDL代码生成规则
SDL的代码生成分为以下3个部分:SDL的结构转换为C语言的功能函数框架;定义转换为C语言的变量;行为转换为C语言的具体功能行为.
规则5.
1)结构:SDL中系统转换为<系统名.c>和<系统名.h>文件,功能块转换为C语言中对应的函数.
2)定义:SDL的声明的元素转换为C语言中的全局变量;SDL的局部声明的变量转换为C语言的局部变量.
3)行为:SDL的状态代码生成规则和BA的状态代码生成规则一致.
4.2 分区层
分区层主要是为任务分配资源,主要由分区初始化、分区任务代码和分区部署文件组成.
4.2.1 分区初始化
分区初始化包含任务的初始化等.IMA的分区和任务分别对应AADL的进程构件和线程构件,本文主要关注IMA 周期性和非周期性任务的初始化,对应AADL是周期性和非周期性线程构件的代码生成规则.
AADL线程根据dispatch_Protocol属性区分线程的类型:Periodic代表周期性线程;Aperiodic代表非周期性线程.
规则6.周期性任务的初始化函数映射为APEX API对应的任务初始化函数,周期性任务的初始化数据结构PeriodProcessInit如下,任务初始化函数利用PeriodProcessInit数据结构对周期性任务进行初始化.
typedefstruct ProcessInit{
char *threadname;
int *enter_point;
int deadline;
int period;
int time_capacity;
} PeriodProcessInit;
其数据结构中的各项分别为任务名称、任务入口地址、任务截止时间、任务周期、任务执行时间.
规则7.非周期性任务的初始化函数映射为APEX API对应的任务初始化函数,非周期性任务的初始化数据结构AperiodProcessInit如下,任务初始化函数利用AperiodProcessInit数据结构对非周期性任务进行初始化.
typedefstruct ProcessInit{
char *threadname;
int *enter_point;
int deadline;
int time_capacity
} AperiodicProcessInit;
其数据结构中的各项分别为任务名称、任务入口地址、任务截止时间、任务执行时间.
4.2.2 分区任务代码
分区任务代码主要IMA任务的功能映射.
规则8.针对一个AADL周期性构件,入口函数用<线程实例名_period_jod>来命名,周期性线程的循环过程映射为入口函数的while(1)循环,线程周期性等待映射为wait_next_period()函数,并把它置于while循环的末尾.表3是一个周期性任务的功能映射示例.
表3 周期性任务的功能映射示例
规则9.针对一个AADL非周期性构件,入口函数用<线程实例名_aperiodic_job>来命名,在端口捕获事件映射为wait_Dispatch()函数.表4是一个非周期性任务的功能映射示例.
表4 非周期性任务的功能映射示例
4.2.3 分区部署文件
由于IMA系统每个分区都是相对的独立,因此,每个分区必须保存当前分区的信息,部署信息会保存在分区部署文件中.
规则10.分区部署文件中包含当前分区的部署信息,如表5所示,左边是IMA分区实体,包含分区ID、分区名、分区调度策略、任务总数、通信端口数,对应右边AADL的Partition_Identifier、Partition_Name、Scheduling_Protocol、线程总数、端口总数等属性.
表5 分区部署信息映射表
4.3 内核层
内核层的主要功能是管理分区和资源配置,分为内核服务和内核配置文件.
4.3.1 内核服务
IMA的内核服务主要包含分区管理和分区间通信.
规则11.分区管理主要是获取当前分区状态,分区状态的结构体如下,包括当前分区的调度周期、分区ID、当前分区的运行时长,对应AADL的Module_Schedule和Partition_Identifier属性.
typedefstruct partition{
system_time_type period;
partition_id_type partition_id;
system_time_type duration;
} partition_status_type;
分区间通信包括采样和队列这两种方式,下面分别介绍采样和队列的映射规则.
规则12.采样通信对应AADL的Process构件间的Data Port通信,它的结构体如下,包含采样通信的端口大小、端口方向、刷新频率属性,分别对应AADL的MAX_Message_Size、in/out、Refresh_period.
typedefstruct sampling
{
port_size size;//采样端口大小
port_direction direction;//端口方向
int refresh;//刷新频率
} port_sampling_status;
规则13.队列通信对应AADL的Process构件间的Event Data Port通信,它的结构体如下,包含队列端口方向、消息数量、队列大小属性,对应AADL的in/out、Nb_Message、MaxMessageSize属性.
typedefstruct queueing
{
port_direction direction;//端口方向
int nb_messages;//消息数量
port_size size;//队列大小
} port_queueing_status;
4.3.2 内核配置文件
IMA的系统的内核配置文件由一个IMA的XML系统配置表组成,系统配置表主要包含以下4个主要元素:分区表、分区调度表、通信表及内存分配表.
规则14.分区表主要是保存分区的具体信息,包含分区名、分区ID,以及每个分区里包含的端口的信息,对应AADL的PartitionName、PartitionID、PortName、Direction.
规则15.分区调度表主要是保存分区的调度框架,包含一个主时间框架、分区名、分区ID、分区周期、分区持续时间、窗口开始的时间,窗口ID,分别对应AADL的Module_Schedule、PartitionName、PartitionID、Module_Schedule.其中Module_Schedule 中包含PeriodSeconds、PeriodDurationSeconds、WindowStartSeconds、WindowID等属性.
规则16.通信表主要保存分区间通信信息,包含端口名称、端口所在分区名、端口方向,对应AADL的PortName,PartitionName和端口方向.
规则17.内存分配表主要是保存各分区的内存分配,包含分区名、分区ID、分区内存大小,对应AADL的PartitionName、PartitionID、Memory_requirement.
本节提出IMA的AADL模型到C语言的代码生成规则,下面将介绍MPM4IMA工具的具体实现.
5 原型工具
5.1 总体框架
MPM4IMA的工具是基于开源工具OSATE开发的插件项目,借助于OSATE工具的AADL语法分析功能等对AADL模型进行解析,使用Xtend语言模板技术实现工具.
MPM4IMA的工具分为两个部分:多范式建模工具和代码生成工具,图4是工具的总体框架图.
图4 MPM4IMA工具框架
5.2 多范式建模工具
多范式建模工具分为4个部分,如图5所示:1)AADL模型的树形结构:首先,用OSATE将模型实例化,然后将实例化模型转换为树状结构,并在展示;2)IMA属性集精化:基于ARINC653属性集将系统属性分为调度、分区通信和任务运行时属性3个部分,并通过手动选择,为AADL构件选择适当的属性;3)多范式功能建模:选择BA,SDL或SIGNAL,建模AADL线程和子程序的具体功能行为,所建模型保存在项目的根目录下;4)操作的结果展示:2,3的操作步骤的结果会展示在4里.表6是工具的代码统计.
图5 多范式建模工具界面
表6 多范式建模工具数据统计
5.3 代码生成工具
通过OSATE提供的AADL文件解析模块对文件实例化为aaxl文件,并解析包装成类,然后借助Xtend提供的模板功能表达AADL到C代码代码生成规则的映射,对文件中的SDL和SIGNAL模型,调用相应的工具实现代码生成.表7展示了该原型工具代码规模.
表7 代码生成工具数据统计
6 案例分析
6.1 飞机空气增压系统简介
飞机空气增压系统(Airplane Air Compressor System,AACS),是保障飞机正常运行的核心系统,它为飞机供气增压,最核心的部件是空气增压控制器(Air Compressor Controller,ACC),它将机上的270V高压直流电源,采用无刷方式转换成方波或正弦波交流电源,用于驱动电机运转,从而带动空压机工作.
AACS主要功能包括初始化功能、供电功能、控制功能、自检功能、故障处理功能、存储功能、输入功能和输出功能等7个功能模块.其中:
•初始化功能,对电路进行初始化和软件的全局变量进行初始化;
•控制功能主要控制电机,电磁阀和加热器,将三者的控制指令通过输出功能传输给对应的设备;
•自检(BIT)功能由上电BIT和周期BIT组成,上电BIT主要执行芯片、处理器、传感器状态等信息的自检,周期BIT主要执行电流,温度等信息自检.其中上电BIT在上电时自检,周期BIT在正常工作、安全保护或失效保护时自检;
•输入功能,是将飞行器管理计算机(vehicle management computer,VMC)的指令、温度传感器采集的温度、压力传感器采集的压力还有旋转变压器采集的角速度和角位置等信息进行接收;
•输出功能是将周期自检信息或者将上电自检信息进行接收,准备传输给VMC.将存储在存储器中的信息下载到地面检测设备中,将控制功能中传输过来的控制指令传输到外部设备,电机,电磁阀,加热器中从而控制电机的转速,电磁阀的开关和加热器的开关,将接收到的周期自检或上电自检信息或者故障情况传输给 VMC;
•存储模式,将电磁阀的开关次数,电机寿命,电磁阀寿命,电流等信息进行存储;
•故障处理,基于不同类别的故障处理指令进行处理.
6.2 飞机空气增压系统建模
基于AACS的系统需求,本文将空压机系统建模分为7个分区,分别是:自检(BIT)、输入、输出、故障处理、控制、存储和监控.图6给出了AADL架构图.
图6 飞机空气增压系统的AADL模型
本小节以飞机空气增压系统控制模块为例介绍多范式建模方法,总体功能结构如图7所示.控制模块主要有3个部分组成:电机控制、电磁阀控制和温度传感器控制,基于VMC指令的不同,输入模块向控制模块发出不同的控制指令.本文分别用SIGNAL、SDL、BA对其功能行为建模.
图7 控制模块流程图
当控制模块接收到温度传感器控制的信号,获取当前温度传感器的温度,如果温度<4度,依次打开3个加热器,如果温度在4度到15度之间,发出不做温度调控操作指令,如果温度>15,则关闭3个加热器,并置加热器未打开.下面给出温度传感器控制模块的BA建模示例.传感器控制模块建模为AADL线程solenoid_value_cmd,BA的局部变量temperature值为传感器的温度,然后基于温度的大小调用相应的操作.
annex behavior_specification {**
variables
temperature:Base_Types::Integer;
states
s0:initial state;
s1:final state;
s2:final state;
s3:final state;
transitions
t1:s0-[]→ s0 {temperature:= heater_re_data };
t2:s0-[temperature<4]→s1{sub1!(heater_func1)};
t3:s0-[4<=temperature and temperature<=15]→
s2{sub2!(heater_func1)};
t4:s0-[temperature>15]→s3{sub3!(heater_func1)};
**};
当控制模块接收到电机控制指令时,获取时间计数器计数,通过PID算法得到当前的电机转速并输出.下面是其SIGNAL模型,2-3行分别是输入信号t,输出信号u;第5到7行分别代表比例调节函数、积分调节函数和微分调节函数;第8行是计算电机转速函数;第10行是局部声明.
1. process PID=
2. (? integer t;
3. !integer u;
4. )
5. (|u1:=err(t);
6. |u2:=f(t);
7. |u3:=g(t);
8. |u:=F(u1,u2,u3);
9. )
10. where integer u1,u2,u3;
11. end;
当控制模块接收到电磁阀控制指令时,获取电磁阀的指令,判断电压是否是12V,然后向外发出电磁阀开关命令.电磁阀控制模块的SDL模型的block部分如下所示.
BLOCK solenoid_value_cmd;
SIGNALROUTE r
FROM ENV TO solenoid_value_cmd WITH vmc_cmd;
FROM solenoid_value_cmd TO ENV WITH cmd;
CONNECT c AND r;
PROCESS solenoid_value_cmd;
--Text area for declarations and comments
dcl Vol INTEGER;
STATE control;
INPUT VMc_cmd;
CALL get_solenoidcmd;
DECISION Vol=12;
(True):CALL OPEN;
(False):CALL CLOSE;
ENDDECISION;
OUTPUT cmd;
NEXTSTATE-;
ENDSTATE;
ENDPROCESS
solenoid_value_cmd;ENDBLOCK;
6.3 代码生成
AACS系统建模完成得到平台相关的AADL模型后,通过OSATE对模型实例化得到aaxl文件,输入代码生成工具,可以得到AACS系统的C语言代码,表8是C代码的代码统计.下面的代码块是控制模块的功能行为代码,包括BA、SIGNAL、SDL生成的代码.
表8 AACS系统代码统计
7 相关工作
7.1 多范式建模
AADL 目前支持Behavior Annex[11]通过基于自动机模型对软件行为中的状态控制进行描述;Hybird Annex[12]通过集成Hybrid CSP 对系统物理层的连续行为进行描述.
文献[13]提出AADL 与Simulink/Stateflow 混合建模方法,使用Simulink/Stateflow描述AADL 系统体系结构模型中物理层的连续行为,通过contract对AADL物理层构件进行约束.
struct pid SIGNAL
{
float SetSpeed;
float ActualSpeed;
float err;
float err_last;
float Kp,Ki,Kd;
float voltage;
float integral;
}pid;
int pid_calculate(int t)
{
int count=0;
pid_value_init();
while(count < 1000)
{
float speed=PID_realize(200.0);
cout <<"value is " <<
speed< count++; } system("pause"); } float PID_realize(float speed) { pid.SetSpeed=speed; pid.err=pid.SetSpeed-pid.Actual- Speed; pid.integral+=pid.err; pid.voltage=pid.Kp * pid.err +pid.Ki*pid.integral+pid.Kd*(pid.err-pid.err_last); pid.err_last=pid.err; pid.ActualSpeed=pid.voltage*1.0; return pid.ActualSpeed; int heater(Cmd heater_re_data){ BA int temperature; enum State{s0,s1,s2,s3}; enum State initialState=s0; enum State finalState=s3; enum State current_state=initial State; while(1){ switch(current_state){ case s0: temperature=heater _re_data.temperature; break; case s1: if(temperature<4){ heater_func1(); } break; case s2: if(4≤temperature≤15){ heater_func2(); } break; case s3: if(temperature>15){ heater_func3(); } break; default: break; } } } Int control(Cmd vmc_cmd){ SDL enum states_t{running,wait}; enum State initialState=running; enum State finalState=wait; enum State current_state=initialState; int result=0; int vol=vmc_cmd.vol; while(1){ switch(current_state){ case running: vol=get_solenoidcmd(); if(vol==12) open(); else { close(); } break; case wait: return; default: return-1; } } result=control_solenoidcmd(); return result; } 文献[14]欧空局ESA 提出AADL、Simulink、SDL 的多范式建模方法TASTE,TASTE 通过AADL 部分子集描述系统体系结构,并通过TASTE 扩展属性集将AADL 系统体系结构模型与Simulink、SDL 等行为模型进行集成.通过集成代码生成工具Ocarina进行基于AADL 模型的代码生成.通过集成Simulink Coder、Qgen、OpenGEODE等工具实现Simulink、SDL 等行为模型代码的生成. 文献[15]是法国ENST开发的OCARINA工具,它实现了从AADL模型自动生成代码.该工具中使用的代码生成算法针对的是单一平台POLYORB和POLYORB-HI,方法是将编程接口和平台相关的代码硬连接到生成算法中.因此,高级模型和源代码之间存在较大的语义上的差异. 文献[16]提出一种基于ARINC653架构的AADL模型的自动RT-Java代码生成方法,该方法将AADL模型映射为RT-Java编程模型,并给出了一种适用于多任务协作的RT-Java代码生成算法. 文献[17]提出一种AADL模型和代码片段存储库显式指定目标平台的平台相关特性的代码生成框架,该框架提供选择不同目标平台的灵活性.但该方法只能保证模型功能性的正确性,在早期模型分析阶段并不能保证其非功能性质的验证. RAMSES[18]提出一种基于软件体系结构描述逐级精化的模型驱动工程(MDE)方法,首先提出一种模型精化和时序分析框架,主要是通过求精将抽象模型转化为包含了执行平台的时序特性的更精确的模型,以方便做系统的可调度性分析和代码生成. Le Sergent等人提出的SCADE是目前国内外工业界使用最广泛的模型驱动工具之一,其对功能模块强大的建模描述能力得到了广泛的认可,并且该工具支持将其工具上设计的模型自动转换到Ada、C代码,不过其生成的代码并不包含平台相关信息,不具备灵活性,需要工程师后期手动将代码集成到执行代码中[25]. 本文提出了一种面向IMA的AADL多范式建模及代码自动生成方法.首先,提出面向IMA的AADL多范式建模方法,包括: 1)使用AADL表达系统软硬件体系结构; 2)通过扩展属性集,以支持基于BA、SIGNAL、SDL对构件功能行为进行表达; 3)通过IMA属性集求精的方式向模型中添加IMA属性得到平台相关的AADL模型.其次,提出面向IMA的AADL代码自动生成方法,包括3个层次的代码转换: 1)任务层是描述系统的功能行为,包含SDL、SIGNAL、BA和数据构件的代码生成; 2)分区层是为任务分配资源,包含分区的初始化、分区任务代码、分区部署; 3)内核层是管理分区和资源配置来实现安全性和可靠性需求,包含内核服务和内核配置文件.最后,基于开源工具OSATE对本文所提方法进行原型工具实现,并以航空领域的飞机空气增压系统(Airplane AirCompressor System)作为案例,验证所提方法的可行性和有效性. 在未来的工作中,我们将进一步考虑IMA系统的健康监控功能,IMA的健康监控功能是处理系统发生的错误,以后可以考虑通过AADL的error model表达健康监控功能.另外,我们正在研究面向IMA系统的AADL模型组合验证方法.7.2 代码生成相关
8 结束语