RTEMS 任务调度基础
RTEMS版权所有,转载请注明来源www.rtems.net,作者ray@rtems
%A
%A 对于任何一个RTOS,任务调度都是他的重中之重。RTEMS的任务调度有他自己的很多特点为了帮助大家更好的理解RTEMS,本章先介绍了RTEMS重任务调度的基本概念,后面几章将讲述RTEMS任务调度的API以及使用。
%A 8.1: 介绍
%A
%A 在实时系统中调度指的是对外部事件能及时的产生响应。这里的及时指的是从产生外部事件到调入对应的处理任务进行处理必须在一个指定的期限里面完成。举例来说,用来监视器医院病人的电子系统,当发现病人的生理指标异常,必须立刻采取行动通知值班医生,而不是继续对其他病人进行检测。
%A
%A 在RTEMS中负责提供这中服务的程序地被称为调度程序。 调度程序唯一的任务是将处理器资源分派给多个任务,通过分时的方式让他们共享处理器。RTEMS调度程序有下面的特点:
%A
%A • 使用了优先级为基础
%A
%A • 支持抢占
%A
%A • 在同等优先级条件下采用时间片轮转调度各个任务
%A
%A RTEMS任务调度算法的目的是保证在系统内任何一个处理器节点上运行的任务是处于ready状态中优先级最高的那一个任务。
%A
%A 完成该算法通常有二个方法。两者的方法都使用了一个ready状态的任务链表。一个方法将任务任意地放在链表中,调度程序扫描整个的链判断哪一任务应该被调入处理器。另一个方法是将 ready状态链表按照优先级排序,当任务进入准备状态时,调度程序将首先根据任务的优先级特性将它存放在列表中指定的位置。因此,当处理器空闲的时候,在ready状态链上第一个任务总是优先级最高的,他将会调入处理器。 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 8.2.1: 任务优先级和调度
%A
%A 对任务调度的控制中最重要和最有效的的是允许用户在任务创建的时候为任务分配一个优先级,同时也允许用户在任务运行时改变任务的优先级。RTEMS 提供255个优先等级。等级255是最低的优先级,而且 等级1 是最高的。当一个任务进入ready状态链时,它前面应该是具有相同或者更高的优先级的任务。该规则提供一个轮转的调度方式,轮转调度指在一组具有相等的优先级任务中,调度程序会根据他们准备好的次序( FIFO)依次调度入CPU中运行。虽然用户可以动态调整任务的优先级,但是程序员必须记住:RTEMS调度程序总是选择准备态中的具有最高优先级任务进入CPU运行。
%A 8.2.2: 抢占
%A
%A 另一种用户改变调度算法是通过改变任务的抢占模态标识 (RTEMS_PREEMPT_MASK)。如果一个任务的抢占位被置为无效(RTEMS_NO_PREEMPT),那么任务在运行的时候不会被抢占,除非任务结束或者被阻塞。在这种情况下,就算是有较高的优先级的任务就绪,任务也不会被抢占。需要注意的是,抢占位设置对于等待调度的任务是无效的,只有对于正在执行的任务才有用。
%A 8.2.3: 时分复用
%A
%A 基于优先级的时分复用,也被称为轮转调度。他是一种优先级调度算法的附加算法。像抢占模式位一样,时分复用也是通过状态位标识的。时分复用使用时分复用模态标识 (RTEMS_TIMESLICE_MASK)。如果时分复用状态位通过RTEMS_TIMESLICE使能,那么RTEMS将会限制任务在处理器中的运行时间,如果到达该任务的运行时间片,他将会被其他任务取代。如果当前优先级就绪队列中没有其他的任务了,那么RTMES将会增加当前任务的时间片并且让他继续执行。程序员必须注意,当一个较高的优先级任务就绪,他将会立刻抢占正在时间片轮转的任务,即使任务没有用光它的整个时间片。
%A 8.2.4: 人工的任务轮转选择
%A
%A RTEMS 中最后一种改变调度算法的机制称为人工的任务轮转选择。人工的任务轮转选择通过rtems_task_wake_after函数指令来实现的。 在调用该指令时使用参数RTEMS_YIELD_PROCESSOR来表示时间间隔。这允许一个任务放弃处理器,进入系统的就绪队列中。如果没有其他同等优先级的任务就绪,那么该任务将不会放弃对处理器的占用。
%A 8.2.5: 任务调度(派发)
%A
%A 调度程序是负责将处理器分配给就绪的任务。但是,为了将处理器分配给该任务,就必须停止当前在处理器上运行的任务。为了能让被停止的任务下次能在停止点继续运行,需要对任务上下文转换(context switch)。所谓任务上下文就是运行任务当前的状态信息,这些信息是任务执行需要的重要信息并且在任务切换的时候可能会被修改,主要是当前处理器各个运算与状态寄存器的值。上下文转换就是任务在调度出处理器前将上下文存储到指定的内存区域里,任务重新运行的时候,首先从该内存区域读取对应信息恢复任务中断前的状态。任务的上下文存储在TCB或者任务的堆栈中。
%A
%A 于使用RTEMS_FLOATING_POINT属性创建的使用数值协处理器的任务,进行上下文转换需要一些额外的工作。为了让浮点任务能够正常运行,必须保存数字协处理器使用的浮点寄存器。为了避免这些开销,如果没有其他任务会使用浮点处理器,任务切换的时候就不必保存对应的浮点寄存器。
%A%A
%A
*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。