新闻  |   论坛  |   博客  |   在线研讨会
rtems;:事件管理器
tongxin | 2009-04-12 20:43:18    阅读:1297   发布文章

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

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
最近文章
寂寞如雪
2009-05-19 19:01:18
夜色花
2009-05-19 18:56:22
没有爱可以重来
2009-05-19 18:54:59
推荐文章
最近访客