(课件)-嵌入式系统及应用.ppt
电子科技大学嵌入式软件工程中心 嵌入式系统及应用 第五章 任务管理与调度 1 筑 寞 速 悦 萌 逃 坏 荆 觉 级 秆 膊 酮 冕 匆 蚜 奋 灭 虹 潭 股 臃 明 闪 光 颅 喇 运 站 磷 炊 蝴 ( 课 件 ) - 嵌 入 式 系 统 及 应 用 ( 课 件 ) - 嵌 入 式 系 统 及 应 用 电子科技大学嵌入式软件工程中心 主要内容 任务简介 任务控制块 任务管理 任务调度 优先级反转 2 悄 巨 萄 钨 珐 诅 深 隧 炉 氯 测 豫 踏 扎 浆 础 恩 诗 讫 射 镇 绽 惮 勋 哨 贷 物 郁 陆 锗 褥 骇 ( 课 件 ) - 嵌 入 式 系 统 及 应 用 ( 课 件 ) - 嵌 入 式 系 统 及 应 用 电子科技大学嵌入式软件工程中心 第一节 任 务 任务的定义及其主要特性 任务的内容 任务的分类 任务参数 3 铸 摄 蹲 雇 逆 么 巫 再 胳 戒 鞍 沽 伴 使 产 串 球 警 矛 咋 拒 沥 结 打 揽 蚂 抡 察 位 似 札 乐 ( 课 件 ) - 嵌 入 式 系 统 及 应 用 ( 课 件 ) - 嵌 入 式 系 统 及 应 用 电子科技大学嵌入式软件工程中心 在嵌入式实时系统中任务是操作系统内核调度 的基本单位。 任务主要包含以下内容: 代码:一段可执行的程序 数据:程序所需要的相关数据(变量、工作 空间、缓冲区等) 堆栈 程序执行的上下文环境 4 攘 弱 告 川 液 灸 统 拙 呻 益 镁 剩 凶 来 猎 的 蛤 馈 捕 兽 概 粘 膏 舱 涣 维 脆 尘 素 耻 锦 山 ( 课 件 ) - 嵌 入 式 系 统 及 应 用 ( 课 件 ) - 嵌 入 式 系 统 及 应 用 电子科技大学嵌入式软件工程中心 void YourTask (void *pdata) for (;) /* 用户户代码码; 调调用uC/OS-II的某些功能函数*/: OSFlagPend(); OSMboxPend(); OSMutexPend(); OSQPend(); OSSemPend(); OSTaskDel(OS_PRIO_SELF); OSTaskSuspend(OS_PRIO_SELF); OSTimeDly(); OSTimeDlyHMSM(); /* 用户户代码码 */ 任务的代码通常是一个无限循环,如下面代码所示 : 任务代码的定义需注意两点: 1.返回参数必须定义成void。 2.当任务开始执行时,可传递一个任何类型的参数 。(参数类型是void 指针) 5 迭 厄 淆 喝 荡 莫 咎 协 酿 元 孝 河 溪 轿 担 季 屋 捕 某 辖 忱 昨 洱 沾 矽 迪 仔 矛 腾 赤 赎 华 ( 课 件 ) - 嵌 入 式 系 统 及 应 用 ( 课 件 ) - 嵌 入 式 系 统 及 应 用 电子科技大学嵌入式软件工程中心 void YourTask (void *pdata) /* 用户户代码码; OSTaskDel(OS_PRIO_SELF); 当任务完成后,任务可以自我删除,如下面代 码。 需注意:任务代码不是真的删除了,只是内核简 单地不会再这个任务,这个任务的代码也不会再 运行了。 6 哟 戒 控 冉 操 巴 袄 侩 冬 坛 禹 嫉 碟 啮 椽 式 蝉 柄 傻 斜 筋 僚 模 撑 辜 挠 波 抚 蝇 鞘 炽 符 ( 课 件 ) - 嵌 入 式 系 统 及 应 用 ( 课 件 ) - 嵌 入 式 系 统 及 应 用 电子科技大学嵌入式软件工程中心 int main(void) / 初始化 uCOS内核. OSInit(); / 在开始多任务务之前必须须先建立一个任务务 OSTaskCreate(TestTask1, (void *) 11, /第1个参数是指向该该任务务运行代码码的指针针,第2个参数是一个指向任务务初始化数据的指针针, /第3个参数是任务务的堆栈栈起始地址(高地址向低地址增长长), /第4个参数是任务务的优优先级级,数值值越小,优优先级级越高。 / 开始多任务务,控制权权交给给内核 OSStart(); void TestTask1(void *pdata) printf(“%4u: * Test Task 1 First call *n“, OSTime); /创创建其他任务务 OSTaskCreate(TestTask2, (void *) 22, while (1) printf(“%4u: * Test Task 11 *n“, OSTime); OSTimeDly(1); uC/OSuC/OS的任务实例的任务实例 7 帚 垃 忌 儿 加 咬 岿 太 耀 隧 谦 裹 他 残 擅 耻 晌 领 赛 畴 底 挂 腑 塌 捞 屈 澳 筐 率 晾 据 圾 ( 课 件 ) - 嵌 入 式 系 统 及 应 用 ( 课 件 ) - 嵌 入 式 系 统 及 应 用 电子科技大学嵌入式软件工程中心 void TestTask2(void *pdata) while (1) printf(“%4u: * Test Task 22 *n“, OSTime); OSTimeDly(1); 注: 1. 堆栈栈大小有上限,对对于X86处处理器,OS_STK变变量类类型是16位变变量,所以堆栈栈大小 是1024B; 2. 内核允许许建立多达63个用户户任务务,必须给这须给这些任务务分配一个独一无二的介于0- 62的优优先级级。0是最高优优先级级。 3. OSStart()函数并不返回main函数。 8 练 刘 孽 捏 棒 漱 愉 握 韩 巢 犀 雀 簇 奖 喷 老 唤 滁 穗 烈 咒 债 膛 宙 梭 埠 偏 犊 沙 削 瓶 胶 ( 课 件 ) - 嵌 入 式 系 统 及 应 用 ( 课 件 ) - 嵌 入 式 系 统 及 应 用 电子科技大学嵌入式软件工程中心 任务的主要特性 任务具有以下特性: 动态性:任务状态是不断变化的。 一般分为就绪态、运行态和等待态。 在多任务系统中,任务的状态将随着系统的需要不断进 行变化。 并发性(并行性?): 系统中同时存在多个任务,这些任务在宏观上是同时运 行的。 异步独立性: 每个任务各自按相互独立的不可预知的速度运行,走走 停停。 9 卤 套 申 彝 收 功 短 配 少 棉 睡 詹 电 轿 紫 周 苦 擞 四 初 柏 叁 营 栋 狮 机 燕 墙 寡 刘 僚 卯 ( 课 件 ) - 嵌 入 式 系 统 及 应 用 ( 课 件 ) - 嵌 入 式 系 统 及 应 用 电子科技大学嵌入式软件工程中心 任务与程序的区别: 任务能真实地体现工作内容的并发性,而程 序不能; 程序是任务的组成部分 除程序外,任务还包括数据、堆栈及其上下文环 境等内容; 程序是静态的,任务是动态的; 任务有生命周期,有诞生、有消亡,是短暂 的;而程序是相对长久的; 一个程序可对应多个任务,反之亦然; 任务具有创建其他任务的功能,而程序没有 。 10 秦 讼 晓 备 馁 施 迄 激 潜 绪 耿 镶 衬 及 粘 论 刺 兰 肋 窟 饱 练 毙 图 钙 脊 普 灾 淆 狼 梭 季 ( 课 件 ) - 嵌 入 式 系 统 及 应 用 ( 课 件 ) - 嵌 入 式 系 统 及 应 用 电子科技大学嵌入式软件工程中心 采用多任务的好处: 任务的规模较小 每个任务更容易编码和调试,其质量也更容易得到 保证 不少应用本身就是由多个任务构成的 如一个应用可能需要进行以下任务的处理:计算、 从网络获取数据和刷新显示屏幕 采用多任务的处理方式是应用问题的一个非常自然 的解决方式 任务之间具有较高的独立性,耦合性小 通过增加新的任务就能方便的扩充系统功能 实时性强 保证紧急事件得到优先处理成为可能 11 担 蜘 泞 萨 席 也 钦 首 伞 赵 哟 苍 骑 蒙 狐 直 同 础 胚 纬 闻 缕 虽 椎 碱 镶 早 柳 秩 赔 牟 暑 ( 课 件 ) - 嵌 入 式 系 统 及 应 用 ( 课 件 ) - 嵌 入 式 系 统 及 应 用 电子科技大学嵌入式软件工程中心 任务1任务2任务3 内核 内核代码内核数据 栈 数据 任务 控制块 代码 栈 数据 任务 控制块 代码 栈 数据 任务 控制块 代码 任务1任务2任务3 多任务系统多任务系统 示意图示意图 12 封 了 逻 阐 圭 舷 娃 绎 压 瓷 泛 哈 吮 豹 郸 俗 梯 羹 挥 无 雾 帘 柱 方 柒 腋 卜 洒 率 渭 生 巡 ( 课 件 ) - 嵌 入 式 系 统 及 应 用 ( 课 件 ) - 嵌 入 式 系 统 及 应 用 电子科技大学嵌入式软件工程中心 实时系统中任务的分类 按照到达情况的可预测性,任务可以划分 为: 周期任务(periodic task) 非周期任务 按照重要程度,可分为: 关键任务(critical task) 非关键任务(noncritical task) 13 渤 溪 硫 沤 锰 逝 学 辨 揍 派 飞 耐 凹 硼 衔 表 止 撮 定 意 嫡 乌 贫 衬 愧 减 榔 踪 私 朝 笺 蘑 ( 课 件 ) - 嵌 入 式 系 统 及 应 用 ( 课 件 ) - 嵌 入 式 系 统 及 应 用 电子科技大学嵌入式软件工程中心 实时系统中任务的分类 周期任务与非周期任务 周期任务每隔一个固定的时间间隔就会执行 一次。 举例:飞行器可能需要每隔100ms获得一次关于 飞行器的速度、高度和姿态数据,控制传感器获 取这些数据就需要通过周期任务来进行。 非周期任务执行的间隔时间则为不确定的。 举例:移动通信设备中的通信任务,该任务只有 在需要进行通信的情况下才会得到执行。 非周期任务分为: sporadic task:有最小到达间隔时间限制 aperiodic task:没有到达时间限制 14 琉 雷 止 泅 茵 卉 术 噪 腐 羚 翻 乐 和 瞅 奏 渴 辩 朵 醒 怜 疗 敝 绰 蛛 拷 瞻 洪 呀 琉 纪 蜂 辕 ( 课 件 ) - 嵌 入 式 系 统 及 应 用 ( 课 件 ) - 嵌 入 式 系 统 及 应 用 电子科技大学嵌入式软件工程中心 实时系统中任务的分类 关键任务与非关键任务 关键任务: 为需要得到及时执行的任务,否则将出现灾难性的 后果 举例:飞行器中用于处理生命支持系统和稳定性控制系统 的任务 非关键任务: 如果没有得到及时执行,则不会产生严重后果 15 吗 洒 瘫 肘 秃 缄 达 脉 幕 骡 未 逗 则 稽 跟 揍 抿 春 韦 驳 礁 窿 娄 岗 科 拄 沟 扛 世 榜 轧 藐 ( 课 件 ) - 嵌 入 式 系 统 及 应 用 ( 课 件 ) - 嵌 入 式 系 统 及 应 用 电子科技大学嵌入式软件工程中心 任务参数 任务参数: 优先级(priority) 周期(period) 计算时间(computation time) 就绪时间(ready time) 截止时间(deadline) 16 蛔 级 筒 锻 父 疽 媳 旭 枢 庆 专 霉 灭 侨 暗 祭 屋 腆 吸 也 瓜 塔 因 孟 虐 范 棱 写 搐 汪 擎 痢 ( 课 件 ) - 嵌 入 式 系 统 及 应 用 ( 课 件 ) - 嵌 入 式 系 统 及 应 用 电子科技大学嵌入式软件工程中心 任务参数 任务的优先级 表示任务对应工作内容在处理上的优先程度 优先级越高,表明任务越需要得到优先处理 飞行器中处理稳定性控制的任务,就需要具有较 高的优先级,一旦执行条件得到满足,应及时得 到执行 任务的优先级分为静态优先级和动态优先级 。 静态优先级:任务的优先级被确定后,在系统运 行过程中将不再发生变化; 动态优先级:系统运行过程中,任务的优先级是 可以动态变化的。 17 栅 苇 馒 瘁 掀 莆 牢 累 惊 玉 皑 咋 严 毋 过 切 侧 岔 沉 必 惭 窿 稻 羡 涩 南 沿 嘴 翠 稽 杜 另 ( 课 件 ) - 嵌 入 式 系 统 及 应 用 ( 课 件 ) - 嵌 入 式 系 统 及 应 用 电子科技大学嵌入式软件工程中心 任务参数 uC/OS中可以管理64个任务,每个任务必须有个 不同的优先级。优先级的数值越低,任务的优先 级就越高。 uC/OS总是选择优先级最高的任务执 行。 最低优先级63被系统保留,用户不能使用。 在目前的版本中,任务的优先级也是与任务ID。 18 笑 铃 镭 牛 步 闲 渗 砸 睡 倡 陋 侍 舜 棠 播 类 槽 法 缨 筏 窍 涝 衔 副 乡 虎 剂 姐 葵 钡 盈 郑 ( 课 件 ) - 嵌 入 式 系 统 及 应 用 ( 课 件 ) - 嵌 入 式 系 统 及 应 用 电子科技大学嵌入式软件工程中心 任务参数 周期 周期任务所具有的参数,表示任务周期性执行的间隔 时间 任务的计算时间 任务在特定硬件环境下被完整执行所需要的时间, 也被称为是任务的执行时间(execution time)。 由于任务每次执行的软件环境的差异性,导致任务在 各次具体执行过程中的计算时间各有不同。 通常用最坏情况下的执行时间(worst case time )或是需要的最长执行时间来表示,也可用统计时间 (statistical time)来表示。 19 蝇 粒 宛 绍 证 狞 双 舜 坝 墙 吻 句 何 索 包 妒 牌 蔬 北 龙 崔 埠 衙 盎 活 嘎 妻 和 武 喂 跺 赛 ( 课 件 ) - 嵌 入 式 系 统 及 应 用 ( 课 件 ) - 嵌 入 式 系 统 及 应 用 电子科技大学嵌入式软件工程中心 任务参数 任务的就绪时间 任务具备了在处理器上被执行所需要条件时的时间。 任务的截止时间 意味着任务需要在该时间到来之前被执行完成。 截止时间可以通过绝对截止时间(absolute deadline) 和相对截止时间(relative time)两种方式来表示 相对截止时间为任务的绝对截止时间减去任务的就绪时间 。 截止时间可以分为强截止时间(hard deadline)和弱 截止时间(soft deadline)两种情况: 具有强截止时间的任务即为关键任务,如果截止时间 不能得到满足,就会出现严重的后果。 拥有关键任务的实时系统又被称为强实时(hard real- time)系统,否则称为弱实时(soft real-time)系统 。 20 缨 录 痢 额 窜 番 姜 吁 缕 沙 戊 因 党 钥 辣 吓 暴 胯 藻 鸦 逝 郭 庐 缔 疡 乡 城 俯 纷 陡 仇 励 ( 课 件 ) - 嵌 入 式 系 统 及 应 用 ( 课 件 ) - 嵌 入 式 系 统 及 应 用 电子科技大学嵌入式软件工程中心 第二节 任务控制块 任务状态与变迁 空闲任务 任务控制块 任务切换 任务队列 优先级位图算法 21 秧 掣 态 租 屏 拍 气 俐 补 谜 骏 卉 踊 评 亲 讽 志 崔 搀 这 谣 疯 绎 藕 矾 奉 抉 抨 氖 渴 戚 洱 ( 课 件 ) - 嵌 入 式 系 统 及 应 用 ( 课 件 ) - 嵌 入 式 系 统 及 应 用 电子科技大学嵌入式软件工程中心 任务状态与变迁 任务拥有的资源情况是不断变化的,导致 任务状态也表现出不断变化的特性。 不同的实时内核实现方式对任务状态的定 义不尽相同,但是都可以概括为三种基本 的状态: 等待(waiting):任务在等待某个事件的发 生; 就绪(ready): 任务等待获得处理器资源; 执行(running):任务获得处理器资源,所 包含的代码内容正在被执行。 22 靛 栏 戌 毡 诫 死 乙 韦 徒 度 棵 卢 慰 帝 奈 刀 映 犬 良 律 耿 谜 兜 政 死 斯 缅 顷 夯 孟 冉 署 ( 课 件 ) - 嵌 入 式 系 统 及 应 用 ( 课 件 ) - 嵌 入 式 系 统 及 应 用 电子科技大学嵌入式软件工程中心 任务状态与变迁 在单处理器系统中: 任何时候都只有一个任务在CPU中执行 如果没有任何事情可做,就运行空闲任务执行空 操作 任何一个可以执行的任务都必须处于就绪状态 调度程序从任务的就绪队列中选择下一个需要执 行的任务。 处于就绪状态的任务拥有除CPU以外的其他所有 需要的资源。 任务还可能处于等待状态 如果任务在需要等待I/O设备或其他任务提供的数 据,而数据又还没有到达该任务的情况下,就处 于等待状态 23 侍 吝 咱 忍 义 纺 吁 钟 慨 毡 象 桶 阮 爷 宣 绪 捷 鱼 瞎 拨 投 篱 诺 悦 靳 澄 拘 查 秃 博 翁 属 ( 课 件 ) - 嵌 入 式 系 统 及 应 用 ( 课 件 ) - 嵌 入 式 系 统 及 应 用 电子科技大学嵌入式软件工程中心 任务状态与变迁 任务会在不同的状态之间进行转换,即 任务状态的变迁 就绪态 运行态 等待态 获得CPU 被高优先级 任务抢占或 超时 获得资源 需要 资源 任务状态变迁图任务状态变迁图 24 院 狈 胺 苇 搀 琳 名 赡 障 序 铱 骑 黔 紫 更 己 茄 压 愤 京 符 老 蚕 昏 舌 豆 申 辟 坛 鼠 悍 摘 ( 课 件 ) - 嵌 入 式 系 统 及 应 用 ( 课 件 ) - 嵌 入 式 系 统 及 应 用 电子科技大学嵌入式软件工程中心 任务1 任务2 任务3 调度 程序 051015 2025303540 4550 运行 等待就绪 三个任务进行状态转换的过程 包含三个任务和一个调度程序。调度程序用来确定下一个 需要投入运行的任务,因此调度程序本身也需要占用一定 的处理时间。 25 票 做 茨 泛 靛 琐 驭 烯 训 友 啸 呻 酶 琵 跋 轩 熬 蒸 睦 晒 悯 钓 船 诉 勒 堡 厩 谎 挪 抿 汛 很 ( 课 件 ) - 嵌 入 式 系 统 及 应 用 ( 课 件 ) - 嵌 入 式 系 统 及 应 用 电子科技大学嵌入式软件工程中心 uC/OSuC/OS中的任务状态变迁中的任务状态变迁 OSMBoxPOST() OSQPost() OSQPostFront() OSSemPost() OSTASKResume() OSTimeDlyResume() OSTimeTick() OSMBoxPend() OSQPend() OSSemPend() OSTaskSuspend() OSTimeDly() OSTimeDlyHMSM() Interrupt OSIntExit() OSStart() OSIntExit() OS_TASK_SW() OSTaskDel() OSTaskCreate() OSTaskCreateExt() OSTaskDel() Task is Preempted OSTaskDel() 等待状态 睡眠态 就绪态 运行态 中断服 务态 26 藻 淤 吊 窍 擒 宾 藻 寺 乞 扑 陵 勤 扒 娇 议 篮 上 茁 龚 叛 衷 落 颗 琼 毛 键 伸 翻 岛 卿 聘 身 ( 课 件 ) - 嵌 入 式 系 统 及 应 用 ( 课 件 ) - 嵌 入 式 系 统 及 应 用 电子科技大学嵌入式软件工程中心 uC/OS任务状态 睡眠态:指任务驻留在程序空间(ROM或RAM),还没 有交给UCOS来管理。把任务交给uCOS来管理,是 通过调用下述2个函数之一:OSTaskCreate()和 OSTaskCreateExt()来实现的。这些调用告诉内核 ,任务程序的起始地址在哪里,优先级是多少, 任务要使用多少栈空间等。 27 搁 喝 途 次 渐 悯 俭 管 幸 焰 率 蕊 简 裹 庙 咒 赞 内 窗 潮 绊 少 交 泻 柄 婴 吏 介 瞪 打 钞 紫 ( 课 件 ) - 嵌 入 式 系 统 及 应 用 ( 课 件 ) - 嵌 入 式 系 统 及 应 用 电子科技大学嵌入式软件工程中心 uC/OS任务状态 就绪态:任务一旦建立,就进入了就绪态。任务 的建立可以是在多任务运行开始之前,也可以动 态地由一个运行着的任务建立。如果多任务已经 启动,且一个任务是被另一个任务建立的,而新 建立的任务的优先级高于建立它的任务的优先级 ,则刚刚被建立的新任务将立即获得CPU的使用权 。 一个任务可以通过调用OSTaskDel()返回到睡眠态 ,或通过调用该函数让另一个任务进入睡眠态。 28 宠 总 聚 霓 吝 娃 校 模 阐 赵 曾 虎 兼 箩 驳 绸 鞋 闹 籍 郧 粮 氰 垛 脂 冤 鞋 甘 钳 蔓 拒 额 嵌 ( 课 件 ) - 嵌 入 式 系 统 及 应 用 ( 课 件 ) - 嵌 入 式 系 统 及 应 用 电子科技大学嵌入式软件工程中心 uC/OS任务状态 运行态:调用OSStart()函数可以启动多任务。 OSStart()函数只能在启动时调用一次,该函数 选择用户初始化代码中已经建立的、进入就绪态 的优先级最高的任务来进行执行。 等待态:从运行态到等待态有两种可能的原因: 1.正在运行的任务调用OSTimeDly()函数将自身延迟 一段时间,则该任务进入等待态。 2.正在执行的任务需要等待某一事件的发生,如信 号量和消息,若该事件未发生或未获得,该任务 进入等待态。 29 企 厌 涅 迢 惨 脆 接 亿 瘟 嘻 利 誓 拿 蠢 虾 官 擅 泛 液 赛 觉 侧 谨 绪 崇 翼 草 汹 杆 懂 雅 惦 ( 课 件 ) - 嵌 入 式 系 统 及 应 用 ( 课 件 ) - 嵌 入 式 系 统 及 应 用 电子科技大学嵌入式软件工程中心 uC/OS任务状态 中断服务态:被中断了的任务进入中断服务态。 响应中断时,正在执行的任务被挂起,中断服务 子程序控制了CPU使用权。中断服务子程序可能会 使一个或多个任务进入就绪态。在中断服务子程 序返回之前,内核要判定,被中断的任务是否还 是就绪态任务中优先级最高的。若已经不是,则 新进入就绪态的这个优先级更高的任务将得以运 行,否则,原来被中断了的任务将继续运行。 30 恍 秉 矩 拖 碗 窍 札 辟 撇 工 郎 拧 抛 踩 刺 谍 虾 款 羽 菩 奥 澈 部 谭 勒 寝 订 攫 症 狸 啪 亢 ( 课 件 ) - 嵌 入 式 系 统 及 应 用 ( 课 件 ) - 嵌 入 式 系 统 及 应 用 电子科技大学嵌入式软件工程中心 任务控制块 内核对任务管理是通过对任务控制块(Task Control Block,TCB)的操作来实现的。 任务控制块是包含任务相关信息的数据结构 包含了任务执行过程中所需要的所有信息。 任务控制块大都包括以下信息: 任务的名字 任务执行的起始地址 任务的优先级 任务的状态 任务的硬件上下文(堆栈指针、PC和寄存器等) 任务的队列指针等内容 31 少 梯 堑 蹄 儒 唉 竞 侄 禹 霸 游 厌 佑 殷 狸 肘 猪 墒 铅 刹 音 鄙 簿 免 渤 藻 伙 堪 悉 庭 绢 伙 ( 课 件 ) - 嵌 入 式 系 统 及 应 用 ( 课 件 ) - 嵌 入 式 系 统 及 应 用 电子科技大学嵌入式软件工程中心 任务控制块 一旦任务建立,一个任务控制块OS_TCB就被赋 值,能够保存任务被其他任务抢占时的状态。 当任务重新得到CPU的使用权后,任务控制块 能够确保任务从当时被中断的那一点丝毫不差 的继续执行。 下面是uC/OS的OS_TCB源代码。 32 卫 秤 裳 身 额 塔 疗 蓉 卑 卸 臃 凯 捞 收 假 眩 谴 舒 耕 灿 譬 仆 灯 棠 蜡 俺 唉 找 整 幢 学 弥 ( 课 件 ) - 嵌 入 式 系 统 及 应 用 ( 课 件 ) - 嵌 入 式 系 统 及 应 用 电子科技大学嵌入式软件工程中心 typedef struct os_tcb OS_STK *OSTCBStkPtr; /*指向当前任务务堆栈栈顶栈栈顶的指针针,每个任务务的堆栈栈容量可以是任意的*/ #if OS_TASK_CREATE_EXT_EN 0 /*允许许建立任务务函数的扩扩展*/ void *OSTCBExtPtr; /* 指向用户户自定义义的任务务控制块扩块扩展 */ OS_STK *OSTCBStkBottom; /* 栈栈底指针针*/ INT32U OSTCBStkSize; /* 栈栈空间间,以栈栈元为单为单位 */ INT16U OSTCBOpt; /* 把“选择项选择项”传给传给函数 OSTaskCreateExt()。 目前支持三个选择项选择项:OS_TASK_OPT_CHK用于告知内核在任务务建立时时允许许建立任务栈务栈 检验检验,该检验该检验功能由用户户程序实现实现;OS_TASK_OPT_STK_CLR表示任务务建立时时,任务栈务栈 要清0;OS_TASK_OPT_SAVE_FP表示任务务要做浮点数运算。 */ INT16U OSTCBId; /* 保留 */ #endif struct os_tcb *OSTCBNext; struct os_tcb *OSTCBPrev; /* 用于任务务控制块块双向链链表的前后查查找。*/ uC/OSuC/OS的的TCB TCB 源代码源代码 33 总 糠 腕 鲸 椿 孰 树 祝 图 蛋 擒 坝 涵 泄 洋 讼 渠 挛 拔 稍 哮 冲 刊 尧 砖 猎 绽 桌 神 字 唱 苟 ( 课 件 ) - 嵌 入 式 系 统 及 应 用 ( 课 件 ) - 嵌 入 式 系 统 及 应 用 电子科技大学嵌入式软件工程中心 #if (OS_Q_EN0) /* 指向事件控制块块的指针针 */ #endif #if (OS_Q_EN 0) /* 传递给传递给任务务的消息指针针*/ #endif 34 uC/OSuC/OS的的TCB TCB 源代码源代码 前 粪 料 肮 守 具 偶 丢 魂 荤 廉 乒 矮 旬 茫 箩 笋 档 植 莆 舶 恿 志 辛 腆 郊 盐 鲜 萨 世 鼠 诬 ( 课 件 ) - 嵌 入 式 系 统 及 应 用 ( 课 件 ) - 嵌 入 式 系 统 及 应 用 电子科技大学嵌入式软件工程中心 #if (OS_VERSION = 251) /* 指向事件标标志节节点的指针针*/ #endif OS_FLAGS OSTCBFlagsRdy; /* 当任务务等待事件标标志组时组时,是使任务务 进进入就绪态绪态的事件标标志*/ #endif INT16U OSTCBDly; /* 任务务允许许等待事件发发生的最多时钟节时钟节拍数 , OSTimeTick()使用这这个链链表来刷新各任务务的任务务延迟变迟变量.OSTCBDly */ INT8U OSTCBStat; /* 任务务状态态*/ INT8U OSTCBPrio; /* 任务优务优先级级 */ 35 uC/OSuC/OS的的TCB TCB 源代码源代码 瘁 轴 而 氮 鸽 撕 旱 笺 嘉 鳞 滩 掖 斥 龋 哦 谐 拦 购 浆 烽 投 玻 闲 菲 生 北 廉 争 谚 忍 极 掐 ( 课 件 ) - 嵌 入 式 系 统 及 应 用 ( 课 件 ) - 嵌 入 式 系 统 及 应 用 电子科技大学嵌入式软件工程中心 INT8U OSTCBX; INT8U OSTCBY; INT8U OSTCBBitX; INT8U OSTCBBitY; /* 这这四个变变量用于找出具有最高优优先级级的任务务。这这些值值是在任务务建立时计时计算,或者 是在改变变任务优务优先级时计级时计算。 */ #if OS_TASK_DEL_EN 0 BOOLEAN OSTCBDelReq; /* 表示任务务是否需要删删除 */ #endif OS_TCB; 36 注:注: 1.1.应用程序可以有的最多任务数可以在文件应用程序可以有的最多任务数可以在文件OS_CFG.HOS_CFG.H中中 定义。避免定义。避免RAMRAM程序空间浪费。程序空间浪费。 2.2.在内核初始化时,所有在内核初始化时,所有OS_TCBOS_TCB都被链接成单向空任务都被链接成单向空任务 链表。任务建立时,空链表。任务建立时,空TCBTCB指针指针OSTCBFreeListOSTCBFreeList指向的指向的 OS_TCBOS_TCB被赋给任务,然后被赋给任务,然后OSTCBFreeListOSTCBFreeList指向下一个空指向下一个空 的的TCBTCB。 uC/OSuC/OS的的TCB TCB 源代码源代码 滋 隐 祝 静 监 油 搭 乐 牡 乐 份 喂 郊 仑 匿 论 失 步 沙 蕾 丘 诣 核 玄 渐 知 烃 侠 挖 殊 情 俗 ( 课 件 ) - 嵌 入 式 系 统 及 应 用 ( 课 件 ) - 嵌 入 式 系 统 及 应 用 电子科技大学嵌入式软件工程中心 空任务控制块链表 OSTCBNext OSTCBNext OSTCBFreeList OSTCBTbl(0)OSTCBTbl(1) NULL 37 所有的OS_TCB都存放在任务控制块列表数组 OSTCBTbl 中的。 负 肖 为 战 徐 桌 巍 绑 滤 固 温 赃 讳 牵 配 邦 都 琵 申 垢 崔 祸 笆 其 入 宫 诺 旭 井 违 孽 烯 ( 课 件 ) - 嵌 入 式 系 统 及 应 用 ( 课 件 ) - 嵌 入 式 系 统 及 应 用 电子科技大学嵌入式软件工程中心 任务控制块 为节约内存,任务数量通常需要进行预先 配置 按照配置的任务数量初始化任务控制块,一个任务对 应一个初始的任务控制块,形成一个空闲任务控制块 链。 在任务创建时,实时内核从空闲任务控制 块链中为任务分配一个任务控制块。 随后对任务的操作,都是基于对应的任务控制块来进 行的。 当任务被删除后,对应的任务控制块又会被实时内核 回收到空闲任务控制块链。 38 袭 吠 拢 贯 哈 姜 猖 娠 恶 铃 悯 机 箩 刃 氨 偷 哟 凋 酣 褐 朴 杂 义 厦 螟 舆 楼 囚 叶 伴 厘 圣 ( 课 件 ) - 嵌 入 式 系 统 及 应 用 ( 课 件 ) - 嵌 入 式 系 统 及 应 用 电子科技大学嵌入式软件工程中心 初始化任务控制块 任务建立时,函数OS_TCBInit()初始化任务控制 块OS_TCB. 39 INT8U OS_TCBInit( INT8U prio, OS_STK *ptos, OS_STK * pbos, INT16U id, INT32U stk_size, void *pext, INT16U opt) /* prio是任务优务优先级级, ptos指向栈顶栈顶指针针, pbos指向栈栈底的指针针, id是任务标识务标识符, stk_size是堆栈栈的容量, pext是OS_TCB的扩扩展指针针, opt是选择项选择项 */ OS_TCB *ptcb; OS_ENTER_CRITICAL(); ptcb=OSTCBFreeList; if (ptcb!=(OS_TCB *)0) 涵 葛 谊 屁 邱 耳 卒 虫 臃 癌 沪 皖 确 挨 诚 娥 荫 烘 您 娩 卷 槽 虞 萤 倒 冶 讨 未 颗 管 斡 蔼 ( 课 件 ) - 嵌 入 式 系 统 及 应 用 ( 课 件 ) - 嵌 入 式 系 统 及 应 用 电子科技大学嵌入式软件工程中心 40 初始化任务控制块 OSTCBFreeList = ptcb - OSTCBNext; OS_EXIT_CRITICAL(); ptcb - OSTCBStkPtr = ptos; /栈顶栈顶指针针 ptcb - OSTCBPrio = (INT8U)prio; ptcb - OSTCBStat = OS_STAT_RDY; ptcb - OSTCBDly = 0; # if OS_TASK_CREATE_EXT_EN 0 ptcb - OSTCBExtPtr = pext; / OS_TCB的扩扩展指针针 ptcb - OSTCBStkSize = stk_size; / stk_size是堆栈栈的容量 ptcb - OSTCBStkBottom = pbos; /栈栈底指针针 ptcb - OSTCBOpt = opt; /选择项选择项 ptcb - OSTCBId = id; / id是任务标识务标识符 #endif 炭 钞 昧 国 突 屯 撰 整 进 禹 三 唇 厂 精 舔 猪 宣 哉 歧 褥 兵 潦 鸦 负 梁 伙 食 娩 戈 踩 撰 贵 ( 课 件 ) - 嵌 入 式 系 统 及 应 用 ( 课 件 ) - 嵌 入 式 系 统 及 应 用 电子科技大学嵌入式软件工程中心 41 初始化任务控制块 #if OS_TASK_DEL_EN 0 ptcb - OSTCBDelReq = OS_NO_ERR; #endif ptcb - OSTCBY = prio 3; ptcb - OSTCBBitY = OSMapTblptcb-OSTCBY; ptcb - OSTCBX = prio ptcb - OSTCBBitX = OSMapTblptcb-OSTCBX; #if OS_EVENT_EN0 ptcb - OSTCBEventPtr = (OS_EVENT *)0; /事件指针为针为空 #endif #if (OS_VERSION = 251) /事件标标志节节点指针为针为空 #endif 进 胜 改 雷 缉 镶 培 蚂 舀 适 片 囤 贸 娟 滩 婿 苏 歹 劝 钵 毅 恼 狸 芬 几 砌 码 汲 桅 拧 摆 赢 ( 课 件 ) - 嵌 入 式 系 统 及 应 用 ( 课 件 ) - 嵌 入 式 系 统 及 应 用 电子科技大学嵌入式软件工程中心 42 初始化任务控制块 #if (OS_Q_EN 0) /消息指针为针为空 #endif OS_ENTER_CRITICAL();/把OS_TCB插入到已经经建立任务务的双向链链表中,需关中断 OSTCBPrioTblprio = ptcb; ptcb-OSTCBNext = OSTCBList; ptcb-OSTCBPrev = (OS_TCB *)0; if (OSTCBList!=(OS_TCB *)0) OSTCBList-OSTCBPrev = ptcb; OSTCBList = ptcb; OSRdyGrp |= ptcb-OSTCBBitY; OSRdyTblptcb-OSTCBY |= ptcb-OSTCBBitX; OS_EXIT_CRITICAL(); return(OS_NO_ERR);/返回值值用于内核掌握执执行情况 或 剥 浦 封 柏 岂 荣 封 邦 盟 甚 迈 滚 翟 圈 备 衙 赫 喜 皱 豺 玉 杆 前 茵 撞 瞪 呐 阔 娃 凛 阐 ( 课 件 ) - 嵌 入 式 系 统 及 应 用 ( 课 件 ) - 嵌 入 式 系 统 及 应 用 电子科技大学嵌入式软件工程中心 43 初始化任务控制块 OS_EXIT_CRITICAL(); return (OS_NO_MORE_TCB);/返回值值用于内核掌握执执行情况 总结: 1.目前,内核对TCB维护了3个全局数组:任务控制块表