新闻  |   论坛  |   博客  |   在线研讨会
RTEMS:调度与任务状态
tongxin | 2009-04-12 22:11:55    阅读:1736   发布文章

RTEMS版权所有,转载请注明来源www.rtems.net,作者ray@rtems
%A 8.2: 调度机制
%A
%A 本节介绍下面的概念:
%A
%A •  任务优先级和调度
%A
%A •  抢占
%A
%A •  时分复用Timeslicing
%A
%A •  轮转调度
%A
%A •  任务调度
%A
%A RTEMS 提供四种机制允许用户对任务调度进行干预:
%A
%A •  用户制定任务优先级水平(并且可动态修改)
%A
%A •  任务抢占式控制(该任务是否会被抢占)
%A
%A •  任务时间片控制
%A
%A •  人工的任务轮转选择
%A
%A 上面的每一种方法都为定制任务属性提供了有力的手段,以满足不同场合的不同调度需要。每种干预手段彼此独立,他们的效果也有差异。调度程序对任务调度总是按照优先级,抢占模式和timeslicing为次序。程序员在使用timeslicing和轮转的时候需要注意这两种调度中如果来了更高优先级的任务,让会产生抢占式调度,而不会顾及时间片因素。
%A 18.2.1: 任务优先级和调度
%A
%A 对任务调度的控制中最重要和最有效的的是允许用户在任务创建的时候为任务分配一个优先级,同时也允许用户在任务运行时改变任务的优先级。RTEMS 提供255个优先等级。等级255是最低的优先级,而且水平 1 是最高的。当一个任务进入ready状态链时,它前面应该是具有相同或者更高的优先级的任务。该规则提供一个轮转的调度方式,轮转调度指在一组具有相等的优先级任务中,调度程序会根据他们准备好的次序( FIFO)依次调度入CPU中运行。虽然用户可以动态调整任务的优先级,但是程序员必须记住:RTEMS调度程序总是选择准备态中的具有最高优先级任务进入CPU运行。
%A 18.2.2: 抢占
%A
%A 另一种用户改变调度算法是通过改变任务的抢占模态标识 (RTEMS_PREEMPT_MASK)。如果一个任务的抢占位被置为无效(RTEMS_NO_PREEMPT),那么任务在运行的时候不会被抢占,除非任务结束或者被阻塞。在这种情况下,就算是有较高的优先级的任务就绪,任务也不会被抢占。需要注意的是,抢占位设置对于等待调度的任务是无效的,只有对于正在执行的任务才有用。
%A 18.2.3: 时分复用
%A
%A 基于优先级的时分复用,也被称为轮转调度。他是一种优先级调度算法的附加算法。像抢占模式位一样,时分复用也是通过状态位标识的。时分复用使用时分复用模态标识 (RTEMS_TIMESLICE_MASK)。如果时分复用状态位通过RTEMS_TIMESLICE使能,那么RTEMS将会限制任务在处理器中的运行时间,如果到达该任务的运行时间片,他将会被其他任务取代。如果当前优先级就绪队列中没有其他的任务了,那么RTMES将会增加当前任务的时间片并且让他继续执行。程序员必须注意,当一个较高的优先级任务就绪,他将会立刻抢占正在时间片轮转的任务,即使任务没有用光它的整个时间片。
%A 18.2.4: 人工的任务轮转选择
%A
%A RTEMS 中最后一种改变调度算法的机制称为人工的任务轮转选择。人工的任务轮转选择通过rtems_task_wake_after函数指令来实现的。 在调用该指令时使用参数RTEMS_YIELD_PROCESSOR来表示时间间隔。这允许一个任务放弃处理器,进入系统的就绪队列中。如果没有其他同等优先级的任务就绪,那么该任务将不会放弃对处理器的占用。
%A 18.2.5: 任务调度(派发)
%A
%A 调度程序是负责将处理器分配给就绪的任务。但是,为了将处理器分配给该任务,就必须停止当前在处理器上运行的任务。为了能让被停止的任务下次能在停止点继续运行,需要对任务上下文转换(context switch)。所谓任务上下文就是运行任务当前的状态信息,这些信息是任务执行需要的重要信息并且在任务切换的时候可能会被修改,主要是当前处理器各个运算与状态寄存器的值。上下文转换就是任务在调度出处理器前将上下文存储到指定的内存区域里,任务重新运行的时候,首先从该内存区域读取对应信息恢复任务中断前的状态。任务的上下文存储在TCB或者任务的堆栈中。
%A
%A 对于使用RTEMS_FLOATING_POINT属性创建的使用数值协处理器的任务,进行上下文转换需要一些额外的工作。为了让浮点任务能够正常运行,必须保存数字协处理器使用的浮点寄存器。为了避免这些开销,如果没有其他任务会使用浮点处理器,任务切换的时候就不必保存对应的浮点寄存器。
%A 18.3: 任务状态变迁
%A
%A RTEMS系统中任务必须处于五种允许的任务状态之一。 这些状态是: 运行(Executing)、就绪(Ready)、阻塞(Blocked)、睡眠(Dormant)状态和非存在状态(Non-existent)。
%A
%A 在使用rtems_task_create创建任务以前,以及以 rtems_task_delete函数指令删除任务的时候,任务处于非存在状态。处于这个状态的任务没有有效的TCB和任务ID标识,因此别的任务也无法与该任务通信。
%A
%A RTEMS Task States
%A
%A 当一个任务无法运行,就称为他处于阻塞状态。一个流动的任务可能阻塞它本身或者被系统的其他任务阻塞。 正在运行的任务可以通过API将自己阻塞。同样一个任务能使用rtems_task_suspend 函数指令阻塞另外一个任务。一个任务进入阻塞状态可能由下面的原因所引起:
%A
%A 一个任务调用 rtems_task_suspend 函数指令阻塞的或它自己或另外一个任务。
%A
%A 正在运行的任务使用rtems_message_queue_receive函数接受消息队列中的信息,但是消息队列暂时为空,那么任务就会进入阻塞态。
%A
%A 运行的任务等待的某个事件没有发生。
%A
%A 运行的任务无法得到需要的信号量。
%A
%A 运行的任务使用rtems_task_wake_after指令让自己睡眠。如果指令传入的参数代表的时间间隔是零,任务将进入就绪状态。
%A
%A 运行的任务调用rtems_task_wake_when 函数将自己阻塞,直到到达指定时间。
%A
%A 运行的任务调用rtems_region_get_segment函数指令请求一个内存区段,但是暂时没有满足要求的区域。
%A
%A 运行的任务调用rtems_rate_monotonic_period函数后必须等到指定的时间才能执行。
%A
%A 同样,可以通过将任务挂起让任务进入阻塞状态。因此,为了让任务进入就绪态,必须解除任务的挂起态。
%A
%A 当任务进入就绪态,他就有条件进入处理器执行。正在执行的任务可能因为下面的原因放弃对处理器的占用:
%A
%A 有更高优先级的任务到达
%A
%A 任务运行的时间片到
%A
%A 任务执行完成
%A
%A 任务被删除
%A
%A 任务等待特定事件或者资源
%A
%A 所有具有相同优先级的任务将会按照进入系统的先后次序按照时间片轮转的方式调度。任务可能因为下面的事件进入就绪状态:
%A
%A 一个任务占领准备好的状态跑, 但是现在没有处理器的控制。 一样的或较高的优先级的任务将会产生处理器被或合式的阻塞,完成他们的 timeslice, 或在划除。 和相同的优先级的所有任务将会在 FIFO 次序中运行。 一个任务由于任何一个下列的条件式进入就绪状态:
%A
%A 接收到rtems_task_resume命令,任务从原来的挂起态唤醒。
%A
%A 正在运行的任务调用rtems_message_queue_send或者rtems_message_queue_broadcast或rtems_message_queue_urgent向阻塞的任务发送消息,而这个消息正好是阻塞任务所等待的。
%A
%A 正在运行任务使用rtems_event_send 函数向阻塞任务发送对应的事件。
%A
%A 正在运行的任务调用了一个释放信号量的函数rtems_semaphore_release,该信号量是被阻塞的任务正在等候的的 。
%A
%A 被rtems_task_wake_after函数休眠的任务休眠的时间片到达,任务被唤醒,进入就绪队列。
%A
%A 被rtems_task_wake_when函数阻塞的任务时间片到。
%A
%A 正在运行的任务调用内存释放函数rtems_region_return_segment,因为内存不足而阻塞的任务变成就绪
%A
%A 单调周期任务的执行时间到达,任务就绪
%A
%A 正在运行的任务使用rtems_task_restart 函数唤醒阻塞任务。
%A
%A 正在运行的任务,如果他的抢占位有效,可能会使用上面的指令将更高优先级的任务唤醒就绪,这样他自己就会被调度出处理器,变成就绪状态。同样ISR也会让正在运行的任务被中断,处理器转而处理中断处理函数。
%A
%A 就绪任务如果被调度入处理器运行,就称它为运行状态,就绪任务可能因为下面的原因进入运行状态:
%A
%A 该任务是优先级最高的就绪任务。
%A
%A 正在运行的任务自己放弃了对处理器的控制,就绪队列中具有最高优先级的任务如果优先级相同,他们会轮流进入处理器。这也是所谓的轮转算法。
%A
%A 正在运行的任务将其强占位指为有效。此时如果就绪队列中有任务的优先级更高,就会将高优先级的任务调入处理器。
%A
%A 正在运行的任务降低它自己的优先级,这样另外的具有比较高的优先级的任务是会调度入处理器运行。
%A
%A 正在运行的任务升高其他任务的优先级,如果上升后新的优先级必正在运行任务的优先级高,高优先级的任务就有可能被调度入处理器进入运行态。
%A%A
%A

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
最近文章
寂寞如雪
2009-05-19 19:01:18
夜色花
2009-05-19 18:56:22
没有爱可以重来
2009-05-19 18:54:59
推荐文章
最近访客