第二章 REX 概述
REX 是一个抢先的多任务实时操作系统,为任务的控制,同步,互斥,定时和中断控制提
供了相应的 API,所有的函数在调用它们的任务提供的设备环境下运行。
2.1 任务
REX 将每个任务视为独立的实体句柄,有独享的堆栈和优先级并共同组成任务的设备环境,
每个任务有一组数据组成的结构,称为任务控制块(TCB), REX 通过任务控制块记录任务运
行的设备环境。
REX 运行期间允许在任何时候动态创建任意数量的任务,尽管更多的任务造成了遍历任务
链表的时间延长,但新增任务对 REX 性能造成的损失是微乎其微的。不过仍要注意尽量使任务
的数量保持最小。
REX 所能负担的任务最终取决于处理器种类,时钟速率以及特定应用下的中断响应指标。
2.2 堆栈
前一节提到过每个任务有独立的堆栈空间,任务处于运行状态时,该堆栈被激活,当任务
挂起时,任务的设备环境被保存于堆栈顶部,堆栈指针则存放于该任务的 TCB 中。任务可能由
于阻塞,等待信号量,等待中断服务而挂起。
如果任务被重新激活到运行状态,调度程序从 TCB 中恢复堆栈指针,任务的设备环境就可
从堆栈中弹出,任务即可恢复运行。任务调度处理对于任务来讲是透明的。
2.3 优先级和调度
每一个任务都有一个优先级,优先级存放于任务的 TCB 中,优先级可以是任何的非零的 32
位数,数值越小则优先级越低,REX 占用了优先级 0 用于空闲任务,旧版本的 REX 要求每个
任务独占优先级,新的版本已经没有这个限制了。
REX 的调度策略为放行优先级最高的就绪态任务,即激活不等待任何事件的最高优先级任
务。如果满足条件的同优先级任务不只一个,则 REX 会任选其中的一个任务。被激活的任务会
一直运行到主动挂起或中断程序使另一个更高优先级的任务恢复运行。
一个任务等待的事件到达后,该任务进入就绪态,如果所有的任务都处于挂起状态,则空
闲任务被激活。
REX 支持任务动态修改优先级,一个任务可以提升或降低自己或其他任务的优先级。
2.4 中断
REX 为抢占式内核,当中断返回时,控制会交给优先级最高的就绪任务而不是被中断的任
务。
2.5 互斥
当两个任务需要共享一个资源时,需要有一个访问互斥机制,访问共享资源部分的代码成
为临界区。
通过关中断可以简单的实现临界区,REX 还提供一种不太彻底的方式,导出函数可用于锁
定或释放公共资源。
2.6 禁用中断后的挂起
只有正在运行的任务可以禁止中断,一旦某个任务禁止中断后挂起,中断状态则一直由该
任务保存,任务重新激活后可以恢复中断状态。有一种潜在的危险是中断被下一个激活的任务
允许,这一特性在以后的版本中可能被修改,但是程序员不能依赖这一点。
2.7 信号量
通用信号量集与每一个任务关联,这些信号量集作为相关任务的设备环境保存在任务的
TCB 里,用来表示与任务有关的某类事件发生了。一个任务的信号量可以被所有任务及中断服
务程序设置或清除。
关于信号量需要注意的重点:
信号量是通用旗语,用户可以任意定义信号量的含义。
评论1
最新资源