嵌入式实时操作系统的任务管理及任务调度_第1页
嵌入式实时操作系统的任务管理及任务调度_第2页
嵌入式实时操作系统的任务管理及任务调度_第3页
嵌入式实时操作系统的任务管理及任务调度_第4页
嵌入式实时操作系统的任务管理及任务调度_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1 嵌入式实时操作系统简介 1 1 英文名 Embedded Real time Operation System 简写为 RTOS 1 2 1 定义 当外界事件或数据产生时 能够接受并以足够快的速度予以处理 其处理 的结果又能在规定的时间之内来控制生产过程或对处理系统作出快速响应 并控制所有实 时任务协调一致运行的嵌入式操作系统 注 在工业控制 军事设备 航空航天等领域 对系统的响应时间有苛刻的要求 这就需要使用实时系统 我们常常说的嵌入式操作系统 都是嵌入式实时操作系统 比如 C OS II eCOS 和 Linux 故对嵌入式实时操作系统的 理解应该建立在对嵌入式系统的理解之上加入对响应时间的要求 1 2 2 IEEE 定义 嵌入式系统是 用于控制 监视或者辅助操作机器和设备的装置 1 2 3 一般定义 以应用为中心 以计算机技术为基础 软件硬件可裁剪 功能 可靠 性 成本 体积 功耗严格要求的专用计算机系统 1 3 分类 VxWorks uC OS uClinux eCos RTXC 等 2 嵌入式实时操作系统的任务管理 2 1 任务管理 是嵌入式实时操作系统的核心和灵魂 决定了操作系统的实时性能 它通常包含优先级设置 多任务调度机制和时间确定性等部分 2 1 1 优先级设置 嵌入式操作系统支持多任务 每个任务都具有优先级 任务越重要 赋予的优先级应越高 优先级的设置分为静态优先级和动态优先级两种 静态优先级指的 是每个任务在运行前都被赋予一个优先级 而且这个优先级在系统运行期间是不能改变的 动态优先级则是指每个任务的优先级 特别是应用程序的优先级 在系统运行时可以动态地 改变 2 1 2 多任务调度机制 任务调度主要是协调任务对计算机系统资源的争夺使用 对 系统资源非常匮乏的嵌入式系统来说 任务调度尤为重要 它直接影响到系统的实时性能 通常 多任务调度机制分为基于优先级抢占式调度和时间片轮转调度 1 基于优先级抢 占式调度 系统中每个任务都有一个优先级 内核总是将 CPU 分配给处于就绪态的优先级 最高的任务运行 如果系统发现就绪队列中有比当前运行任务更高的优先级任务 就把当 前运行任务置于就绪队列中 调入高优先级任务运行 系统采用优先级抢占方式进行调度 可以保证重要的突发事件及时得到处理 2 时间片轮转调度 让优先级相同的处于就绪 状态的任务按时间片使用 CPU 以防止同优先级的某一任务长时间独占 CPU 在一般情况下 嵌入式实时操作系统采用基于优先级抢占式调度与时间片轮转调度相结合的调度机制 2 1 3 时间的可确定性 嵌入式实时操作系统甬数调用与服务的执行时间应具有可确定 性 系统服务的执行时间不依赖于应用程序任务的多少 基于此特征 系统完成某个确定 任务的时间是可预测的 2 2 任务管理机制 在内核的设计过程中 最先应考虑的是任务的状态以及迁移时序 然后根据此状态设计相应的队列 如就绪队列 等待队列等 内核时钟也依赖任务的状态 可以看出 任务管理实现的核心和基础是任务状态和迁移时序 2 2 1 任务状态 在多任务状态中 任务要参与资源的竞争 只有在所需资源得到满足 的情况下才能得到执行 然而 任务拥有的资源情况是不断变化的 这将导致任务状态也 表现出不断变化的特性 不同的实时内核实现方式对状态的定义不尽相同 但都包括以下 三种基本状态 1 等待 任务在等待 I O 完成或者等待某事件的发生 2 就绪 任 务已经得到需要运行的资源 并等待获得处理器资源 3 执行 任务获得处理器和其他 所有需要的资源 相关代码正在被运行 在单处理器系统中 任何时候只有一个任务处于 运行状态 如果没有任何任务需要运行 那么内核会运行一个空闲任务 任何一个可以执 行的任务都必须处于就绪状态 实时内核会从所有就绪的任务中 使用合适的调度策略选 择一个运行 当一个任务请求 I O 操作 或者等待信号量将会处于等待状态 2 2 2 任务状态转移 在一定条件下 任务会在不同的状态之间进行转化 称为任务状 态迁移 如图 1 所示 图 1 任务状态迁移图 图 2 实际实现的任务状态转换图 图 2 在描述任务状态迁移的同时 也描述了任务的生存周期 任务的生命期从新建态 时开始直到结束态时结束 在给定的时刻 任务的状态一定处在这六种状态之一 新建状 态是指任务被创建的过程 在这个过程中主要工作有 为任务分配 TCB 和栈空间以及其他 资源 当任务创建完成以后 任务就具备运行的能力了 与此同时 任务进入就绪状态 并等待调度器为它分配运行的机会 当任务得到运行的机会 任务开始执行 处于运行态 的任务会在任意时刻由运行态进入休眠态 就绪态或结束状态 其中进入休眠态是任务的 主动过程 这主要是任务调用了内核提供的休眠函数 任务在休眠状态 如果没有其他任 务唤醒它 它将永远休眠下去直到系统关闭 这种方式也可用于任务同步 等待状态主要 由两种原因引起 一种是等待某事件的发生 如等待信号量 第二种为任务主动等待多少 个 tick 最后 任务可以将自己杀死进入结束态 图 3 任务状态迁移示意图 图 3 描述了三个任务状态迁移过程 图中包含三个任务和一个调度程序 调度程序确 定下一个需要投入运行的任务 因此调度程序本身也占用一定的处理时间 3 嵌入式实时操作系统的任务调度 3 1 任务调度 调度是内核的主要职责之一 调度的主要任务就是要决定该轮到哪个 任务运行 多数实时内核采用基于优先级调度的算法 基于优先级的调度算法是指 每个 任务根据重要程度被赋予一定的优先级 CPU 总是让处在就绪态的优先级最高的任务运行 然而 究竟何时让高优先级任务掌握 CPU 的使用权 有两种不同的情况 这取决于内核的 类型 是可剥夺型的还是可剥夺型内核 当调度程序决定新的任务获得 CPU 的使用权时 这时内核将执行任务切换 任务切换过程为 首先保存当前任务的上下文 即 CPU 寄存器 中的全部内容 这些内容可以保存在任务的自己的栈中 也可以保存在 TCB 中 然后 将 需要运行的任务的上下文从该任务的栈中重新装入 CPU 的寄存器 并开始运行 任务切换 过程增加了应用程序的额外负荷 CPU 的内部寄存器越多 额外负荷就越重 3 2 调度算法 3 2 1 时间片轮转调度算法 当两个或两个以上任务有同样优先级 内核允许一个任务 运行事先确定的一段时间 该段时间叫做时间片 然后切换给另一个任务 内核在满足以 下条件时 把 CPU 控制权交给下一个就绪态的任务 当前任务运行的时间片到期 当 前任务在时间片还没结束时已经完成了 3 2 2 基于优先级的调度算法 每个任务都赋予优先级 任务越重要 赋予的优先级就 越高 优先级的分配方式可分为静态分配和动态分配的方式 静态优先级是指应用程序执 行过程中诸任务的优先级不变 在静态优先级系统中 各个任务以及它们的时间约束在程 序编译时是已知的 动态优先级指应用程序执行过程中 任务的优先级是可变的 Linux 采取的调度策略结合了这几种调度方案 在 Linux 系统中 调度算法最基本的 一类就是基于优先级的调度 优先级高的任务先运行 相同优先级的任务按照轮转方式进 行调度 Linux 也实现了基于动态优先级的调度方法 一开始 利用静态优先级的方法设 置任务的优先级 然而它允许调度程序根据需要来提升 降低优先级 3 3 调度器实现 在整个任务管理中 任务调度无疑是系统的核心 任务调度通常由 内核中的调度器实现 调度器的实现与任务运行状态迁移 任务队列有密切的联系 可以 说任务运行状态迁移和任务队列决定了调度器的实现 调度器的主要作用是在就绪队列中 选择优先级最高的任务运行 如果优先级最高的任务不止一个 则选择队头的任务运行 虽然整个调度器的功能可以用上面的几句话概括 但调度器的实现远远没有那么简单 主 要困难来源下面的原因 确定调度器运行的时机 中断处理程序完了后 是执行 当前任务 还是马上调度 调度器的性能 调度中伴随着任务上下文的切换 尤 其对处理器架构有关的上下文 应该设计良好的接口以便移植 对于实时系统来说 中断处理程序执行完毕后 应该马上执行调度 这是因为中断常 常伴随着有新的任务处于就绪队列中 在这些任务中可能会有高优先级的任务就绪 所以 在实时内核中要求必须支持在中断后马上进行任务调度 不管是在实时系统 还是在其他 系统中 调度器性能显得非常重要 常常要求调度器的时间复杂度至少应该为线性 当然 常数是最好的 对于不同的处理器架构 其提供的寄存器 状态寄存器都有很大的区别 调度器应该留出良好的接口给不同的处理器 以便以后方便移植 在实现调度器时 基本上考虑了上面的几个基本问题 根据任务状态迁移 内核队列等方 面的内容 在 byCore 中实现了一个叫 scheduler 的调度程序 在 scheduler 中调用 几个与硬件相关的函数 这几个函数主要用于实现任务硬件上下文的切换 这部分代码用 汇编完成 并且与处理器有关 图 4 描述了 scheduler 的算法流程图 图 4 scheduler 的算法流程图 该调度程序的算法非常简单 首先 在允许调度的情况下 如果有高优先级任务就绪 则进行任务切换 任务切换会发生在两种处理器模式下 一种是处理器处于正常的运行态 另一种发生在中断态中 因此 内核使用两组函数分别处理这两种情况 在两种处理器状 态下都有 启动新任务 和 新旧任务切换 函数接口实现最后的任务切换工作 这两组 函数与处理器有关 并由汇编实现 启动新任务 的主要功能是将任务的初始上下文复 制给处理器的各个寄存器 这包括通用寄存器 堆栈指针寄存器 状态寄存器和指令指针 寄存器等 这些初始值在新任务创建时被初始化 启动新任务发生的时机有两种情况 第 一种情况是内核初始化完毕后 启动第一个任务 第二种情况为任务主动结束后 当前任 务指针被置位 NULL 时 任务切换 发生在两个任务之间 一个是被换切换出去的任务 另一个是将要执行的任务 任务切换函数也由汇编代码实现 它所要完成的工作主要有两 个 第一是将旧任务 被换切换出去的任务 的上下文保存到自己的栈中 第二是新任务 将要执行的任务 将保存在栈中的上下文复制到处理器的相关寄存器中 任务切换的发 生时机有 当前任务

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论