|
信号管理器
作者 Ray
RTEMS版权所有,转载请注明来源www.rtems.net,作者Ray
16.1: 介绍
信号管理器为任务提供异步通信的手段。由信号管理器提供的函数是:
rtems_signal_catch- 建立 ASR
rtems_signal_send- 向任务发信号。
16.2: 背景
16.2.1 : 信号管理器定义
信号管理器允许一个任务定义一个异步信号例程 (ASR) 。ASR和ISR很接近。 当处理器被中断,应用的执行转到ISR。同样地,当一个信号被发送到一个任务的时候,该任务的执行将会转到ASR。送一个信号给一个任务不会影响任务的状态。
信号被任务(或 ISR)用来告知另一个任务有等待的情形发生。每个任务有三十二个相关信号标识。数据类型 rtems_signal_set
是用来操纵信号集。
信号集的使用类似事件集。未处理的信号集被称为挂起信号集。
16.2.2 : ASR 和 ISR 的比较
ASR 与 ISR 有下列的区别:
ISR由处理器硬件调度,ASR由RTEMS调度。
ISR 不在任务执行空间中运行。ASR 在任务的执行空间中运行。
调用ISR时,中断向量会被传输。调用ASR传输的是信号
ASR可以有任务的模式,ISR不具备任务模式
16.2.3 : 构建信号集
信号集和其他属性一样也是通过位运算实现的。有效信号的集合向量从 RTEMS_SIGNAL_31 到 RTEMS_SIGNAL_0,是正交的单位向量。
如果信号集对应的位为0,表示对应信号没有在信号集中定义,他可以忽略。由于信号是正交的单位向量,所以使用或运算或者加法运算是等效的。
例如设定接受信号 RTEMS_SIGNAL_6 , RTEMS_SIGNAL_15 和 RTEMS_SIGNAL_31 的时候。那么传递给
rtems_signal_send 函数的信号参数应该是 RTEMS_SIGNAL_6| RTEMS_SIGNAL_15| RTEMS_SIGNAL_31
。
16.2.4 : 构建 ASR 模式
ASR模式和任务模式类似,包含下面的分量:
模式 掩码 作用
执行模式 模式掩码 模式描述
RTEMS_PREEMPT RTEMS_PREEMPT_MASK 开启抢占式调度
RTEMS_NO_PREEMPT RTEMS_PREEMPT_MASK 屏蔽抢占式调度
RTEMS_NO_TIMESLICE RTEMS_TIMESLICE_MASK 使时间片timeslicing调度失效
RTEMS_TIMESLICE RTEMS_TIMESLICE_MASK 使时间片timeslicing算法有效
RTEMS_ASR RTEMS_ASR_MASK 开启异步处理ASR
RTEMS_NO_ASR RTEMS_ASR_MASK 屏蔽ASR处理
RTEMS_INTERRUPT_LEVEL(0) RTEMS_INTERRUPT_MASK开启所有的中断(任务能被对所有中断产生相应)
RTEMS_INTERRUPT_LEVEL(n) RTEMS_INTERRUPT_MASK 任务的中断水平为n
ASR模式的构造和任务执行模式构造类似,读者可以查看前面章节。
16.3: 操作
16.3.1 : 建立 ASR
rtems_signal_catch 函数用来建立ASR。 ASR 的地址和它的执行模式在函数中指定。任务的模式和ASR的模式不同,例如任务可以允许抢占,但任务的ASR可以屏蔽抢占。直到调用rtems_signal_catch函数,ASR才有效。
一个任务可取消自己的ASR以及对应的挂起信号。方法是调用rtems_signal_catch时使用NULL作为address的值。
一个任务可能使通过task_mode 函数处理屏蔽ASR (RTEMS_NO_ASR) 。当任务的 ASR 无效,
送给它的信号挂起。
能从任务中调用的函数也能在ASR中调用。一个任务只能有一个活动ASR,因此,每次rtems_signal_catch都会产生一个新的ASR。
通常,在ASR的执行模式中信号处理是无效的。如果使能了信号处理,那么ASR必须是可重入的。
16.3.3 : 处理 ASR
异步信号用于产生软件中断。软件中断的处理和硬件中断处理流程基本相同。这样,在 ASR 和 ISR 之间的差别就表现为参数意义的不同。
ASR 的基本形式如下所示 :
rtems_asr user_routine(
rtems_signal_set signals
);
当 ASR 返回,系统恢复到到软中断前执行模式,并且恢复上下文信息,然后从中断处执行。
|