主页 文档 下载 莱特 沙龙 English

RTESM文档
RTEMS精彩应用
RTEMS版权说明
其他RTOS
ARM/DSP专区
AVR/FPGA/PCB
嵌入式文件系统
ARM AVR仿真器DIY
莱特电子工作室
联系我们
 


事件管理器

作者 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 函数的有效选项分量如下所示 :

  1. RTEMS_WAIT- 任务将会等候事件 ( 默认 )
  2. RTEMS_NO_WAIT- 任务等候
  3. RTEMS_EVENT_ALL- 在所有的事件都发生之后返回 ( 默认 )
  4. RTEMS_EVENT_ANY- 在任何的事件发生后的返回
  5. 选项集合的构造使用逻辑运算或者加法运算实现。

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 。

 
嵌入式软硬件设计咨询 • 8位 16位 32位 64位 RISC DSP
主页文章 方案 产品 下载反馈
 
2004 RTEMS.NET 版权所有