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