ITRON同步和通信管理

来源:互联网 发布:串口数据监控软件 编辑:程序博客网 时间:2024/06/06 08:43

 ITRON同步和通信管理

在多任务的实时系统中,一项工作的完成往往要通过多个任务或多个任务与多个中断处理过程(ISRs)共同完成。它们之间必须协调动作互相配合,甚至需要交换信息进行通信。这些通信和同步的需要是:
1.任务能和其他任务及ISRs 交换数据
2.任务能以以下方式与其他任务进行同步
单向同步一个任务与另一个任务或一个ISR 同步
双向同步两个任务相互同步
与同步 一个任务与几个事件同时同步
或同步 一个任务与几个事件中的任何第一个到达事件同步
3.任务必须能对共享资源进行互斥访问
为了满足任务间通信同步和互斥的需要,同时保证资源被安全的使用,必须对多个相关任务在执行的次序上进行协调。ITRON系统主要提供了如下一些同步机制。
Event Flag,任务间的协调功能。
Semaphore,对系统资源进行排他访问。
MailBox,任务之间进行的信息通信。
 Event Flag
在多任务处理系统中,需要等到一个任务终了后,其他任务再开始启动的等候功能,这个时候,需要拥有对其他任务是否终了进行判断的能力,ITRON系统中提供了Event Flag.来实现这个机能。
ITRON系统中,一个Event Flag是ITRON工作区中的一个32 位的变量。32 位中的每一位都是表示一个事件标志,事件标志有两种状态,设置(1)和清除(0)。当一个标志处于设置状态时,表示相关的事件已经发生了,任务和ISRs可以使用事件标志来向其他任务发送信号, 表示事件已发生。

上图中,人相当于任务,火把表示Event Flag,在没有得到通知之前,等待信号的人处于等待状态,当发送信号的人发送了通知之后,处于等待状态的人将被激活,便开始自己的作业了,这就是一个完整的Event Flag使用过程事例。

 基本调用
 ITRON系统中提供下面基本调用,实现了Event Flag的基本机能,详细描述可以参照手册:
cre_flg: Generates an event flag.
del_flg: Deletes an event flag.
set_flg: Sets a bit pattern.
clr_flg: Clears a bit pattern.
wai_flg: Checks a bit pattern.
pol_flg: Checks a bit pattern (by polling).
twai_flg: Checks a bit pattern (with timeout setting).
ref_flg: Acquires event flag information.
vget_flg: Acquires event flag ID number.
vset_flg1: Sets a bit.
vwai_flg1:Checks a bit.
 Event Flag的应用
一般来说,Event Flag为任务之间的等待操作提供了场所,下面是其操作方法:
任务间的等候需要能够传达Event的任务和等待Event发生的任务,传达Event任务通过发行set_flag调用来传递信息,另一方面等待Event任务对事件发行等待调用,并且参照等候模式。
如果event flag的位模式与等待位模式一致时,任务可以继续进行处理,如果不一致,任务就不做继续处理,迁移到wait状态,并进入到event的等待队列中。
下图表示了两个Task通过32Bit Event Flag传递信息的范例:

下图表示了4个Task利用1Bit Event Flag传递信息的执行范例:

Event Flag的生成
Event Flag的生成是通过cre_flg系统调用进行的,在Itron系统中,cre_flg调用从系统工作区中创建一个32bit的事件标志组,并返回Event Flag的ID号。
Event Flag的删除
通过del_flg调用可以实现对Event Flag的删除,当产生删除操作的时候,该系统中存在等待本Flag操作的任务,这个时候,处于等待Eveng Flag的任务将解除等待操作,并迁移到Ready状态。
Event Flag的设定
通过set_flg调用,可以实现Event Flag的设定,当本调用发行后,处于等待Event Flag发行的任务的状态将由等待状态迁移到Ready状态。
Event Flag的清除
通过clr_flg调用,可以实现Event Flag的清除,保证Event Flag能够有初始化值。
Event Flag的等待
关于Event Flag的等待有三种方式,wai_flg, pol_flg, 和twai_flg,他们存在一些细微的差别。
wai_flg:如果Event Flag已经被设置,系统将保持运行,如果没有存在满足运行条件的Flag,系统将迁移到等待状态,一直到满足运行条件的事件发生。
pol_flg:任务直接查询Event Flag,如果满足运行条件的事件发生,系统保持运行状态不变,如果没有满足运行条件的事件发生,系统将直接返回,不仅性等待操作。
twai_flg:在制定的时间内,如果存在满足运行条件的事件发生,系统将保持运行状态不变,否则系统将按照指定的时间进行等待,Timer Out之后,系统迁移到Ready状态。
等待条件的设定:
因为Event Flag是一个32Bit的位群,所以在进行Event Flag的设定的时候可以按照条件的逻辑进行设定,主要的逻辑有And和Or两种,需要根据实际情况进行有选择的使用。
And:多个条件同时存在的时候,才满足任务的运行条件。
Or:当设定的多个条件有一个满足的时候,运行条件成立。

 Semaphore
虽然多任务系统中的各个Task可以共享各类资源,但是有些资源却一次只能被一个任务使用,因此防止同时动作的多个任务出现资源争执的需要,ITRON系统中提供了非负计数器-Semaphore,由管理资源个数的计数器进行资源使用得调配。
一个计数信号量是ITRON工作区中的一个16 位的变量,初始值可以是0~65535,表示可以使用的资源数量,初始值为0表示资源开始处于锁住状态,一个非0的值表示有多个资源供多个任务访问。
基于FIFS方式的等待机制
基于上图的示例,ITRON系统提供的方法是为任务提供等待队列,并且系统分配消息的方式是基于FIFS方法的,不区分任务的优先级别。
表示了三个Task共享n个资源的情况,请参照:

基本调用

ITRON系统中提供下面基本调用,实现了Semaphore的基本机能,详细描述可以参照手册:

cre_sem: Generates a semaphore

del_sem: Deletes a semaphore

sig_sem: Returns a resource

wai_sem: Acquires a resource

preq_sem: Acquires a resource (by polling)

twai_sem: Acquires a resource (with timeout setting)

ref_sem: Acquires semaphore information

vget_sid: Acquires semaphore ID number

创建信号量
Itron系统提供两种创建Semaphore的方法,一种是静态注册,另一种是通过系统调用来动态创建。动态创建是通过cre_sem的方法来实现的。
删除信号量
Itron系统中通过del_sem调用实现semaphore的删除。当删除semaphore被执行的时候,如果与本资源关联的任务等待队列中存在等待资源的任务时候,这些任务的状态将自动切换到Ready状态。
释放资源
Itron系统中通过sig_sem调用实现资源的释放,可以归还资源的数量由sig_sem的参数决定。
资源请求
主要有下面三种方式可以实现资源的请求:wai_sem、preq_sem和twai_sem;他们虽然都实现资源的申请,但是使用时还有一些细微的差别:
wai_sem:当系统没有满足任务需要的资源数量的时候,系统状态将迁移到等待状态,直到系统中存在可以使用的资源为止。
preq_sem:查询系统资源,如果存在满足系统需要的资源,则申请使用,如果没有满足需要的资源,系统将不申请资源,但是运行状态保持不变。
twai_sem:在申请资源的时候,可以指定等待的时间,如果在制定的时间内申请到资源,则系统继续保持运行,如果在制定的时间内没有申请到可用的资源,系统将解除等待状态。

MailBox

为了实现任务之间的通信功能,ITRON提供了邮箱,并且邮箱包含有多任务应用的等待队列和邮箱专用的信息等待队列,除了任务之间的通信功能使用,也作为任务之间的协作功能使用。当一个任务执行发送原语时,有两种可能性,一种可能是接收者已经处于等待状态;另外一种可能是消息发送时,接收者没有处于等待收信状态;下面将针对这两种情况进行示例说明:

1.下图表示了消息先于收信者到达的情况,这时信件被投入信箱之后,便被缓存了起来,等待收信者取得信件。同时收信者到达之后,取得信件之后,便根据信件的指示进行相关作业。

基于上图消息等待方式的实现在ITRON系统的实现方法是为Message提供等待队列作为缓冲,并且对于从队列中取得信息的方式提供了两种方式作为支持,一种是FIFS,即先到达的信件被优先取走,另一种是对消息进行优先级别的指定,这样就可以保证高优先级别的消息可以得到优先的取得权。
基于FIFS方式的等待机制
这种机制下所有消息都是平等的,他们的取得顺序完全取决于他们到达邮箱的时间,在邮箱中等待时间长的消息有优先被执行的权力。

基于优先级方式的等待机制
这种机制下的消息是存在优先级别的,高优先级别的消息会获得优先执行权力,但是对于拥有相同优先级别的消息,他们的等待方式还是基于FIFS的方式进行的。

2.下图表示了收信者先于发信者到达的等待方式,这时收信者开始处于等待状态,当发信者将消息投入到邮箱之后,收信者便重新处于激活状态,这时只要执行条件满足,便可以根据消息的指示进行相关作业。

基于FIFS方式的等待机制
基于上图的示例,ITRON系统提供的方法是为任务提供等待队列,并且系统分配消息的方式是基于FIFS方法的,不区分任务的优先级别。

 基本调用
对邮箱的操作,系统主要提供了如下的调用:
cre_mbx: Generates a mailbox.
del_mbx: Deletes a mailbox.
snd_msg: Sends a message.
rcv_msg: Receives a message.
prcv_msg: Receives a message (by polling).
trcv_msg: Receives a message (with timeout setting).
ref_mbx: Acquires mailbox information
vget_mid: Acquires mailbox ID number
 MailBox的应用
一般来说,邮箱是任务之间信息通信过程中的场所,下面是使用方法:
在任务之间的信息通信里,需要给邮箱分配送信的任务(发报任务)和接受这个信息的任务(接受任务)。这时如果邮箱里已经有任务被排列在队列里,信息就会被传递给等待队列里的任务中。任务专用队列的先头任务将会从Wait状态迁移到Ready状态。但是如果邮箱中还没有任务被排列在队列中,信息就会被排列到信息专用的队列中。不过发行snd_msg调用的任务不进行状态迁移。
还有接受信息的任务,对邮箱发行rcv_msg系统调用,接受消息,这时对象邮箱中已经有信息排列在队列里时,任务就会收取排列在队列里的信息。但是如果对象邮箱中还没有信息被排列在队列中的场合,任务就不能继续处理,被排列在对象邮箱的任务专用队列中,并且迁移到wait状态。不过在处于wait状态过程中,如果从其他任务那里得到信息的话,就可以接受信息,任务同时也会从wait状态解脱出来,迁移到ready状态。如此循环进行,任务之间的通信便不断地进行下去。

创建邮箱
系统提供两种方式创建邮箱,静态注册和动态创建。系统动态创建邮箱是通过cre_mbx调用来实现的。
删除邮箱
系统提供的del_mbx功能可以实现邮箱的删除,del_mbx发行后,如果等待队列中存在任务的时候,这些任务的状态将自动迁移到Ready状态。
发送Event
系统提供的snd_msg调用实现Event的发送,当snd_msg发送之后,处于等待Event的任务的状态将由Wait状态迁移到Ready状态。
接收Event
Itron系统提供三种方式来实现Event的接收,rcv_msg, prcv_msg,和trcv_msg,他们的差异是:
rcv_msg:当邮箱中存在Evnet,则任务将直接获取Event并保持执行状态,当邮箱中没有Event的时候,任务将迁移到等待状态,直到邮箱中存在Event为止。
prcv_msg:任务查询邮箱状态,如果存在Event,则取得Event,并继续执行,如果不存在Event,则任务不进行等待,继续保持执行。
trcv_msg:在制定的时间内,邮箱中存在Event,则任务取得Event并执行,否则任务将等待指定的时间,之后迁移到Ready状态。

 

原创粉丝点击