|
事件管理器
作者 Ray
RTEMS版权所有,转载请注明来源www.rtems.net,作者Ray
15.1: 介绍
事件管理器提供一个任务间通信和同步的高性能方法。 由事件管理器提供的函数是:
rtems_event_send- 向任务发送事件
rtems_event_receive- 接受事件
15.2: 背景知识
15.2.1 : 事件集合
事件标志被任务( 或ISR) 用来通知另一个任务有事件发生。 每个任务可以有三十二个相关的事件标志。一个或多个事件标志的集合被称为事件集合。数据类型
rtems_event_set 是用来对事件置位。
当利用事件管理器的时候,程序员应该注意下面的事项:
15.2.1 : 事件集合
事件标志被任务( 或ISR) 用来通知另一个任务有事件发生。 每个任务可以有三十二个相关的事件标志。一个或多个事件标志的集合被称为事件集合。数据类型
rtems_event_set 是用来对事件置位。
当利用事件管理器的时候,程序员应该注意下面的事项:
事件提供一个简单的同步机制。
事件和任务密切关联。
任务能同时地等候多个事件。
事件彼此独立。
事件不支持数据传输
事件不会排队。换句话说,如果一个事件向一个任务发送多次而任务连第一个都没有处理,那么后续事件将会被忽略。
向任务发送事件时,事件集合将会发送给对应的任务。如果任务接收到事件但是还没有处理,那么就称该时间为挂起事件。事件接受条件指的是事件的接受者信息以及事件的处理算法。处理算法有两种:RTEMS_EVENT_ANY
算法和RTEMS_EVENT_ALL 算法,前者表明事件集中有只要有一个请求事件满足条件就可以了;后者则要求所有的事件都得到满足。
15.2.2 : 构建一个事件集合和事件接受条件
事件集合和属性集合一样使用逻辑运算构造。有效的事件向量从 RTEMS_EVENT_31到RTEMS_EVENT_0。如果一个事件没有明确在申明事件集合中申明,那么该事件可以忽略。
事件集合构造如下所示,需要发送事件6、15、31时,rtems_event_send函数的事件参数应该是 RTEMS_EVENT_6|
RTEMS_EVENT_15| RTEMS_EVENT_31 。
15.2.3 : 构建一个 EVENT_RECEIVE 选项集合
rtems_event_receive 函数的有效选项分量如下所示 :
-
RTEMS_WAIT- 任务将会等候事件 ( 默认 )
-
RTEMS_NO_WAIT- 任务等候
-
RTEMS_EVENT_ALL- 在所有的事件都发生之后返回 ( 默认 )
-
RTEMS_EVENT_ANY- 在任何的事件发生后的返回
-
选项集合的构造使用逻辑运算或者加法运算实现。
15.3: 操作
发送事件集
接受事件集
设置挂起事件集
接受所有挂起任务
15.3.1 : 发送事件集合
rtems_event_send函数允许一个任务(或 ISR) 将一个事件集发送给另一个任务。函数处理可能出现下面的情况:
目标任务被阻塞等候事件
如果对阻塞任务的输入的事件满足条件,那么任务变为就绪态。
如果发送给等待的任务事件集不能完全满足要求,那么任务将继续等待其他事件的发生。
目标任务没有要等候的事件
事件集送出,但是没有处理,处于挂起状态。
15.3.2 : 接受事件集合
rtems_event_receive 函数被任务用来接受输入事件集合。任务需要指定是只要有一个请求事件满足条件就可以
, 还是要所有的等待事件都得到满足。如果还不能满足接收条件,那么函数将会采取下面的动作:
缺省状态下,调用者将会等待满足条件的事件
当指定了RTEMS_NO_WAIT属性,函数将立即返回错误编码
如果设置超时,那么等待任务在返回前将会等待指定的时间
15.3.3 : 获取挂起事件集
任务可以使用rtems_event_receive 函数获取挂起事件集。此时需要将输入参数event_in设置为为RTEMS_PENDING_EVENTS。此时函数返回的是挂起事件的集合。
15.3.4 : 接受所有挂起事件
rtems_event_receive 函数可以接受所有的挂起事件,方法是event_in参数设置为 RTEMS_ALL_EVENTS,option_set设置为RTEMS_NO_WAIT|
RTEMS_EVENT_ANY。
15.3.4 : 接受所有挂起事件
rtems_event_receive 函数可以接受所有的挂起事件,方法是event_in参数设置为 RTEMS_ALL_EVENTS,option_set设置为RTEMS_NO_WAIT|
RTEMS_EVENT_ANY。如果没有挂起的任务那么函数返回 RTEMS_UNSATISFIED 。
|