AADL语言和OSATE工具集的使用
# 1. AADL的诞生
UML等ADLs(结构描述语言)不是专门面向嵌入实时系统领域,尚不能解决该领域的时限响应、并发处理等特定需求。2004年,SAE(Society of Automotive Engineers)组织提出了嵌入式实时系统体系结构分析与设计标准AADL(Architecture Analysis and Design Language)。AADL借鉴了UML等多种ADLs的优点,目的是提供一种标准的、足够精确的方式,设计与分析嵌入式实时系统的软件、硬件体系结构及其性能关键属性。
# 2. AADL简介
AADL(Architecture Analysis and Design Language)结构分析与设计语言,是一种面向嵌入式实时系统领域的建模语言,具有语法简单、语义精确、功能强大、可扩展等优点,能够对嵌入式软件的功能和非功能属性进行建模和描述,并且能够在开发早期对系统进行分析与验证。
作为一种体系结构描述语言,AADL通过描写构件和连接来建立系统的体系结构。一个AADL的描述由对一系列构件的描述组成,通过对这种描述的实例化来建立系统体系结构的模型。
# 2.1 构件描述
AADL的构件被定义成两部分:类型和实现,相当于面向对象中的类与对象。一个AADL的构件拥有一个类型以及对应零个、一个或者很多个实现。
- 构件的类型:对外部接口的描述(进出端口、属性等)
- 构件的实现:对内部结构的描述(子结构、其他属性等)
构件的类型和构件的实现都可以通过扩展定义一个新的类型和实现。
# 2.2 构件的种类
大体上分为三大类:软件构件、硬件构件和复合构件。每个种类中构件的语义和组合规则都被严格地定义。
# 2.2.1 软件构件
定义了系统体系结构中的应用元素
- 数据(data):源文本中的数据类型和静态数据
- 线程(thread):并行执行的可调度单元
- 线程组(thread group):组织线程的组合单元
- 进程(process):受保护的地址空间
- 子程序(subprogram):可顺序调用的可执行代码
# 2.2.2 硬件构件
也叫执行平台构件,对硬件元素进行建模
- 总线(bus):在执行平台构件之间提供访问的构件
- 内存(memory):存储数据和代码的构件
- 处理器(processor):执行线程的构件
- 设备(device):与外部环境交互并代表外部环境的构件
# 2.2.3 复合构件
系统(system):软件、执行平台或系统构件的组合
# 2.3 特征
构件的特征在构件类型中声明,规定构件类型的交互点,以这样方式,构件类型的所有实现给其他构件提供同样的接口。AADL存在很多种特征:交互的进出端口、接口子程序、子程序参数以及子构件的存取。它们之间通过定义在实现中的连接来完成。
# 2.4 属性
属性是AADL组成中一个重要的方面,定义了一个构件的内在特性,它除了能够描述AADL实体的不同特性,还能够描述应用在体系结构中的约束条件,进而验证系统的可靠性。例如,属性被用来规定子程序的执行时间,线程的周期,数据或事件端口的等待队列协议等。属性的声明集中在属性集中,有三种声明方式:类型、常量和属性名。一些属性已经定义在AADL标准里,用户可以根据自己的需要定义新的属性。
# 2.5 附件
当定义新的属性不能满足用户需要时,AADL又引入了附件的概念。附件是另一种对描述的元素添加信息的方式,和属性不同,它仅仅能够使用在构件的声明中,并且拥有自己独立的语法规则。附件的使用允许我们扩展AADL的语法规则以用于描述构件的动态行为。
# 3. OSATE简介
osate(Open Source AADL Tool Environment)开源AADL工具环境,是一款基于Eclipse环境开发的建模平台,是目前AADL模型主要的开源开发工具,服务于AADL模型的嵌入式实时系统的建模与分析。
- 最新版本:
2.11.0
- 下载地址:下载 (opens new window)
- 运行环境:JDK、操作系统(Linux、MAC、Windows都可)
- 官方更多样例:git地址 (opens new window)
# 3.1 打开软件自带样例
导航栏File->new->other->examples->AADL examples
# 3.2 打开本地项目
导航栏File->Open Projects From File System
# 3.3 实例化AADL文件
点击一个aadl文件,然后点击导航栏osate->instantiate
# 3.4 检查流延迟
对AADL的分析,有很多种,比如检查流延迟,但这些分析只能对实例化的结果进行分析
选择一个实例化结果,然后点击导航栏analyses->timing->check flow latency
# 3.5 根据AADL文件自动生成可视化的Diagram图
右键选择aadl文件,选择Create Diagram
我们对Diagram的修改,会导致aadl文件进行相应的调整
# 3.6 官方帮助文档
导航栏help->help contents
# 4. AADL属性(基于osate)
# 4.1 属性的查看方法
AADL Property Values视图用于以结构化的方式显示和编辑参数值,这通常比直接导航和操作AADL文本文件更容易。
显示方式:
window->show view->aadl property values
即可打开该视图
注:需要选中一个aadl文件,初始时状态列表为空,当双击任意属性时,会出现该属性参数信息
# 4.2 属性值类型
属性值(Property Values)和我们平时代码里的变量类似
属性值有四种类型:
- 列表(Lists):列表值可以展开以显示单个列表元素。
- 文本(Records):记录值可以展开以显示其字段。
- 范围(Ranges):范围值可以扩展以显示最小值、最大值和增量值。
- 模式(Modes):可以扩展模式属性值,以显示每个模式的不同值。
例:Sampler_B有两个属性,Programming_Properties属性的Spurce_Text值为Lists类型,Timing_Properties属性的Period值为Records类型
例:Received_Prime属性Data_Model的Data_Representation值为Modes类型(待验证)
# 4.3 属性状态
属性状态有六种类型:
- local:本地属性
- local contained:本地包含属性
- shared local contained:共享本地包含属性
- inherited:继承属性
- default:系统默认值
- undefined:不明确的属性
# 4.4 Local属性
local属性是最基本的属性,它直接AADL模型元素的属性子句或大括号中定义
例:car的属性mine具有三个local属性Car_Length、Position、Car_Name
device car
properties
mine::Car_Length => 3.25 meter;
mine::Position => [ x => 3; y => 4; ];
mine::Car_Name => [ US => "Rabbit"; Germany => "Golf"; ];
end car;
# 4.5 (shared)local contained属性
包含属性是在属性子句中定义的,并使用applies to子句应用于嵌套模型元素。
- local contained属性是应用于单个元素。
- shared local contained属性应用于同一个子句中的多个元素。
例:local contained
在下图中,该视图显示了数据端口(功能)GPS_data的属性,Input_Rate是local contained
属性,因为它的值是在包含进程类型Blended_Navigation的属性子句中定义的,注意该属性值末尾语法applies to GPS_Data。
例:shared local contained
修改上面例子中进程类型Blended_Navigation属性子句中的定义,然后属性Input_Rate
在特性INS_Data
(and GPS_Data)就是shared local contained
的。
# 4.6 Inherited属性
顾名思义,继承,继承父构件的属性
例:在下图中,Dispatch_Protocol
就是inherited
,因为它是定义在Prime_Reporter
并由Prime_Rreporter_One
扩展。
# 4.7 default属性
default属性表示所选元素的属性值没有在任何模型元素上定义,而是来自属性的默认值声明。具有default的属性通常不会显示在视图中。工具栏按钮Show default property values可用于切换的显示具有default的属性。
# 4.8 undefined属性
undefined属性表示该属性对于选定的模型元素没有值。这些属性适用于选定的元素,因此它们可能具有选定属性持有者的值。具有undefined的属性通常不会显示在视图中。工具栏按钮Show undefined properties可用于切换的显示具有undefined的属性。
# 4.9 Open Property Association操作
官方解释:此操作将打开在AADL文本编辑器中提供显示属性值的属性关联
个人理解:找到该属性最早被赋值的地方
# 5. AADL构件详细介绍
AADL规则要求软件构件必须通过binding关系映射到执行平台构件。通过binding定义了代码在哪执行,以及数据和可执行代码在哪存储。例如进程必须在memory内。软件和执行平台构件的集合在分层系统结构建模中可以表示虚拟机层。
# 5.1 Bindings
绑定(bindings):系统实现内部软件构件到硬件构件的映射(mapping),具体是指:thread binds to processor; process, data and port bind to memory。
# 5.2 构件命名规则
构件类型和构件实现的名称必须是合法的AADL标识符,不能是AADL备用字(类似于其他语言的关键字)
合法的AADL标识符,以字母和数字组合而成(不能以数字开头,字母和数字之间可以用_
分隔)
# 5.3 构件类型的声明
以一个声明指定了thread构件的接口为例:
thread <name>
extends
features
flows
properties
thread后面紧跟名称,这是构件的定义子句,定义这是一个叫做<name>
的thread构件,这个构件具有thread的特性,它的特性是不可见的
extends、features、flows、properties是构件的描述性子句,叫作构件的外部可见特性,其中:
- flows指定了不同的抽象的信息传输通道
- extends允许一个构件类型声明拥有另一个构件类型的描述性子句,并且可以进行修改和添加
# 5.4 packages
AADL软件包将构件声明的集合用它们自己的名称空间组织成单独的单元。具有共同特征的元素可以被分组在一个包中,并使用包的名称进行引用。通过这种为每一组子系统元素提供不同的名称空间,软件包支持针对大型系统的不同子系统的AADL模型的独立开发。
例:一个进程类型的声明
- 为speed_control定义了数据输入和输出接口
- end语句结束进程说明和软件包说明
- 包名叫test_package,即aadl文件叫test_package,即一个aadl文件就是一个软件包
package test_package
public
process speed_control
features
input_speed: in data port;
output_cmd: out data port;
end speed_control;
end test_package;
# 5.5 软件构件
# 5.5.1 process
- 介绍
Process表示受保护的地址空间,当外部构件访问进程内部元素时受保护,地址空间包括:与进程直接相关的可执行二进制图像(可执行代码和数据)、与进程子构件直接相关的可执行二进制图像、通过外部构件引用的服务子程序(可执行代码)。Process的属性可以说明:memory保护的执行时间、相关的源文件信息、源文件加载时间、调度协议、绑定约束。
- 约束
表明:
- 实现才允许有子构件,且进程子构件只能有data、thread、thread group三种形式。data作为子构件时,有实现则用实现,没实现则用类型。
- 进程类型的特征可以有四种形式
- 进程实现不允许有子程序调用
- 注意
进程中没有隐式线程,所以我们在进程中至少要创建一个线程,用于主动执行线程内的代码。
# 5.5.2 thread
- 介绍
线程表示从源码有序执行的并发可调度的单位。多线程表示并发执行的路径。线程可以分配多个属性,包括定时(例如最坏执行时间)、分派协议(例如周期性、不定期性)、memory大小、处理器绑定。
- 线程执行
线程执行的图形状态机表示:
- 圆角矩形表示一个或多个执行状态。椭圆表示非执行状态。有向弧表示转移,其中小圆圈可以表示起始、终结、分叉和连接。
- 线程的执行状态:Initialize、Compute、Recover的入口点是预先声明的。
Initialize
和Compute
入口点用于正常执行。- 线程出错后,源文本可以处理;如果源文本不处理,线程请求恢复以便下次分派;如果错误是不可恢复的,则线程会以out event data port错误传送出去
- 属性
预定义的属性可以对线程每个执行阶段进行详细描述。线程的执行阶段有以下六个:
- Initialize:进行应用程序的特定初始化
- Activate:在模式切换之间恢复应用程序状态
- Compute:表示在每次线程分派时被执行的代码
- Recover:线程执行故障恢复动作
- Deactivate:在模式切换之间保存应用程序状态
- Finalize:因为进程中止或退出时线程被终止
每个执行阶段都有execution time
和deadline
此外,线程属性还有分派协议Dispatch_Protocol
,其可选项有定期的periodic(每隔一个周期线程重新分派)、不定期的aperiodic(事件触发线程的分派)、不定时的sporadic(在最小分派间隔内事件驱动线程的分派)、背景的background(分派后初始化执行直到完成)
例:列出了compute、initialize执行阶段
thread control
properties
-- nominal execution properties
Compute_Entrypoint => "control_ep";
Compute_Execution_Time => 5ms..10ms;
Compute_Deadline => 20ms;
Dispatch_Protocol => Periodic;
-- initialization execution properties
Initialize_Entrypoint => "init_control";
Initialize_Execution_Time => 2ms.. 5ms;
Initialize_Deadline => 10ms;
end control;
- 约束
表明:线程实现的子构件只能是data,可以有子程序调用。
- 注意
线程必须被包含在进程或线程组中
# 5.5.3 thread group
- 介绍
线程组是为了逻辑组织线程、数据而出现的构件抽象。为在设计中关注点的分隔提供了基础,为许多线程及其相关数据的引用只需要定义一个引用接口。
- 约束
表明:线程组实现的子构件可以是数据、线程、线程组,不允许有子程序调用
- 注意
线程组只能作为进程或者其他线程组的子构件
# 5.5.4 Data
- 介绍
data表示静态数据和系统中数据类型。data构件的声明常用来表示:
- 应用程序数据类型(eg:用作端口和参数上的数据类型)
- 通过data构件实现的声明中的data子构件实现数据类型的子结构
- 数据实例
- 约束
表明:data实现的子构件只能是data(当然没实现的时候可以用类型,有实现的时候必须用实现),不允许子程序调用
# 5.5.5 大例子1
- 前置知识——什么是构件实现的声明
以一个thread构件实现的声明格式为例:
其中:implementationidentifier表示该构件实现的标识符,它与typeidentifier即构件类型标识符共同构成该构件实现的名字
- 例子
-- 声明一个进程构件类型,其标识符为control_processing
process control_processing
features
input: in data port sensor_data;
output: out data port command_data;
end control_processing;
-- 声明一个名为control_processing.speed_control(该实现标识符是speed_control)的进程构件实现
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;
-- 声明一个名为control_in线程构件类型
thread control_in
end control_in;
-- 声明一个名为control_in.input_processing_01线程构件的实现
thread implementation control_in.input_processing_01
end control_in.input_processing_01;
-- 声明一个名为control_out线程构件类型
thread control_out
end control_out;
-- 声明一个名为control_out.output_processing_01线程构件的实现
thread implementation control_out.output_processing_01
end control_out.output_processing_01;
-- 声明一个名为sensor_data数据构件类型
data sensor_data
end sensor_data;
-- 声明一个名为command_data数据构件类型
data command_data
end command_data;
从上面例子中我们可以看出:
- 各构件的类型、实现声明的格式。例如后加end
- 对于某些子条款为空时,可以不写出来
- 子构件的写法 (前面可以起别名,实现的子构件一般为实现)
# 5.5.6 Subprogram
- 介绍
subprogram抽象表示可顺序执行的源文本,是可调用构件,为调用它的构件提供服务功能或数据操作。可以表示:
- data操作的一种方法调用
- 基本程序调用和顺序调用
- 远程服务/程序调用
这些调用包括data转移(进或出)的subprogram。参数以feature的形式声明,为一个subprogram提供data转移的接口。
- 例:data操作的方法调用
特征scale_acc_data表示对data构件accelerometer_data进行操作的源文本的入口点
subprogram scale_data
end scale_data;
subprogram implementation scale_data.scale_sensor_data
end scale_data.scale_sensor_data;
data accelerometer_data
features
scale_acc_data: provides subprogram access scale_data.scale_sensor_data;
end accelerometer_data;
process sensor_systems
end sensor_systems;
process implementation sensor_systems.sensor_processing
subcomponents
acc_data: data accelerometer_data;
scale_it: thread process_data.scale;
end sensor_systems.sensor_processing;
thread process_data
end process_data;
thread implementation process_data.scale
end process_data.scale;
- 属性
subprogram属性可以对以下方面声明:为子程序的源文本声明、memory需求、memory绑定、与calls有关的特征
- 约束
# 5.6 硬件构件
# 5.6.1 processor
- 介绍
processor是负责调度和执行线程的硬件和相关软件的抽象
- 范例
processor Intel_Linux
properties
Hardware_Source_Language => VHDL;
Hardware_Description_Source_Text => ("intel_vhdl_1", "intel_vhdl_2");
end Intel_Linux;
processor implementation Intel_Linux.Intel_Linux_01
subcomponents
HSRAM: memory RAM.Intel_RAM;
end Intel_Linux.Intel_Linux_01;
memory RAM
end RAM;
memory implementation RAM.Intel_RAM
end RAM.Intel_RAM;
- 约束
表明:不能有子程序调用,其连接只能是总线访问。
# 5.6.2 memory
- 介绍
memory表示存储数据和可执行代码的构件。可以是随机可访问的物理存储(如RAM\ROM),也可以是永久存储(如disk、reflective memory)。memory可以在processor内,也可以作为单独的执行平台构件,通过bus与processor连接。
- 范例
memory RAM
features
bus01: requires bus access membus.hsbus;
end RAM;
--
memory implementation RAM.compRAM
subcomponents
HSRAM01: memory XRAM.HSRAM;
SRAM01: memory XRAM.SRAM;
end RAM.compRAM;
--
memory XRAM
end XRAM;
--
memory implementation XRAM.HSRAM
end XRAM.HSRAM;
--
memory implementation XRAM.SRAM
end XRAM.SRAM;
--
bus membus
end membus;
--
bus implementation membus.hsbus
end membus.hsbus;
- 属性
memory的属性包括:memory访问协议、word size、存储单元的其他重要描述特征、memory访问默认值(Memory_Protocol)是read-write,但是可以改成read only or write only。
- 约束
- 注意
memory构件只能被包含在memory,processor或者system构件中。此外,一个单独的memory构件必须被包含在processor中或者通过bus连接到一个processor。
# 5.6.3 bus
- 介绍
bus代表支持物理构件之间交互所要求的物理硬件和关联通信协议。总线的示例是PCI总线、VME总线、CAN总线、以太网和无线网络。总线通常用于连接计算机硬件构件。还能够使用总线构件表示物理资源,如分配给物理构件的电源和计算机硬件构件。
- 范例
一个处理器类型说明和两个总线类型说明。处理器类型说明Intel_Linux包括一个用于总线类型memory_bus的要求的总线访问说明。而总线类型说明memory_bus包括一个用于总线类型network_bus的要求的总线访问。
bus memory_bus
features
NBA: requires bus access network_bus;
end memory_bus;
--
bus network_bus
end network_bus;
--
processor Intel_Linux
features
MBA: requires bus access memory_bus;
end Intel_Linux;
例如,处理器和存储器要求访问总线,以使处理器能够使用存储器,或者能够经由一个USB总线与照相机通信。对总线访问的需求定义于处理器和存储器的类型说明之中,而与总线的连接则是在包括处理器、存储器和总线的系统实现内明确说明的。总线能够与其他总线直接连接,以表示互联网的通信。它是通过总线类型内要求的总线访问特征以及这些总线实例之间的明确的连接说明规定的。
- 属性
- 连接 (eg:规定所支持的连接类别的Allowed_Connection_Type)
- 消息尺寸 (eg:Allowed_Message_Size)
- 传输时间 (eg:Transmission_Time)
- 硬件源语言描述 (eg:Hardware_Source_Language)
- 约束
- 注意
bus构件只能是system构件的子构件
# 5.6.4 device
- 介绍
device表示与外部环境交互的实体。抽象代表诸如传感器和作动器或发动机一类嵌入式软件系统的接口的实体。一个device有复杂的连接方式,如与processor通过bus连接,与软件构件通过logical connections连接。
一个device可以被看作:
- 通过端口与应用软件连接的物理构件
- 应用系统中的一部分,用于执行平台构件和应用系统的交互
- 被应用系统访问或者控制的环境的一部分
- 范例
该范例描述了通过总线与处理器speed_processor交互的设备speed_sensor。处理器执行用于speed_sensor的设备驱动。
device speed_sensor
features
BA2: requires bus access marine_bus;
raw_rate: out data port;
end speed_sensor;
--
bus marine_bus
end marine_bus;
--
bus implementation marine_bus.impl
end marine_bus.impl;
--
processor speed_processor
features
BA1: requires bus access marine_bus;
end speed_processor;
- 属性
device的属性包括了软件和硬件两部分属性。软件属性:源代码文件、源代码语言、代码大小、执行平台绑定属性;硬件属性:硬件描述语言。
- 约束
# 5.7 复合构件
系统构件
- 介绍
system表示软件、硬件和系统构件的复合体。system可以表示复杂系统的系统,也可以表示集成软硬件的专一应用系统(如飞机导航系统、数据库服务器)。
- 范例
system integrated_control
end integrated_control;
--
system implementation integrated_control.PBA
subcomponents
control_process: process controller.speed_control;
set_point_data: data set_points;
navigation_system: system core_system.navigation;
real_time_processor: processor rt_fast.rt_processor;
hs_memory: memory rt_memory.high_speed;
high_speed_bus: bus network_bus.HSbus;
end integrated_control.PBA;
- 约束
# 5.8 抽象构件
- 介绍
抽象构件类别是在不选择它们运行时类别的情况下,允许说明构件类型和实现的通用类别。利用这种类别,能够开发:
- 系统体系结构的概念性组件基视图
- 通用的组件基参考体系结构
- 能够示例和适用于一个体系结构(例如,作为一个方面适用的冗余模式)的体系结构模板或模式。
如果需要的话,能够将这些通用说明在线程、线程组、进程、系统、数据、子程序、处理器、虚拟处理器、总线、虚拟总线和设备中进行细化。通过为体系结构权衡研究以及分析(例如:全系统延迟分析可以在尚未定义所包括的组件的运行时特性的情况下进行)的表示方法提供替代方案,在开发的早期阶段,这种技术方法是特别有用的。
- 范例
abstract integrated_control
end integrated_control;
--
abstract implementation integrated_control.PBA
subcomponents
control_process: process controller.speed_control;
set_point_data: data set_ponits;
navigation_system: system core_system.navigation;
real_time_processor: processor rt_fast.rt_processor;
hs_memory: memory rt_memory.high_speed;
high_speed_bus: bus network_bus.HSbus;
error_response: abstract error_manager.real_time;
end integrated_control.PBA;
--
system integrated_control_sys
extends integrated_control
end integrated_control_sys;
-- 将抽象的组件实现扩展为系统类别的说明
system implementation integrated_control_sys.PBA
extends integrated_control.PBA
end integrated_control_sys.PBA;
- 属性
可用于其他类别的所有属性均适用于抽象构件。但是,当将抽象构件细化为一个非抽象构件时,只有对非抽象类别有效的那些属性是适用的。
# 6. 构件交互
通过连接、调用和绑定来建立各构件之间的关系,定义构件的交互。
# 6.1 端口和连接
端口是用于数据、事件或数据和事件两者的输入或输出定向传输的接口。
- 端口说明
name: <direction> <port type> [data identifier] [{properties}];
通过端口的信息流的方向用端口方向备用字:in、out或in out定义。方向in表示构件的输入,方向out表示构件的输出,方向in out表示一个端口既可以用于输入也可以用于输出。
示例:数据端口、事件端口和事件数据端口
process control
features
speed: in data port raw_speed {Source_Name => "RawSpeed";};
disable: in event port {Required_Connection => false;};
set_speed: in event data port raw_speed.setpt;
end control;
--
data raw_speed
end raw_speed;
--
data implementation raw_speed.setpt
end raw_speed.setpt;
- 端口连接说明
name: port <source port> <connection symbol> <destination port> [{properties}] [in modes and transitions];
<connection symbol>
可以是→也可以是←→,代表连接可以是单向的也可以是双向的。属性则包括了连接有关的协议属性。输入模式和转换,则是实体将连接与特定模式或模式转换联系起来。换句话说就是指定了模式的话就表示,该连接在指定的模式中是有效的,在另一种模式中是无效的。同理,连接仅在模式转换期间是有效的。
示例:
process control
features
command_data: out data port;
sensor_data: in data port;
set_speed: in data port;
disengage: in event port;
end control;
-- PBA控制功能
process implementation control.speed
subcomponents
scale_speed_data: thread read_data.speed;
speed_control_laws: thread control_laws.speed;
connections
DC1: port sensor_data -> scale_speed_data.sensor_data;
DC2: port scale_speed_data.proc_data -> speed_control_laws.proc_data;
DC3: port speed_control_laws.cmd -> command_data;
DC4: port set_speed -> speed_control_laws.set_speed;
EC1: port disengage -> speed_control_laws.disengage;
end control.speed;
# 6.2 总线访问和连接
嵌入式系统的计算机硬件构件和物理构件,在物理上是经由总线互相连接的。可通过说明一个组件(如处理器或传感器设备)访问某种类型的总线的需求,并通过总线访问连接说明做到这一点。
示例:为油门操纵杆提供总线访问和连接
device actuator
features
cmd: in data port;
BA1: requires bus access Marine.Standard;
end actuator;
-- 响应PBA命令的油门操纵杆
device implementation actuator.speed
end actuator.speed;
-- 总线
bus Marine
end Marine;
--
bus implementation Marine.Standard
end Marine.Standard;
-- 封闭系统类型
system Complete
end Complete;
-- 封闭系统实现(说明分组件实例和它们的连接)
system implementation Complete.PBA_speed_control
subcomponents
throttle: device actuator.speed;
Standard_Marine_Bus: bus Marine.Standard;
connections
BAC1: bus access Standard_Marine_Bus <-> throttle.BA1;
end Complete.PBA_speed_control;
# 7. 系统流
流允许对整个体系结构的逻辑路径进行表述和分析。在流的支持下,能够说明构件的流规范。流规范定义了从构件输入到构件输出的逻辑流。
# 7.1 流规范的说明
流规范说明包括在构件类型说明的flows部分之中,并在流中确定组件的角色。
三个流规范的模板:
- 流源:定义构件中一个流的起源,借助流出特征从构件中流出
- 流汇:定义构件中一个流的终止,借助流入特征流入构件
- 流路径:定义借助流入特征流入构件和借助流出特征从构件中流出的一个流
# 7.2 端对端流说明
端对端流详述了从一个构件开始到另一个构件结束的一个路径。
端对端流说明:
# 8. 模型开发
建立一个一维速度控制系统模型,进行调度分析。速度控制功能是汽艇自动驾驶仪(PBA)系统的一部分。
# 8.1 模型构件的定义
审查PBA速度控制装置,定义一个简化的速度控制模型。在该模型中,需要用到一个用于输入PBA相关信息的驾驶员接口单元、一个用于为PBA传送速度数据的速度传感器,以及一个用于响应PBA命令的油门操纵杆。由于我们最开始开发的是一个概念模型,因此我们将组件类别限制为系统、进程和设备。
device sensor
features
sensor_data: out data port;
end sensor;
-- 用于为PBA传送速度数据的速度传感器
device implementation sensor.speed
end sensor.speed;
--
device interface
features
set_speed: out data port;
disengage: out event port;
end interface;
-- 输入PBA相关信息的驾驶员接口单元
device implementation interface.pilot
end interface.pilot;
--
process control
features
command_data: out data port;
sensor_data: in data port;
set_speed: in data port;
disengage: in event port;
end control;
-- PBA控制功能
process implementation control.speed
end control.speed;
--
device actuator
features
cmd: in data port;
end actuator;
-- 响应PBA命令的油门操纵杆
device implementation actuator.speed
end actuator.speed;
将速度传感器、驾驶员接口和油门操纵杆建模为设备,并将PBA控制功能表示为一个进程。不进行深入的分解。
# 8.2 顶层模型的开发
将各个构件的模型的实现集成到一个系统中
-- 封闭系统类型
system Complete
end Complete;
-- 封闭系统实现(说明分组件实例和它们的连接)
system implementation Complete.PBA_speed_control
subcomponents
speed_sensor: device sensor.speed;
throttle: device actuator.speed;
speed_control: process control.speed;
interface_unit: device interface.pilot;
connections
DC1: port speed_sensor.sensor_data -> speed_control.sensor_data;
DC2: port speed_control.command_data -> throttle.cmd;
DC3: port interface_unit.set_speed -> speed_control.set_speed;
EC4: port interface_unit.disengage -> speed_control.disengage;
end Complete.PBA_speed_control;
在系统实现中,说明了四种分组件。三种分组件代表速度传感器、油门杆和驾驶员接口单元,进程分组件speed_control代表为PBA提供速度控制的软件。同时,为各分组件的每个端口定义了连接。
# 8.3 控制软件的细节描述
对进程speed_control进行详细构建,将速度控制功能交由两个分构件实现,第一个分构件是接收速度传感器的输入、确定数据的比例和对数据滤波,并向第二个线程发送处理数据的线程。第二个分构件是执行PBA速度控制规则,并将命令送给油门杆的线程。
由于两个线程的接口是不同的,故而为每种线程定义了类型和实现。每个线程均为周期为50ms的周期性线程。
-- PBA控制线程的说明
-- 线程一:接收速度传感器的输入,向第二个线程发送处理后的数据
thread read_data
features
sensor_data: in data port;
proc_data: out data port;
properties
Dispatch_Protocol => Periodic;
Period => 50 ms;
end read_data;
--
thread implementation read_data.speed
end read_data.speed;
-- 线程二:执行PBA速度控制规则,并将命令送给油门操纵杆的线程
thread control_laws
features
proc_data: in data port;
cmd: out data port;
disengage: in event port;
set_speed: in data port;
properties
Dispatch_Protocol => Periodic;
Period => 50 ms;
end control_laws;
--
thread implementation control_laws.speed
end control_laws.speed;
向进程实现control.speed添加这两个线程,以及描述它们的交互(connection)。
-- PBA控制功能
process implementation control.speed
subcomponents
scale_speed_data: thread read_data.speed;
speed_control_laws: thread control_laws.speed;
connections
DC1: port sensor_data -> scale_speed_data.sensor_data;
DC2: port scale_speed_data.proc_data -> speed_control_laws.proc_data;
DC3: port speed_control_laws.cmd -> command_data;
DC4: port set_speed -> speed_control_laws.set_speed;
EC1: port disengage -> speed_control_laws.disengage;
end control.speed;
# 8.4 添加硬件构件
此刻,我们已经定义了速度控制系统的软件构件,现在该定义支持软件所要求的执行硬件:处理器、存储器和总线。处理器将执行PBA控制代码 (线程),而存储器将存储系统的可执行代码 (进程),总线则为系统提供物理路径。
-- 执行平台说明
-- 声明处理器类型,用于执行PBA的控制代码(线程)
processor Real_Time
features
BA1: requires bus access Marine.Standard;
end Real_Time;
--
processor implementation Real_Time.one_GHz
end Real_Time.one_GHz;
-- 声明存储器类型,用于存储系统的可执行代码(进程)
memory RAM
features
BA1: requires bus access Marine.Standard;
end RAM;
--
memory implementation RAM.Standard
end RAM.Standard;
-- 总线
bus Marine
end Marine;
--
bus implementation Marine.Standard
end Marine.Standard;
在代码中,处理器Real_Time和存储器RAM均声明了对总线实现Marine.Standard的访问。
# 8.5 物理连接的说明
在上一节中,我们定义了执行硬件,在这一节中,我们要将这些硬件集成到我们的系统中,同时将所有硬件构件与总线连接起来。
system implementation Complete.PBA_speed_control
subcomponents
speed_sensor: device sensor.speed;
throttle: device actuator.speed;
speed_control: process control.speed;
interface_unit: device interface.pilot;
RT_1GHz: processor Real_Time.one_GHz;
Standard_Marine_Bus: bus Marine.Standard;
Stand_Memory: memory RAM.Standard;
connections
DC1: port speed_sensor.sensor_data -> speed_control.sensor_data;
DC2: port speed_control.command_data -> throttle.cmd;
DC3: port interface_unit.set_speed -> speed_control.set_speed;
EC4: port interface_unit.disengage -> speed_control.disengage;
BAC1: bus access Standard_Marine_Bus <-> speed_sensor.BA1;
BAC2: bus access Standard_Marine_Bus <-> RT_1GHz.BA1;
BAC3: bus access Standard_Marine_Bus <-> throttle.BA1;
BAC4: bus access Standard_Marine_Bus <-> interface_unit.BA1;
BAC5: bus access Standard_Marine_Bus <-> Stand_Memory.BA1;
end Complete.PBA_speed_control;
# 8.6 软件对硬件的绑定
在系统构件的实现中使用属性关联,将软件构件绑定到相应的物理构件上。前两个说明表示将线程speed_control_laws和线程scale_speed_data绑定到处理器RT_1GHz。最后一个说明表示将进程speed_control中代码和数据绑定到存储器构件Standard_Memory。
properties
Allowed_Processor_Binding => (reference(RT_1GHz)) applies to speed_control.speed_control_laws;
Allowed_Processor_Binding => (reference(RT_1GHz)) applies to speed_control.scale_speed_data;
Actual_Memory_Binding => (reference(Stand_Memory)) applies to speed_control;
# 8.7 绑定和调度分析
只要定义了线程,并且建立了它对处理器的绑定,就可以开始评估处理器的负载,并分析系统的可调度性。在进行调度分析之前,需要定义线程的必要执行特性。给线程read_data分配执行时间范围1~2ms,给线程control_laws分配执行时间范围3~5ms。这些执行时间估值可以来自类似系统的原型代码或历史数据的时序测量结果为基础。
-- 线程一:接收速度传感器的输入,向第二个线程发送处理后的数据
thread read_data
features
sensor_data: in data port;
proc_data: out data port;
properties
Dispatch_Protocol => Periodic;
Compute_Execution_Time => 1 ms .. 2 ms;
Period => 50 ms;
end read_data;
-- 线程二:执行PBA速度控制规则,并将命令送给油门操纵杆的线程
thread control_laws
features
proc_data: in data port;
cmd: out data port;
disengage: in event port;
set_speed: in data port;
properties
Dispatch_Protocol => Periodic;
Compute_Execution_Time => 3 ms .. 5 ms;
Period => 50 ms;
end control_laws;
此刻,我们已经定义了一个用以描述实用配置的、包括所有构件、属性和绑定的简单速度控制系统的说明性模型。根据该说明性模型的顶层系统实现,建立系统的实例模型,利用osate调度分析插件分析该模型。分析结果如下:
系统中两个线程只使用了14%的处理器能力。两个线程的最长执行时间是7ms,它是其50ms执行周期的14%:
由插接提供的有关线程实际绑定信息:
# 9. OSATE模型分析功能
# 9.1 流延迟分析
查看端对端延迟要求是否得到满足。该工具跟踪该通路以及流的各独立要素得到的总延迟与为一个端到端的预计的延迟进行比较,生成分析报告。AADL的重要能力之一就是能够建模和分析整个系统的流路径,osate工具很好的支持了这一能力。
# 9.2 总线负载分析
查看系统中绑定到总线的连接和虚拟总线,并检查总线是否具有承载必要数据的能力。
# 9.3 调度分析
- 绑定和调度线程:一种装箱资源分配工具,确保满足可调度性和绑定。
- 调度绑定的线程:绑定到处理器的周期性线程的速率单调分析。
- 检查速率单调优先级分配:对于具有分配优先级的周期性线程,确保分配的优先级符合RMA规则。
# 9.4 检查绑定的约束
检查模型是否符合绑定属性中指定的各种约束
# 9.5 模型维护
- 查找未使用的分类符:查找未使用的构件
- 模型统计:返回有关系统的基本统计信息,如构件的数量、端到端的流、连接等
# 9.6 其他分析
osate还提供了一组插件用于验证模型或将其与其他工具连接。用户可以开发自己的插件,将AADL模型与其他工具连接起来。