编辑推荐: |
本文来自于个人博客,本文在AADL基本知识了解的基础上,为了增强建模工具和验证工具Cheddar之间的互操作性,引入了AADL的四种经典通信设计模式,我希望对您的学习有所帮助。 |
|
一、同步数据流(Synchronous data-flows)模式
1.描述
在同步数据流模式中,线程在dispatch时读取输入端口的数据、在complete时向输出端口写数据。此模式不需要共享的data构件,processor构件需要指定固定优先级调度策略(如Rate
Monotonic等)。
2.举例
例如,三个周期线程通过两个事件端口连接(data port connections)链接在一起,AADL图形模型如图1所示,AADL文本表示较简单,此处省略。
图1 同步数据流模式
3.分析
这种模式只能用静态调度策略,每个线程总是在固定的时间读数据、执行、写数据(即使在不需要的情况下),因此显得不灵活。但这种模式的分析却非常简单,可以进行处理器利用率(processor
utilization factor)分析和最坏响应时间(WCRT)分析等。
二、互斥(Mutex)模式
1.描述
互斥模式考虑了异步通信的情形,在此模式中,线程通过优先级继承协议(priority
inheritance protocols)异步访问共享的data构件。
2.举例
为了阐释异步线程间通信,本文以互斥信号量Mutex的P/V原语的实现作为案例。AADL模型的图形表示如图2。
图2 互斥通信模式
AADL模型的文本表示如下:
SUBPROGRAM IMPLEMENTATION
P.others
ANNEX Behavior_Specification {**
states
s0: initial state;
s1: return state;
transitions:
busy: s0 -[on me.The_Value=0]->s1{};
free: s0-[on me.The_Value=1]-> s1{ me.The_Value
:= 0; };
**};
END P.others;
SUBPROGRAM IMPLEMENTATION V.others
ANNEX Behavior_Specification {**
states
s: initial return state;
transitions:
s -[]-> s { me.The_Value := 1; };
**};
END V.others;
THREAD IMPLEMENTATION Thread_A.others
PROPERTIES
Dispatch_Protocol => Periodic;
Period => 10 ms;
ANNEX Behavior_Specification {**
states
s0: initial state;
s1, s2, s3, s4: state;
s5: complete state;
transitions
acquire_M1: s0-[]->s1{P!(Mutex_1);};
acquire_M2: s1-[]->s2{P!(Mutex_2);};
critical_section: s2-[]->s3 {…};
release_M1: s3-[]->s4{V!(Mutex_1);};
release_M2: s4-[]->s5{V!(Mutex_2);};
**};
END Thread_A.others;
THREAD IMPLEMENTATION Thread_B.others
…
ANNEX Behavior_Specification {**
…
transitions
acquire_M2: s0-[]->s1{P!(Mutex_2);};
acquire_M1: s1-[]->s2{P!(Mutex_1);};
…
**};
END Thread_B.others; |
3.分析
这种模式可以进行死锁验证和WCRT等,但计算WCRT前需要先计算等待时间,这是很重要的。
三、黑板(Blackboard)模式
1.描述
典型操作系统有很多同步设计模式,如信号量、读者写者、生产者消费者等等。对于编程语言也有专用的同步设计模式,如黑板设计模式。黑板设计模式是读者写者模式的实现,同一时刻只能有一个writer更新数据,但可以有多个readers读取数据。
2.举例
用黑板模式实现读者写者的AADL图形模式如图3。
图3 黑板模式
AADL文本模型如下:
DATA T_BlackBoard
FEATURES
Request_Read: SUBPROGRAM Read0.o;
Read: SUBPROGRAM Read1.o;
Release_Read: SUBPROGRAM Read2.o;
Request_Write: SUBPROGRAM Write0.o;
Write: SUBPROGRAM Write1.o;
Release_Write: SUBPROGRAM Write2.o;
END T_BlackBoard;
DATA IMPLEMENTATION T_BlackBoard.o
SUBCOMPONENTS
Contents: DATA T_Item;
Readers: DATA Behavior::Integer;
Is_Idle: DATA Behavior::Boolean;
Is_Reading: DATA Behavior::Boolean;
Is_Writing: DATA Behavior::Boolean;
END T_BlackBoard.o;
SUBPROGRAM IMPLEMENTATION Read0.o
ANNEX Behavior_Specification {**
states
s: initial return state;
transitions
s -[on me.Is_Idle and me.Readers=0 ]-> s
{
me.Readers := me.Readers + 1;
me.Is_Reading := true;
me.Is_Idle := false;
};
**};
END Read0.o; |
3.分析
这种模式下,在任何时刻只有最后写入的消息可用。
四、排队缓冲(Queued buffer)模式
1.描述
排队缓冲模式使得在任何时刻,所有的写入数据都可用(即所有的写入数据都存储到内存),AADL通过事件数据端口(event
data port)或共享data构件实现。假设buffer消息的处理协议是FIFO。
2.举例
以生产者-消费者为例阐释排队缓冲模式。生产者-消费者的AADL图形模型如图4所示。
图4 排队缓冲模式
AADL模型的文本表示如下:
DATA IMPLEMENTATION
T_Buffer.others
SUBCOMPONENTS
Stack: DATA T_Item;
Current: DATA Behavior::Integer;
Max: DATA Behavior::Integer;
END T_Buffer.others;
SUBPROGRAM Push
FEATURES
me: IN OUT PARAMETER T_Buffer.others;
Item: IN PARAMETER T_Item;
END Push;
SUBPROGRAM IMPLEMENTATION Push.others
ANNEX Behavior_Specification {**
states
s: initial return state;
transitions
s-[on me.Current < me.Max]->s {
me.Stack(me.Current) := Item;
me.Current := me.Current+1;};
**};
END Push.others;
SUBPROGRAM Pop
FEATURES
me: IN OUT PARAMETER T_Buffer.others;
Item: OUT PARAMETER T_Item;
END Pop;
SUBPROGRAM IMPLEMENTATION Pop.others
ANNEX Behavior_Specification {**
states
s: initial return state;
transitions
s-[on me.Current > 1]->s {
Item := me.Stack(me.Current);
me.Current := me.Current-1;};
**};
END Pop.others;
THREAD IMPLEMENTATION Prod.others
PROPERTIES
Dispatch_Protocol => Sporadic;
Period => 10 ms;
ANNEX Behavior_Specification {**
state variables
v: T_Item;
states
s: initial complete state;
transitions
s-[]->s {Push!(Buffer,v);};
**};
END Prod.others;
THREAD IMPLEMENTATION Cons.others
PROPERTIES
Dispatch_Protocol => Periodic;
Period => 20 ms;
ANNEX Behavior_Specification {**
state variables
v: T_Item;
states
s: initial complete state;
transitions
s-[]->s {Pop!(Buffer,v);};
**};
END Cons.others; |
3.分析
这种模式需要进行可调度性分析,此外,还需要分析内存使用情况,以确保当生产者速率大小消费者速率时不会丢失数据 |