|
RTEMS连载(9.1)
RTEMS任务管理管理器背景
作者 Ray
RTEMS版权所有,转载请注明来源www.rtems.net,作者Ray
摘要
RTEMS的任务管理非常有特色,和多概念和其他RTOS中都有细微的差别。而且读者可以发现RTEMS为了提供系统的速度和实时性,使用了很多技巧,这些技巧在设计其他的RTOS应用的时候也会非常有用的。
9.2 背景知识
9.2.1: 任务定义
计算机科学中对任务的定义多种多样。这是因为每个OS的设计者都会为自己的OS定义自己的任务,所以没有一个定义能完整的概括出
“ 任务 ” 的真正含义。 下面是任务的流行定义:
-
一个 " 可派遣的 " 单元。
-
获取处理器资源的实体
-
实时、多处理器系统中的一个原子单元,
-
并行系统中竞争资源的线程。
-
并行系统中能并行执行而且又相互关联的序列。
从 RTEMS的角度看,任务实际上是一种"轻量级线程",这种线程能并发进行,并能竞争系统资源。任务和任务控制块
(TCB)形成映射关系。
9.2.2: 任务控制块
任务控制块 (TCB) 是RTEMS中任务的静态表现。它包含了与管理任务所需要的所有信息。在RTEMS系统初始化的时候,
RTEMS 要运行的每个任务保留 TCB 。在RTEMS中所有任务的TCB形成一个预先分配好的TCB空闲链表。 每个任务创造之后从TCB链表中获取对应的链表项,填充对应的任务信息;任务结束的时候,对应链表项的内容被清空,TCB重新挂入空闲链表。
TCB内部的字段可以被应用层任务发出的系统调用来改变。同时需要注意的是TCB是RTEMS中唯一的能经由用户扩展例程被一个应用存取的RTEMS
内在的数据结构。TCB 包含任务的名称,ID,当前的优先级,当前状态,执行模态,相关记事本位置, TCB 用户扩展指针的位置,调度控制结构以及阻塞任务所需控制结构。
当发生任务调度的时候,任务的上下文信息储存在 TCB 。当任务重新获得处理器控制权时,它从TCB中恢复上下文信息。
9.2.3: 任务状态
一个任务可能在下列的五状态之一:
-
运行态(executing)- 掌握了处理器控制权,正在处理器上执行
-
就绪态(ready)任务已经有条件获取运行所需资源,准备好运行了,但是由于当在占用CPU的任务优先级更高,所以当前任务暂时无法运行。
-
阻塞态 ( blocked)任务由于没有获取所需的硬件资源,或者等待同步事件发生等等原因,或者被挂起,导致任务不能执行。任务进入阻塞对列。
-
睡眠状态(dormant)任务创建后自动进入睡眠状态,等待唤醒。
-
非存在状态 ( non-existent) 如果任务还没有 创建或者正在删除,那么就称该任务处于非存在状态。
一个活跃的任务可能处于运行、预备、 阻塞或睡眠状态的状态, 否则就被认为非存在的(和unix中的僵尸进程有一点类似)。在多任务的并行系统中,多个任务通过系统调用实现通信、同步、并竞争系统资源。在多处理器系统中,可能同时会有多个进程活跃的在系统中,这些任务在逻辑上是并行的,但是实际上每个进程占用处理器的时间片是由RTEMS调度算法决定的,在RTEMS中使用具有优先级排序的时间片轮转算法调度进程,该算法以任务的当前状态和优先级为调度基础。
9.2.4: 任务优先级
在RTEMS中,任务的优先级决定了任务获取处理器的次序。 RTEMS 支持的优先级从1到255,共255 级。任务的优先级使用数据类型rtems_task_priority来存储。
需要提醒读者的是,在RTEMS中,优先级的数字越小,代表的优先级越高。举例来说,一个任务的优先级是5,那么他的优先级水平将超过优先级是10的任务。同时,在RTEMS中,可以有多个任务具有相同的优先权。
一个任务从创建开始,就会被分配一个优先级。这个优先级不是静态的,而是动态的,这意味着任务的优先级可以在任何时间被改变。
调度程序使用优先级来决定处于ready状态的任务中哪一个将会能获取处理器。大体上,优先级高的任务,更有可能被调入处理器中执行。
9.2.5: 任务执行模态
任务的执行模态是下列四种状态的组合:
-
抢占态(preemption)
-
ASR处理
-
时间片分片(timeslicing)
-
中断等级
任务执行状态是用来修改RTEMS对任务的调度并改变任务的执行环境。RTEMS使用数据类型rtems_task_mode来处理任务执行模态。
抢占态状态字用于屏蔽RTEMS调度器的抢占式调度,也就是说该状态字决定了对应的任务是否会被其他任务剥夺对处理器的占用。如果抢占态状态字设置成无效(RTEMS_NO_PREEMPT),即使一个较高的优先级任务被准备好,只要它是在运行状态中,任务将会保留对处理器的控制。如果抢占态状态字使能(RTEMS_PREEMPT),那么当一个较高的优先级任务进入准备队列,处理器将会立刻从现在的任务被取走而且给较高的优先级任务。
RTEMS 调度程序将根据timeslicing分量来决定处理器如何被分派给具有相等优先级的任务。 如果 timeslicing被使能
(RTEMS_TIMESLICE),RTEMS将会使用时间片轮转策略调度具有相同优先级的任务。也就是说RTEMS将会限制数量每个任务占用处理器的时间。每个任务可以运行的实现在配置表中初始化。如果timeslicing
设置成无效 (RTEMS_NO_TIMESLICE), 那么然后任务将会一直在处理器中运行,直到一个较高的优先级的任务将其换出。 如果设置了
RTEMS_NO_PREEMPT,那么配置表中timeslicing分量被调度程序忽略。
异步信号处理分量用来配置任务何时处理接收到的信号。如果激活了异步信号处理(RTEMS_ASR), 那么送给该任务的信号将会在任务下一次执行的时候被处理。
如果信号处理被设置为无效(RTEMS_NO_ASR),那么所接收到的信号将不会被处理。任务只有通过设置RTEMS_ASR才能处理这些挂起的信号。
中断等级分量是用来决定当任务正在运行的时候 ,哪一个中断将有效。 RTEMS_INTERRUPT_LEVEL(n)
叙述任务将会在第n级中断运行。
-
RTEMS_PREEMPT- 抢占模式有效 (默认)
-
RTEMS_NO_PREEMPT- 非抢占模式
-
RTEMS_NO_TIMESLICE- 时间片轮转失效(默认)
-
RTEMS_TIMESLICE- 时间片算法有效
-
RTEMS_ASR- 异步处理有效(默认)
-
RTEMS_NO_ASR- 异步处理无效
-
RTEMS_INTERRUPT_LEVEL-(0) 使所有的中断都有效 (默认)
-
RTEMS_INTERRUPT_LEVEL(n)- 任务在第n级中断运行
默认模态的置位可能被通过设置RTEMS_DEFAULT_MODES 常量来改变。
|