【OSATE&AADL建模入门学习教程】AADL语法介绍(一)组件的基本介绍

1,111 阅读11分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

AADL介绍

  • Osate是编写AADL的工具,既然要学习Osate,这个大家应该知道吧。
  • 首先,明确一点,AADL是SAE(汽车工程师协会)推出的国际标准,是一种"架构分析与设计"语言。
  • 关于这个标准,我在卡耐基梅隆大学官网找到了2006年的原版介绍:The Architecture Analysis & Design Language (AADL): An Introduction resources.sei.cmu.edu/asset_files…,同时我上传到了CSDN资源上作为备份:download.csdn.net/download/qq…
  • AADL的专业介绍(不看也行,太专业,仅作了解):AADL 是用于模型基软件系统工程的统一框架,你可使用它获取静态的模块化体系结构、以通信任务为基础的运行时体系结构、用于部署软件的计算机平台体系结构,以及与之进行系统交互的任何物理系统或环境。你可以在单一的体系结构模型中获取静态结构和动态,并且解释其与各种工作特性的分析相关的信息。由 AADL 提供的概念,如线程、进程或设备,已经明确地定义了执行语义,这种执行语义能使你既可进行不太重要的系统分析,又可进行正式的系统分析。此外,利用其扩展性的结构组成,你和工具开发商能够将自定义分析和规范技术与核心AADL能力结合起来,以便为体系结构建模和分析建立一个完整的工程环境。
  • 关于AADL的学习,推荐一些教程:

Components(组件)

  • 组件是利用分类符(即个组件类型和个组件实现)定义的。组件类型表示单篇规范(即组件的外部接口)。它明确了组件类别,定义了与其他组件的全部交互点,以及可从外部查测的特性。组件实现表示其以分组件(即以其他组件分类符为单位的实例,以及它们与内含组件实现的接口之间的连接)为单位的内部结构的蓝图。当一个 AADL模型被实例化时,分组件的使用形成了一个组件分层。一个组件类型能够具有多个作为组件类型的变异的组件实现。如果组件不是由其他组件组成的话,可以不需要组件实现说明。 在这里插入图片描述
  • AADL 中的组件类型与组件实现相当于面向对象中的类与对象,组件类型主要分为如下四种:
    • identifier :标识符
    • features:特征
    • flows :流
    • properties:属性
  • 组件类型的构建又可分为四类:
    • 软件类( 表示处理过的源文本 /代码和执行路径 )
      • thread(线程):并行执行的可调度单元。
      • thread group(线程组):组织线程的组合单元。
      • process(进程):受保护的地址空间。
      • data(数据):源文本中的数据类型和静态数据。
      • subprogram(子程序):可顺序调用的可执行代码。
    • 执行平台类(表示计算和连接的资源 )
      • processor(处理器):执行线程的组件。
      • memory(内存):存储数据和代码的组件。
      • device(设备):与外部环境交互并代表外部环境的组件。
      • bus(总线):在执行平台组件之间提供访问的组件。
    • 组合类
      • system(系统 ):软件、执行平台或系统组件的组合。
    • 通用类
      • abstract(抽象):定义运行时中性组件。

明确说明一下,组件和构建不一样,构建用于描述组件,是组件的一部分。

  • AADL 规则要求软件组件必须通过 binding 关系映射到执行平台组件 。通过Bindings(绑定)定义了代码在哪执行, 以及数据和可执行代码在哪存储。 例如线程必须在进程或线程组内, 进程必须在 memory 内。软件和执行平台组件的集合在分层系统结构建模中可以表示虚拟机层。 在这里插入图片描述

    Bindings(绑定):系统实现内部软件组件到硬件组件的映射

  • 组件名称:组件类型和组件实现的名称必须包括合法的 AADL. 标识符,并且不能是一个AADL备 用字(类似于其他语言的关键字)。
    • 合法的 AADL 标识符是一列字母(单词)或以字母开头且没有空格的数字。
    • 标识符厅列中的字母和数字能够用下划线隔。
  • 部分备用字介绍:
    • extends:能将一个组件类型说明在继承其特征和属性的情况下细化为另一种类型说明
    • prototypes:允许将已命名的组件类型或实现用作说明范围内的参数
    • features:规定组件类型的交互点(例如,对组件内部和外部进行数据传输和访问)
    • flows:定义流入、流出或流经系统组件的信息和控制的完全不同的抽象路径
    • modes:规定可选的配置,并在不同配置之间进行转换
    • requires modes:规定一个组件,期望继承其所包括的组件的模式
    • properties:为一个组件及其相关建模要素的各种特性(属性)赋值
    • annex:允许为标准化的或用户定义的子语言(例如,差错建模和行为规范)增加分子句
    • end:结束组件说明
    • none:能够用于明确指出这种忽略,不是要忽略组件类型中的一部分。
    • subcomponents:在一个组件实现的范围内规定组件的实例
    • calls:定义调用子程序的顺序
    • connections:在组件间建立逻辑信息交换和访问
    • data:源代码形式和应用数据类型的静态数据和逻辑数据
    • thread:应用任务作为并行执行的一个可调度单元
    • thread group:从逻辑上组织的一个进程范围内的线程、线程组和数据组件的抽象
    • subprogram:可按顺序调用的可执行代码,它表示诸如调用返回和正在调用类的概念
    • subprogram group:用于组织子程序的抽象

Component Types(组件的外部可见特性)

  • 以一个声明指定了一个thread组件的接口为例: 在这里插入图片描述
    • thread后面紧跟名称,这是组件的定义子句,定义这是一个叫做<name>的thread组件,这个组件具有thread的特性,他的特性是不可见的,但我们都知道(和java语言的void、int类似,不需要再单独说明特性,大家都会用,如果你不知道的话,后面我会讲)。
    • extends、features、flows、properties是组件的描述性字句,叫做组件的外部可见特性,分别描述这个组件的不同特性
      • features是组件的接口。
      • flows指定了不同的抽象的信息传输通道。
      • properties定义了一个组件的内在特性。
      • extends允许一个组件类型声明拥有另一个组件类型的描述性字句,并且可以进行修改和添加。

Component Implementations(组件的实现)

  • 组件实现是根据subcomponents、这些子组件的features之间的交互(calls和connections)、跨一系列子组件的flows、表示操作状态和properties的modes,来指定一个内部结构。 在这里插入图片描述
    • extends implementation(使用扩展子句声明)继承了原始组件实现及其所有前身实现的特性。
    • extends implementation声明可以为其相应类型的features添加property值。这些添加可以通过refines type子句进行。
    • 可以声明一个组件进行多个实现,从而允许对具有相同外部接口的多个变体进行建模,因为每个实现都提供了满足该组件类型指定的相同接口的组件的实现。此外,组件实现可以扩展和细化先前声明的其他组件实现。

Packages, Property Sets, and Annexes(包、属性集和附件)

  • Packages:AADL软件包允许将组件声明的集合用它们自己的名称空间组织成单独的单元。具有共同特征的元素(例如,与网络通信相关联的所有组件)可以被分组在一个包中,并使用包的名称进行引用。通过为每一组子系统元素提供不同的名称空间,软件包可以支持针对大型系统的不同子系统的AADL模型的独立开发。(和java的包结构类似)
  • Property Sets:属性集是属性声明的命名组,用来定义规范中可以包含的新属性和属性类型。例如,安全属性集可以包含数据库系统中所需的安全级别的定义。这些属性使用属性集名称进行引用,并且可以与系统规范中的组件和其他建模元素(例如,ports或connections)相关联。它们的声明和使用已成为本规范的一部分。
  • Annexes:附件使用户能够扩展AADL语言,允许在标准的AADL模型中合并专门的符号。例如,可以在AADL规范中包含一种能够分析系统的关键方面(例如,可靠性分析、安全性或行为)的正式语言。

范例一

  • 范例作用:为Process speed_control 定义了两个feature∶一个in data port 和一个 out data port。
    • 这些 feature 定义了进程类型的数据输入和数据输出的接口。
    • 一个end语句结束软件包和进程说明。
  • 范例代码:
package test_package
public

process control
features
input_speed: in data port;
output_cmd: out data port;
end control;

end test_package;

注意,我的包名叫test_package,也就是aadl文件叫test_package,我所我在代码里package后面是 test_package,最后面的end也是test_package

  • 范例在osate内的展示 在这里插入图片描述
  • 范例对应的diagram 在这里插入图片描述

范例二

范例主要内容

  • 包含一个进程和两个线程组件类型声明。流程类型定义具有组件类型标识符(名称)control_processing。为此进程类型声明了两个数据端口,输入数据端口和输出数据端口。sensor_data 和 command_data 数据类型在单独的数据类型声明中声明。
  • 线程类型定义标识符是 control_in 和 control_out。表示过程类型control_processing的实现声明。组件实现标识符是 speed_control。通过使用组件类型标识符和组件实现标识符来引用实现,两者之间用句点(.)分割,例如:组件类型可以命名为 sensor,而该类型的实现可以是 sensor. speed。
  • control_input 的声明中显示了对线程类型 control_in 的线程实现input_processing_01的引用。因此,control_input 是组件实现control_in.input_processing_01的一个实例。 过程类型声明control_processing 和过程实现声明的图形表示在后面的部分中显示。

范例代码

package test_package
public
	
-- A process type definition with the component type 
-- identifier (name) "control_processing" is shown below. 
process control_processing 
features 
input: in data port sensor_data; 
output: out data port command_data; 
end control_processing; 
-- Below is an implementation of process type "control_processing" 
-- The component implementation identifier(name)is "speed_control" 
-- The implementation is referenced by using both the component type 
-- identifier and the component implementation identifier, separated 
-- by a period(.)in the form: control_processing.speed_control. 
-- A reference to a thread implementation “input_processing_01” 
-- of the thread type “control_in” is shown below in the 
-- declaration of the subcomponent “control_input” 
process implementation control_processing.speed_control 
subcomponents 
control_input: thread control_in.input_processing_01; 
control_output: thread control_out.output_processing_01; 
end control_processing.speed_control; 
-- The declaration of the thread type “control_in” is shown below. 
thread control_in 
end control_in; 
-- The declaration of the thread implementation 
-- “control_in.input_processing_01” is shown below. 
thread implementation control_in.input_processing_01 
end control_in.input_processing_01; 
-- The declaration of the thread type “control_out” is shown below. 
thread control_out 
end control_out; 
-- The declaration of the thread implementation 
-- “control_out.output_processing_01” is shown below. 
thread implementation control_out.output_processing_01 
end control_out.output_processing_01; 
-- The declaration of the data type “sensor_data” is shown below. 
data sensor_data 
end sensor_data; 
-- The declaration of the data type “command_data” is shown below. 
data command_data 
end command_data;

end test_package;

范例在osate内的展示

在这里插入图片描述

范例片段介绍

  • control_processing:control_processing是一个process,这个process的标识符(也叫名称)是control_processing,他有两个可见特性:sensor_data表示输入,command_data表示输出。 在这里插入图片描述
  • control_processing.speed_control:他是control_processing的实现,这个process的标识符是speed_control,他拥有两个子组件:对线程类型“control_in”的线程实现“input_processing_01”的引用显示在子组件“control_input”的声明中,对线程类型“control_out”的线程实现“output_processing_01”的引用显示在子组件“control_output”的声明中, 在这里插入图片描述
  • 后面对线程control_in、control_out,线程实现input_processing_01、output_processing_01、数据sensor_data、command_data的声明具体内容均省略,只写了声明的方法。 在这里插入图片描述

这个范例如果没看明白,不用担心,后面会对这些关键字逐一讲解。

结束

  • 刚开始接触AADL,对语法还是一窍不通,看着教程,慢慢学习,慢慢了解,终于算是有了点起色
  • 有Diagram真不错,但不适合新手,新手还是以写AADL为主更有助于提升