介绍
- 本文主要介绍AADL软件类组件Process、Thread、Thread Group、Data、Subprogram、Subprogram Group的功能和基本用法。
- 这些被称作进程、线程组和线程的类别用于表示应用的任务体系结构。它们还表示应用软件产品(例如、称作数据组件的数据类型、静态和局部数据)和可执行代码(例如,称作子程序和子程序组的功能和程序库,以及源代码库)。
目录
Process(进程)
介绍
- Process表示通过代码能够与其他线程并行执行的代码的执行路径。它是指定(绑定)执
行处理器的一个可调度的单元。处理器调度线程并执行与该线程关联的代码。Process抽象表示一个受保护的地址空间,一个空间分区,其中提供保护,防止其他组件访问进程内部的任何东西。
约束
- 从图中我们可以看出
- 定义process可以使用features(features内可提供端口、 特征组、提供的数据访问、请求的数据访问等)、flows、properties组件;
- 在实现的时候,可以有subcomponents、connections、flows、flows、modes、properties组件;
- 不可以有sybprogram call(子程序调用)组件。
进程中没有隐式线程,所以我们在进程中至少要创建一个线程,用于主动执行线程内的代码。
范例
- 作用:创建一个进程controller,有两个端口,一个作为进程的input,一个作为进程的output,然后通过speed对controller进行实现,具体实现省略。
- 代码:
process controller
features
input: in data port;
output: out data port;
end controller;
process implementation controller.speed
subcomponents
control_input: thread control_in.basic;
control_output: thread control_out;
control_threads: thread group control_all;
set_point_data: data setpoint_data;
end controller.speed;
- osate内展示:
注:因为省略了具体的实现,所以代码不完整,不能进行实例化等操作,但可以生成Diagram图
- Diagram图:
- 顶层图
- controller.speed图
- 顶层图
Thread(线程)
介绍
- 线程是通过源代码进行顺序执行的并发可调度单元。多个线程表示并发的执行路径。可以为线程分配各种执行属性,包括时间(例如,最坏情况下的执行时间)、调度协议(例如,周期性、非周期等),内存大小和处理器绑定。
- 一个AADL线程可以通过操作系统线程实现,或者多个AADL线程也可以作为逻辑线程映射到单个操作系统线程。
Period属性(周期基调度)
- 线程能够按照Period属性(称为周期基调度)的规定,以固定的时间间隔反复发送,或者能够由于在线程的事件数据端口或事件端口上的数据或事件的到达而发送(称为端口触发型发送)。在后一种情况下,线程会在一个消息的到达或事件为空转时立即发送,或者在一旦当前执行完成时再进行发送。
Dispatch_Protocol(发送协议)
- Dispatch_Protocol(发送协议)属性的数值定义了一个线程的发送特性。具有规定语
义的标准发送协议数值是 periodic(周期)线程、aperiodic(非周期)线程、sporadic(偶
发)线程、timed(定时)线程、hybrid(混合)线程和 background(背景)线程。- periodic(周期)线程具有周期基的发送(重复的、固定时间间隔的发送),假定在下一个发送之前上一个执行已经完成的话。
- aperiodic(非周期)线程具有端口基的发送,如果线程仍在执行上一个发送,这些线程可以是列队的。
- sporadic(偶发)线程具有端口触发型发送,且具有发送是延时的附加限制,如果
上一个发送已经发生但发送执行时间小于线程周期所规定的时间的话。 - timed(定时)线程是在由 Period属性规定的时间之后发送的,除非它们是通过一个事件甚至数据的到达发送的,以便在上一次发送后的一个给定的时间间隔内,如果没有输入到达的话,能有效地提供一个暂停时间。
- hybrid(混合)线程是通过时间或时间数据到达的发送,和周期性的发送。对于周期性线程、定时线程和混合线程来说,必须说明线程的 Period 属性的数值。
- background(背景)线程只发送一次且执行完成。除了标准协议之外,能够通过修改的枚举类型 Supported_Dispatch_Protocols——这些协议可在 AADL_Project 属性集中找到——引进项目特定的发送协议。
线程的作用
- 用于初始化线程的Initialize;
- 用于正常执行的Compute;
- 用于从故障状态恢复的Recover;
- 在线程转为有效(可作为给定模式的一部分执行)的模式转换下 Activate(激活)以恢复线程状态;
- 在线程无效(不可作为模式的一部分执行)的模式转换下 Deactivate(去激)以避免线程状态;
- 用于清理活动的 Finalize。
运行时状态
- 当线程处在运行时,但不是正在执行的活动时,他们可能处于如下的状态;
- 当在当前模式线程为有效且已准备好发送时为 Suspended-D;
- 当在当前模式线程为无效且不可发送时为 Suspended-M;
- 当线程执行被具有较高优先级的线程所先占时为 Suspended-P;
- 当在线程被堵塞以等待由另一个线程锁定的资源时为 Suspended-B;
- 当线程被停止并要求在能够执行之前进行初始化时为 Halted。
约束
- 从图中我们可以看出
- Thread实现的子构件只能是data,可以有子程序调用
Thread必须被包含在进程或线程组中。
范例
- 作用:线程control_laws具有输入sensor_data和输出cmd使用的两个端口,通过speed实现,在speed的子程序中,借助data进行数据访问。
- 代码:
package test_package
public
thread control_laws
features
sensor_data: in data port;
cmd: out data port;
end control_laws;
data static_data
end static_data;
thread implementation control_laws.speed
subcomponents
stability_data: data static_data;
end control_laws.speed;
end test_package;
-
osate内展示:
-
Diagram图:
- 顶层图:
- 将实现的内部方法展开图:
- 顶层图:
Thread Group(线程组)
介绍
- 线程组是一种组件抽象,用于逻辑地组织进程中的线程、数据和线程组组件。线程组并不表示虚拟地址空间或执行单位。
- 一个进程内希望有尽可能多的线程。
- 线程组内的线程通过其线程组的接口与其他线程进行交互。
约束
范例
- 代码:
package test_package
public
thread group control
features
sensor_data: in data port;
cmd: out data port;
properties
Period => 50 ms;
end control;
thread group implementation control.speed
subcomponents
control_algortihms:thread group control_algorithms;
data_scaling: thread data_scaling;
control_data: data control_data;
end control.speed;
data control_data
end control_data;
thread data_scaling
end data_scaling;
thread group control_algorithms
end control_algorithms;
end test_package;
-
osate内展示:
-
Diagram图:
- 顶层图:
- 将实现的内部方法展开图:
- 顶层图:
Data(数据)
介绍
- Data能够抽象表示数据实例、数据类型(用作端口和参数上的数据类型)、数据实现声明中的数据子结构。
- 应用程序系统中的数据类型可以通过数据组件类型和实现声明进行建模。数据类型和实现声明可用于定义与端口和参数关联的数据。
- 用数据组件类型和相关的属性声明对应用程序源文本数据类型进行建模就足够了,不需要声明数据实现。
- 可以对与端口和参数之间的连接关联的数据类型进行一致性检查。
- 数据子组件声明可用于定义数据类型和实例的子结构。例如,记录的字段可以在数据实现声明中声明为数据子组件。
约束
数据分类符
- 数据分类符能够由特征和数据组件说明所引用。引用可以是对数据类型或对数据实现的引用。当其放在线程、线程组、进程或系统之中时,数据组件能够共享其访问的静态数据组件,表示放在一个子程序中作为局部数据。
范例
- 介绍:数据类型和实现有三种。error_data.control 组件实现有两个用于建模数据记录要素的数据分组件。一个是通信错误数据类型comm_error 的实例,另一个是错误数据类型 processor_error 的实例。如本例中所示,当说明数据分组件时,只包括对于数据类型说明(例如,数据实现 error_data.control的分组件说明)的引用,就已经足够。
- 代码:
package test_package
public
data error_data
end error_data;
data comm_error
properties
Source_Data_Size => 16 bits;
end comm_error;
data processor_error
properties
Source_Data_Size => 16 bits;
end processor_error;
data implementation error_data.control
subcomponents
Comm_data: data comm_error;
CPU_data: data processor_error;
end error_data.control;
end test_package;
- osate内展示:
- Diagram图:
- 顶层图:
- 将实现的内部方法展开图:
- 顶层图:
Subprogram(子程序)
介绍
- 子程序组件抽象表示一个可调用的组件,可以有参数也可以没有,子程序组件可以对数据进行操作,或向调用它的组件提供服务功能。子程序及其参数签名通过组件声明,但不作为子组件实例化。相反,对子程序的调用将在线程和子程序实现中的调用序列中声明。
- 一个 subprogram 表示可顺序执行代码的可调用单元。子程序类型定义了子程序的特征标志。子程序能够具有多个参数,这些参数只能够利用子程序调用进行传送,并由子程序调用送回。子程序能够具有要求的数据访问特征,以表示对持续状态的访问,或通过引用建模参数的传送。利用输出端口建模意外和错误的报告。
- 子程序实现表示子程序的内部构件。如果不需要建模子程序内部构件的话,并未要求规定子程序实现。在子程序范围内,数据分组件表示局部变量。我们还能够规定别的子程序的子程序调用序列。这些调用可以是本地的(被调用的子程序是在相同线程内作为该线程内置的调用执行的),也可以是外部的(被调用的子程序是在不同线程内执行的而不是线程内置的调用)。
约束
范例
- 介绍:序类型 scale_data 和实现说明 scale_data.sensor。分组件 scale_ ac_data是 data 组件 accelerometer 范围内的 scale_data.sensor 的实例。特征scale_data__access 建立了data 组件 accelerometer,该组件用于提供对于子程序实现 scaledata.sensor 的实例的访问。在这种情况下,访问是为分组件 scale_ace_data提供的。
- 代码:
package test_package
public
subprogram scale_data
end scale_data;
data accelerometer
features
scale_data_access: provides subprogram access
scale_data;
end accelerometer;
data implementation accelerometer.basic
subcomponents
scale_acc_data: subprogram scale_data;
end accelerometer.basic;
end test_package;
-
osate内展示:
-
Diagram图:
- 顶层图:
- 将实现的内部方法展开图:
- 顶层图:
Subprogram Group(子程序组)
介绍
- 通过说明带有提供的子程序访问特征的子程序类型,能够使用子程序组表示子程序库一类的可调用的例行程序的集合。类似于子程序,通过搁置将软件库复制到链接/加载程序的软件库数量的确定工作,能够通过子程序组类型建模软件库,或者能够通过子程序组分组件说明,明确说明软件库的实例。在子程序调用时,先引用子程序组类型或子程序组实例,再去引用提供的子程序访问特征(例如,filter_library.basic_ac)。
约束
范例
- 介绍:子程序组类型 filter_library 包括提供的子程序访问特征∶basic_acc、lowP_flter 和hiP_filter。子程序实现∶filter_library.BLH包括子程序组实例∶basic_filter、LowP_filter 以及对应于类型 filter_ibrary 的访问特征的 HiP_filter。例如,特征 basic_acc提供了对于作为分组件 basic_flter 的子程序filter_library.BLH的实例的访问
- 代码:
package test_package
public
subprogram filters
end filters;
subprogram implementation filters.basic
end filters.basic;
subprogram implementation filters.LowPass
end filters.LowPass;
subprogram implementation filters.HiPass
end filters.HiPass;
subprogram group filter_library
features
basic_acc: provides subprogram access
filters.basic;
lowP_acc: provides subprogram access
filters.LowPass;
hiP_acc: provides subprogram access
filters.HiPass;
end filter_library;
subprogram group implementation
filter_library.BLH
subcomponents
basic_filter: subprogram filters.basic;
lowP_filter: subprogram filters.LowPass;
hiP_filter: subprogram filters.HiPass;
end filter_library.BLH;
end test_package;
- osate内展示:
- Diagram图:
- 顶层图:
- 将实现的内部方法展开图:
- 顶层图:
结束
- AADL语法学习的过程中,有种当年学习C语言的感觉,但其实它没C语言那么复杂,只不过当年用了一个学期学C语言,现在却只学了两周的AADL,现在的时间比过去宝贵了太多,而且网上教程少,也没有老师可以请假,所以学起来,好累。
- 此时此刻是2022年1月1日,生活不熄,学习不止。