RTOSuCOS-II原理及应用.ppt

上传人:san****019 文档编号:17223091 上传时间:2020-11-15 格式:PPT 页数:113 大小:1.83MB
收藏 版权申诉 举报 下载
RTOSuCOS-II原理及应用.ppt_第1页
第1页 / 共113页
RTOSuCOS-II原理及应用.ppt_第2页
第2页 / 共113页
RTOSuCOS-II原理及应用.ppt_第3页
第3页 / 共113页
资源描述:

《RTOSuCOS-II原理及应用.ppt》由会员分享,可在线阅读,更多相关《RTOSuCOS-II原理及应用.ppt(113页珍藏版)》请在装配图网上搜索。

1、page 1 2020/11/15 嵌入式实时操作系统 C/OS-II page 2020/11/15 2 第 2章 uC/OS-II 中的任务 page 山东科技大学 信息学院 3 2020/11/15 第 2章 目录 1、任务的基本概念 2、任务堆栈 3、任务控制块及任务控制块链表 4、任务就绪表及任务调度 5、任务的创建 6、任务的挂起和恢复 7、其他任务管理函数 8、 uC/OS-II的初始化和任务的启动 page 山东科技大学 信息学院 4 2020/11/15 第 2章 补充 .目录 1、任务的特性 2、任务的划分目标 3、任务的划分方法 4、任务的可调度性分析 5、任务的执行分类

2、和优先级安排 6、任务设计中的问题 7、系统设计编码实现过程 8、中断服务程序的设计 page 山东科技大学 信息学院 5 2020/11/15 第 2章 目录 1、任务的基本概念 2、任务堆栈 3、任务控制块及任务控制块链表 4、任务就绪表及任务调度 5、任务的创建 6、任务的挂起和恢复 7、其他任务管理函数 8、 uC/OS-II的初始化和任务的启动 page 山东科技大学 信息学院 6 2020/11/15 2.1 任务的基本概念 复杂问题 “分而治之” 的问题解题思路。 针对目标系统拆分后的 “小且易” 的问题的具 体处理方法编码和数据结构 - 任务。 uC/OS-II的两种任务:系统

3、任务、用户任务。 任务的组成: 任务控制块 - uC/OS-II进行任务管理用的一个数据结构。 任务代码 - 描述任务算法的程序编码。 任务堆栈 - 任务的工作现场环境。 page 山东科技大学 信息学院 7 2020/11/15 2.1 任务的基本概念 page 山东科技大学 信息学院 8 2020/11/15 2.1 任务的基本概念 “宏观” 上的多任务并发,实际上是 用单 CPU 进行多任务处理,“微观” 任 何时刻,只能运行一个任务,存在 CPU资 源竞争 - 任务调度、任务现场。 各个任务在多任务系统中也随着环境条 件的情况而具有不同的状态。 任务状态划分也是多任务操作系统的管 理手

4、段。 任务的 5 种状态: Sleep - 仅有编码未激活。 Ready - 已激活并“万事俱备,只欠调度” Running - 正占用 CPU 运行自己。 Wait - 等待某事件发生。 ISR_Sta - Running状态的任务被中断后进 入的状态。 page 山东科技大学 信息学院 9 2020/11/15 任务的状态及其转换 正在运行的任务,需要 等待一段时间或需要等 待一个事件发生再运行 时,该任务就会把 CPU 的使用权让给别的任务 而使任务进入等待状态 。 任务在没有被配备 任务控制块或被剥 夺了任务控制块时 的状态叫做任务的 睡眠状态 系统为任务配备 了任务控制块且 在任务就

5、绪表中 进行了就绪登记, 这时任务的状态 叫做就绪状态。 处于就绪状态的 任务如果经调度 器判断获得了 CPU的使用权 , 则任务就进入运 行状态 一个正在运行的 任务一旦响应中 断申请就会中止 运行而去执行中 断服务程序,这 时任务的状态叫 做中断服务状态 page 山东科技大学 信息学院 10 2020/11/15 用户任务代码 的一般结构 void MyTask(void *pdata) / 任务的初始化 for ( ; ; ) /超循环构成任务体 可被中断的用户代码片断; OS_ENTER_CRITICAL(); /进入临界区(关中断) 不可被中断的用户代码片断; OS_EXIT_CR

6、ITICAL(); /退出临界区(开中断) 可被中断的用户代码片断; page 山东科技大学 信息学院 11 2020/11/15 用户应用程序 的一般结构 “用户任务” 代码形式上很像 C函数,但他不是 函数! “任务” 不能被主函数 main( ) 或其他函数调用, 只能被主函数或已激活任务 创建 。 任务的运行由操作系统调度管理。 void MyTask1(void *pdata) void MyTask2(void *pdata) void main( ) OSInit( ); OSTaskCreate( MyTask1, ); OSTaskCreate( MyTask2, ); OS

7、Start( ); page 山东科技大学 信息学院 12 2020/11/15 2.1 任务的基本概念 在此我们学习了 uC/OS-II 的 3 个系统函数和 2个宏。 OSInit( ) - 初始化 uC/OS-II 环境。 OSTaskCreate( ) - 创建任务系统函数。 OSStart( ) - 启动 uC/OS-II 任务调度器。 OS_ENTER_CRITICAL( ) - 进入临界区 (宏) OS_EXIT_CRITICAL( ) - 退出临界区 (宏) OSInit( ) 函数原型: void OSInit( void ) OSStar( ) 函数原型: void OSS

8、tart( void ) OSTaskCreate( ) 函数原型: INT8U OSTaskCreate( void (*task)(void *pd) , /指向任务的指针 void *pdata , /传递给任务的参数 OS_STK *ptos , /任务堆栈栈顶的指针 INT8U prio /任务的优先级别 ) page 山东科技大学 信息学院 13 2020/11/15 OSTaskCreate( ) 函数使用举例: 定义任务 task_A void task_A(void* pdata) ; /任务初始化部分 while (1) ; /任务功能代码 在系统 “创建” 任务 task

9、_A void main(void) OSInit(); /系统初始化部分 OSTaskCreate( task_A, void * 0, OSStart(); page 山东科技大学 信息学院 14 2020/11/15 2.1 任务的基本概念 系统任务 空闲任务( OSTaskIdel( )) 统计任务( OSTaskStat( )) 原型: void OSTaskIdel(void* pdata) 原型: void OSTaskStat(void* pdata) 空闲任务( OSTaskIdel( ))使用说明: 1、 uC/OS-II规定用户程序中必须使用 OSTaskIdel。 2、

10、该任务不能用软件删除。 3、该任务是 uC/OS-II初始化时自动创建,其任务优先 级固定为最低级,用户也可修改该任务的业务。 4、目的 - 使 CPU 在没有用户任务可执行时也有事可 做。 统计任务( OSTaskStat( ))使用说明: 1、功能完成用户任务 CPU 使用率的统计,结果以百分 比的形式存放在变量 OSCPUsage 中。 2、该任务用户可选择使用。 OS_CFG.H文件中的常数 OS_TASK_STAT_EN 设置为 1,使能该函数。 3、用户在 OS_CFG.H中使能该任务后,系统自动创建 该任务,但在用户使用统计数据前必须调用系统 函数 OSStatInit() 先进

11、行初始化。 4、该任务固定拥有次末任务优先级。 page 山东科技大学 信息学院 15 2020/11/15 2.1 任务的基本概念 任务的优先权和优先级别 uC/OS-II 的每个任务都必须有唯一的优先级。 uC/OS-II 最多可以管理 64个优先级别分配给 64个任务。 uC/OS-II 中用一个 8b的整型数来表示优先级别,数字越 小,优先级越高, prio = 0 的任务优先级最高。 uC/OS-II 中使用任务的优先级( prio)作为 任务句柄 。 用户通过修改 OS_CFG.H 中的宏定义常数 OS_LOWEST_PRIO 的值,约定本用户系统的最大优先 级数。 page 山东

12、科技大学 信息学院 16 2020/11/15 第 2章 目录 1、任务的基本概念 2、任务堆栈 3、任务控制块及任务控制块链表 4、任务就绪表及任务调度 5、任务的创建 6、任务的挂起和恢复 7、其他任务管理函数 8、 uC/OS-II的初始化和任务的启动 page 山东科技大学 信息学院 17 2020/11/15 2.2 任务堆栈 堆栈 - LIFO访问原则组织的连续存储器。 任务堆栈在 uC/OS-II 中的应用: 任务堆栈是任务的三大组成部分之一。 保存 CPU 寄存器现场( R0R12、 LR、 SPSR 等)。 本 Task 的私有数据。 page 山东科技大学 信息学院 18

13、2020/11/15 2.2 任务堆栈 任务堆栈的创建 - 在创建任务的同时,任务堆栈即被创建。 举例 : #define MyTaskStkSize 64 OS_STK MyTaskStk MyTaskStkSize /在 OS_CPU.H中定义 OS_STK / typedef INT32U OS_STK INT8U OSTaskCreate( void (*task) (void *pd), /指向任务的指针 void * pdata, /传递给任务的参数 MyTaskStk MyTaskStkSize 1 /任务堆栈 栈顶 的指针 INT8U prio /任务的优先级别 ) page

14、山东科技大学 信息学院 19 2020/11/15 2.2 任务堆栈 任务堆栈的使用注意事项 _ 存在两种堆栈形式 递增堆栈 - 进栈操作 向大地址方向发展。 递减堆栈 - 进栈操作 向小地址方向发展。 OSTaskCreate( /指向下一个 TCB的指针 struct os_tcb *OSTCBPrev; /指向前一个 TCB的指针 OS_STK *OSTCBStkPtr; /指向任务堆栈栈顶的指针 INT16U OSTCBDly; /任务等待时间 INT8U OSTCBStat; /任务的当前状态标志 INT8U OSTCBPrio; /任务的优先级别 OS_TCB; page 山东科技

15、大学 信息学院 23 2020/11/15 2.3 任务控制块及任务控制块链表 任务控制块链表 空任务控制块链表( OSTCBFreeList) 任务控制块链表 ( OSTCBList) - uC/OS-II 用两个链表来管理 TCB page 山东科技大学 信息学院 24 2020/11/15 2.3 任务控制块及任务控制块链表 任务控制块链表 空任务块链表是在 uC/OS-II 初始化( OSInit())时系 统自建的,用户可依据目标系统的实际需求,设定其链表 长度。 OS_CFG.H 文件中的宏常数 OS_MAX_TASKS - 用于 定义最大用户任务数。 UCOS_II.H 文件中的

16、宏常数 OS_N_SYS_TASKS - 用 于约定系统任务数,其值固定为 2 。 当应用程序调用函数 OSTaskCreate( )创建 一个任务时,这个函数会调用系统函数 OSTCBInit( )来为任务控制块进行初始化。 这个函数首先为被创建任务从空任务控制块 链表获取一个任务控制块,然后用任务的属 性对任务控制块各个成员进行赋值,最后再 把这个任务控制块链入到任务控制块链表的 头部。 当进行系统初始化时,初始化函数 会按用户提供的任务数为系统创建具 有相应数量的任务控制块并把它们链 接为一个链表。 由于这些任务控制块还没有对应的 任务,故这个链表叫做 空任务块链表 。 即相当于是一些空

17、白的身份证。 page 山东科技大学 信息学院 25 2020/11/15 任务控制块链表 空任务控制块链表 page 山东科技大学 信息学院 26 2020/11/15 uC/OS-II 中提供了系统函数 OSTaskDel( ), 用于删除一个任务 - 实质就是将该任务 的 TCB从 “ 任务控制块列表 ” 移到了 “ 空任务控制块列表 ” 。 2.3 任务控制块及任务控制块链表 任务控制块 就相当于是 一个任务的身份证,没有任 务控制块的任务是不能被系 统承认和管理。 任务控制块链表 page 山东科技大学 信息学院 27 2020/11/15 2.3 任务控制块及任务控制块链表 任务控

18、制块链表其他相关系统管理变量 OSTCBPrioTbl : OS_TCB* 数据类型的数组, 以 Prio 为下标存放已使能的 TCB 指针。用 于加速 TCB 的访问。 OSTCBCur:全局系统变量,指向当前正在 运行的任务的 TCB 。 OSTCBFreeList、 OSTCBList OSTCBTbl - OSInit()建立的任务控制块数组 OSTCBPrioTbl - 任务控制块优先级数组 OSTCBCur page 山东科技大学 信息学院 28 2020/11/15 第 2章 目录 1、任务的基本概念 2、任务堆栈 3、任务控制块及任务控制块链表 4、任务就绪表及任务调度 5、任

19、务的创建 6、任务的挂起和恢复 7、其他任务管理函数 8、 uC/OS-II的初始化和任务的启动 page 山东科技大学 信息学院 29 2020/11/15 补充:多任务 OS - 的基本工作方式 page 山东科技大学 信息学院 30 2020/11/15 什么是多任务系统 简单地说,就是能用一个处理器 并发(注意,不是同时! ) 地运行多个程序的计算机管理系统。 并发 : 由同一个处理器轮换地 运行多个程序。或者说是由多个 程序轮班地 占用 处理器这个资源。 且在占用这个资源期间,并不一 定能够把程序运行完毕。 并发过程 示意图 处理器如何进行程序的 切换? page 山东科技大学 信息

20、学院 31 2020/11/15 程序的切换(两句话) 处理器是个傻瓜, PC让 它干啥,它就干啥。 PC是个指路器,它指向哪 儿,处理器就去哪儿。 从此可以知道,哪个程 序占有了 PC,哪个程序 就占有了处理器。 哪个人占有了一个姑娘 的 芳心 ,哪个人就 深刻地理解 PC是理解系统 进行程序切换动作的关键。 page 山东科技大学 信息学院 32 2020/11/15 所谓切换就是: PC 目标地址 如何操作 PC 指令: 不同的计算机类型的指 令是不同的。 数据传送指令 子程序返回指令( 由堆 栈弹出 ) 中断、中断返回指令 ( 由堆栈弹出 ) page 山东科技大学 信息学院 33 2

21、020/11/15 小结 系统是通过把待运行程 序的地址赋予程序计数 器 PC来实现程序的切换 的。 page 山东科技大学 信息学院 34 2020/11/15 任务代码 任务堆栈 内存 处理器 PC SP 任务运行时与 处理器之间的关系 处理器通过两个指针寄存 器( PC和 SP)来与任务 代码和任务堆栈建立联系 并运行它 寄存器组 程序运行环境 运行环境包括了两部分: 处理器中的运行环境和 内存中的运行环境 page 山东科技大学 信息学院 35 2020/11/15 任务代码 任务堆栈 内存 处理器 PC SP 多任务时的问题 任务代码 任务堆栈 内存 任务代码 任务堆栈 内存 ? 当

22、有多个任务时,处理 器中的运行环境应该怎 么办? 寄存器组 程序运行环境 page 山东科技大学 信息学院 36 2020/11/15 程序 虚拟 处理器 PC SP 虚拟 处理器 PC SP 虚拟 处理器 PC SP 虚拟 处理器 PC SP 调度器 多任务时任务与处理器之间关系的处理 程序 处理器 PC SP 在内存中为每个任 务创建一个虚拟的 处理器(处理器部 分的运行环境 由操作系统的 调度 器 按某种规则来进 行这两个复制工作 复制 当需要运行某个任务时 就把该任务的虚拟处理 器复制到实际处理器中 复制 当需要中止当前任 务时,则把任务对 应的虚拟处理器复 制到内存 复制 再把另一个

23、需要运行的任 务的虚拟处理器复制到实 际处理器中 寄存器组 寄存器组 也就是说,任务的切换是 任务 运行环境的切换 page 山东科技大学 信息学院 37 2020/11/15 虚拟处理器 虚拟处理器应该存储的主要信息: 1。程序的断点地址( PC) 2。任务堆栈指针( SP) 3。程序状态字寄存器( PSW) 4。通用寄存器内容 5。函数调用信息(已存在于堆栈) 这些内容通常保存 在任务堆栈中,这 些内容也常叫做任 务的上下文。 其实,程序切换的关键是 把程序的 私有堆栈指针 赋 予处理器的堆栈指针 SP 实质上系统是通过 SP的切换 来实现程序的切换的。 要建立一个概念: 具有控制块的程序

24、才是一个可以 被系统所运行的任务。 程序代码、私有堆栈、任务控制 块 是任务的三要件。 任务控制块提供了运行环境的存 储位置。 page 山东科技大学 信息学院 38 2020/11/15 2.4 任务就绪表及任务调度 多任务操作系统的核心工作就是任务调度 。 所谓 调度 , 就是通过一个算法在多个任务中 确定该运行的任务 , 做这项工作的函数就叫做 调度器 。 C/OS_II进行任务调度的思想是 “ 近似地每 时每刻总是让优先级最高的就绪任务处于运行 状态 ” 。为了保证这一点,它 在系统或用户任 务调用系统函数及执行中断服务程序结束时总 是调用调度器,来确定应该运行的任务并运行 它 。 C

25、/OS_II进行任务调度 的依据就是 任务就绪表 page 山东科技大学 信息学院 39 2020/11/15 2.4 任务就绪表及任务调度 任务就绪表的结构 为了能够使系统清楚地知道,系统中哪些任务已 经就绪,哪些还没有就绪, C/OS_II 在 RAM中设立 了一个记录表, 系统中的每个任务都在这个表中 占据一 Bit 的位置,并用这个位置的状态( 1或者 0) 来表示任务是否处于就绪状态 ,这个表就叫做任 务就绪状态表,简称叫 任务就绪表 - 一个 INT8U 的数组 OSRdyTbl 充当,最多 8个元素,可以标示 64个任务。 page 山东科技大学 信息学院 40 2020/11/

26、15 就是一个二维数组 OSRdyTbl page 山东科技大学 信息学院 41 2020/11/15 为加快访问任务就绪表的 速度,系统定义了一个变 量 OSRdyGrp来表明就绪表 每行中是否存在就绪任务。 OSRdyTbl 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1

27、/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 OSRdyGrp D7 D6 D5 D4 D3 D2 D1 D0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 任务就绪表的示意图 0 1 2 3 4 5 6 7 x y 0 1 2 3 4 5 6 7 page 山东科技大学 信息学院 43 2020/11/15 2.4 任务就绪表及任务调度 任务优先级数据结构分析 uC/OS-II 最多管理 64个任务, Prio值域: 0 63,对应 的二进制数 000,000 111,111(

28、6bit), OSRdyGrp (任务组就绪变量) 8 bit,任务就续数组元素 OSRdyTbl 也是 8bit。 prio.D5:3 - 对应 OSRdyTbl 的 下标(任务组号 x ), 也对应 OSRdyGrp 的位号。 prio.D2:0 -对应 OSRdyTbl 元素的位号(任务组号 y ) 备注:这就是 prio 的值和任务就绪表的映射关系。 page 山东科技大学 信息学院 44 2020/11/15 举例: prio = 29 的任务在任务就续表中的表示。 prio = 29 , 其 8 进制表示为: 35 O OSRdyGrp D7 D6 D5 D4 D3 D2 D1 D

29、0 1 1 1 1 0 0 0 0 prio=29 D7 D6 D5 D4 D3 D2 D1 D0 1 D7 D6 D5 D4 D3 D2 D1 D0 1 OSRdyTbl3 prio 为 29的任务就绪状态在任务就绪表中的表示 Y X page 山东科技大学 信息学院 45 2020/11/15 2.4 任务就绪表及任务调度 依照 prio “置 /清” 任务就绪表的操作 OSMapTbl0 = 0000,0001B OSMapTbl1 = 0000,0010B OSMapTbl2 = 0000,0100B OSMapTbl3 = 0000,1000B OSMapTbl4 = 0001,00

30、00B OSMapTbl5 = 0010,0000B OSMapTbl6 = 0100,0000B OSMapTbl7 = 1000,0000B 在 uC/OS-II 中预定义了一个 OSMapTbl 数组: page 山东科技大学 信息学院 46 2020/11/15 OSRdyGrp D7 D6 D5 D4 D3 D2 D1 D0 1 1 1 1 0 0 0 0 prio=29 D7 D6 D5 D4 D3 D2 D1 D0 1 D7 D6 D5 D4 D3 D2 D1 D0 1 OSRdyTbl3 操作:把 prio为 29的任务置为就绪状态 Y X OSRdyGrp | = OSMap

31、Tbl prio3 ; OSRdyTbl prio3 | = OSMapTbl prio OSMapTbl0 = 0000,0001B OSMapTbl1 = 0000,0010B OSMapTbl2 = 0000,0100B OSMapTbl3 = 0000,1000B OSMapTbl4 = 0001,0000B OSMapTbl5 = 0010,0000B OSMapTbl6 = 0100,0000B OSMapTbl7 = 1000,0000B 在程序中 , 可以用下面的代码把优先级别为 prio 的任务置为就绪状态: OSRdyGrp | = OSMapTblprio3; OSRdy

32、Tblprio3 | = OSMapTblprio 使用如下代码可使一个优先级别为 prio的任务 脱离就绪状态: if(OSRdyTblprio3 page 山东科技大学 信息学院 47 2020/11/15 2.4 任务就绪表及任务调度 任务就绪表的操作 从 prio 到就绪表 ( OSRdyGrp、 OSRdyTbl ) 的操作(进入 /脱离 - 就绪状态)。 从就绪表 ( OSRdyGrp、 OSRdyTbl )的当前 状态(位图)到最高优先级别 prio 的(任务) 映射操作。 page 山东科技大学 信息学院 48 2020/11/15 2.4 任务就绪表及任务调度 依照任务就绪表

33、的状态计算 prio 的操作 INT8U const OSUnMapTbl = 0,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0, 4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0, 5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0, ; 备注:该数组共计 256个元素,详见 Book page32 (亦称之为 优先级判定表 ) 在 uC/OS-II 中预定义了一个 OSUnMapTbl 数组: page 山东科技大学 信息学院 49 2020/11/15 OSRdyGrp D7 D6 D5 D4 D3 D2 D1 D0 1 1 1 1 0 0 0 0

34、 prio=29 D7 D6 D5 D4 D3 D2 D1 D0 1 D7 D6 D5 D4 D3 D2 D1 D0 1 OSRdyTbl y x = OSUnMapTblOSRdyTbly; 1 1 0 0 0 0 0 0 0 0 0 0 0 0 y = OSUnMapTblOSRdyGrp; 图 5-6 在就绪表中查找最高优先级别任务的过程 说明:在 “按图索骥” 算法中,对于所有的任务其 “索骥” 时间都是一致 的。 S1、以系统变量 OSRdyGrp 为下标,查 OSUnMapTbl 表,可得 y 。 S2、以 OSRdyTbl 的第 y 元素为下标,查 OSUnMapTbl 表,可得

35、 x 。 page 山东科技大学 信息学院 50 2020/11/15 用下代码可从任务就绪表中获取优先级别最高的就绪任 务 ( prio) : y = OSUnMapTalOSRdyGrp; / D5、 D4、 D3位 x = OSUnMapTalOSRdyTbly; / D2、 D1、 D0位 prio = (y3)+x; / 优先级别 或 y = OSUnMapTblOSRdyGrp; prio = (INT8U)(y OSTCBStkPtr 4. 获得待运行任务 TCB 5. 获得待运行任务 TCB-OSTCBStkPtr 6. 恢复待运行任务 CPU现场(不包含 PC) 7. 切换

36、CPU.PC ,使 CPU接续运行待运行 Task断点。 备注: Step1 - 中断方式保护; Step7 - IRET指令恢复 PC;汇编 语言编程 OS_TASK_SW( ) - 直接操作寄存器 page 山东科技大学 信息学院 60 2020/11/15 第 2章 目录 1、任务的基本概念 2、任务堆栈 3、任务控制块及任务控制块链表 4、任务就绪表及任务调度 5、任务的创建 6、任务的挂起和恢复 7、其他任务管理函数 8、 uC/OS-II的初始化和任务的启动 page 山东科技大学 信息学院 61 2020/11/15 2.5 任务的创建 任务的创建 - 创建该任务的 TCB;在

37、TCB中将该 任务的 Code、 Stack关联起来和 TCB共同构成 Task。 uC/OS-II提供两个系统函数创建 Task : OSTaskCreate( ) OSTaskCreateExt( ) 备注:关于这两个函数的使用很简单,不再重复。 创建 Task时,要求注意核算 Task.Stack的大小 和核定 Task.Prio必须保证不重复。 page 山东科技大学 信息学院 62 2020/11/15 2.5 任务的创建 创建任务的一般方法 Task 可在主函数 main( ) 中操作系统调度启动 ( OSStart( ))前创建。 也可在 Task中创建其他的 Task,应用中习

38、惯使 用此结构。 uC/OS-II要求:在 OSStart( )前,必须至少创建 一个用户 Task。 page 山东科技大学 信息学院 63 2020/11/15 2.5 任务的创建 创建任务的示意代码 void main( ) /主要是系统硬件初始化 OSInit( ); / uC/OS-II 初始化 /创建消息机制 OSTaskCreate(Task_A,); / 创建任务 A OSStart( ); / 启动多任务调动 void Task_A(void * pdata) /任务 A / 安装并启动 uC/OS-II 系统时钟 OSStatInit( ); / 初始化统计任务(如果需要的

39、话) / 在此处可以创建其他任务 For ( ; ; ) / Task_A 任务体 page 山东科技大学 信息学院 64 2020/11/15 两个延时函数的原型: void OSTimeDly( INT16U ticks ) /* ticks 是节拍数 */ INT8U OSTimeDlyHMSM (INT8U hours, INT8U minutes, INT8U seconds, INT16U milli) /* 绝对时间延时,位于 OS_TIME.C */ 备注: 1、参数值域 hours255, minutes59, seconds59, milli999 2、这两个系统函数定义在

40、 OS_TIME.C文件中。 3、关于节拍周期定义在 OS_CFG.H文件中。 补充:任务延时系统函数。 page 山东科技大学 信息学院 65 2020/11/15 实验 1: 创建两个任务; Task_A - 控制一位 LED秒闪。 Task_B - 控制蜂鸣器每 3S鸣 1.5S。 1、学习创建任务操作编程; 2、体验延时函数的使用; 3、体验多任务系统设计基本方式; 实验目的: page 山东科技大学 信息学院 66 2020/11/15 第 2章 目录 1、任务的基本概念 2、任务堆栈 3、任务控制块及任务控制块链表 4、任务就绪表及任务调度 5、任务的创建 6、任务的挂起和恢复 7

41、、其他任务管理函数 8、 uC/OS-II的初始化和任务的启动 page 山东科技大学 信息学院 67 2020/11/15 2.6 任务的挂起和恢复 所谓的挂起一个任务,就是暂停这个任务的调度。 挂起任务的 TCB 还存在系统中,只是该任务的状态 是 “挂起” ,对挂起态的任务 uC/OS-II不再调度运行。 挂起的任务恢复后即可参与 uC/OS-II的任务调度。 uC/OS-II中,可挂起除 “空闲任务”( OSTaskIdel( )) 外的任何任务。 挂起 /恢复使用系统函数 OSTaskSuspend( ) / OSTaskResume( ) 实现。 page 山东科技大学 信息学院

42、68 2020/11/15 2.6 任务的挂起和恢复 挂起任务函数原型 INT8U OSTaskSuspend( INT8U prio ); 本函数的参数、返回值及含义: 用优先级指定目标,挂起自身时使用 OS_PRIO_SELF OS_NO_ERR - 完成指定任务的挂起。 OS_TASK_SUSPEND_IDEL - 不能挂起空闲任务。 OS_PRIO_INVALID - 无效的任务(优先级)指定。 OS_TASK_SUSPEND_PRIO -指定的任务不存在。 page 山东科技大学 信息学院 69 2020/11/15 2.6 任务的挂起和恢复 恢复任务函数原型 INT8U OSTas

43、kResume( INT8U prio ); 本函数的参数、返回值及含义: 用优先级指定目标。 OS_NO_ERR - 完成指定任务的恢复。 OS_TASK_RESUME_PRIO - 优先级指定的任务不存在。 OS_PRIO_INVALID - 无效的任务(优先级)指定。 OS_TASK_NO_SUSPEND - 指定的任务不是挂起态。 page 山东科技大学 信息学院 70 2020/11/15 第 2章 目录 1、任务的基本概念 2、任务堆栈 3、任务控制块及任务控制块链表 4、任务就绪表及任务调度 5、任务的创建 6、任务的挂起和恢复 7、其他任务管理函数 8、 uC/OS-II的初始

44、化和任务的启动 page 山东科技大学 信息学院 71 2020/11/15 2.7 其他 任务管理函数 修改任务优先级别函数原型 INT8U OSTaskChangePrio( INT8U oldprio, INT8U newprio ); 函数说明: 在任务运行时,修改任务的优先级。 功能正确完成,函数返回 OS_NO_ERR。 OS_PRIO_INVALID - 指定的 prio 越界。 OS_PRIO_EXIST - newprio 已在用。 OS_PRIO_ERR - oldprio 不存在。 page 山东科技大学 信息学院 72 2020/11/15 实验 2: 设计一个试验并完

45、成:测试 OSTaskChangePrio( ) “任务挂起” 系统函数应用特性。 如果修改挂起任务的优先级会是什么结果; 可否修改任务自身的优先级 。 有目的地主动设计实验,验证推测,得到结论; 实验目的: page 山东科技大学 信息学院 73 2020/11/15 2.7 其他 任务管理函数 任务的删除函数原型 INT8U OSTaskDel( INT8U prio ); 函数说明: 使用 OS_PRIO_SELF 参数删除任务时是删除自身。 功能正确完成,函数返回 OS_NO_ERR。 删除一个任务实质上是删除该任务的 TCB并归还到 “空任务控制块链表” ,释放堆栈空间,并不删除 任

46、务代码。 page 山东科技大学 信息学院 74 2020/11/15 2.7 其他 任务管理函数 关于任务的删除 “任务 A” 在删除 “任务 B” 时, A不能知道 B的详细情况, 可能会造成 A已申请的资源从系统中永久的丢失 - 这不 合理! 正确的方法 - Task_A 欲删除 Task_B 时, A 提出删除申 请, B根据自身的情况处理后,删除自身。 uC/OS-II 中的 TCB 含有一个成员 OSTCBDelReq 用于标示 有其他任务申请删除它。 使用系统函数 OSTaskDelReq( ) 提出任务删除申请。 ISR 中不允许删除任务。 page 山东科技大学 信息学院 7

47、5 2020/11/15 2.7 其他 任务管理函数 OSTaskDelReq( ) 系统函数原型: INT8U OSTaskDelReq( INT8U prio ) ; 优先级指定其他任务时的函数返回值说明: OS_TASK_IDEL_PRIO - 申请删除空闲任务出错。 OS_PRIO_INVALID - 优先级指定出错。 OS_TASK_NOT_EXIST - 优先级指定的任务已不存在。 OS_NO_ERR - 删除申请成功。 特别说明:此函数的参数可以是 “优先级” 指 定的其他任务,也可以是 OS_PRIO_SELF 指定自身,后者用于查阅是否有其 他任 务申请删除本任务。 page

48、 山东科技大学 信息学院 76 2020/11/15 2.7 其他 任务管理函数 OSTaskDelReq( ) 系统函数原型: INT8U OSTaskDelReq( INT8U prio ) ; 参数为 OS_PRIO_SELF 时的 函数返回值说明: OS_TASK_DEL_REQ - 有其他任务申请删除这个任务。 举例: Task_A (prio = 10) 删除 Task_B (prio = 9) ,直到删除成 功, Task_A才继续。 Void Task_A ( void *pdata ) / Task_A prio = 10 while ( OSTaskDelReq(9) !=

49、 OS_TASK_NOT_EXIST ) / 申请删除 Task_B OS_TimeDly( 10 ); / 直到删除成功 Void Task_B ( void *pdata ) / Task_B prio = 9 if ( OSTaskDelReq( OS_PRIO_SELF ) = OS_TASK_DEL_REQ ) / 有删除申请 / 释放私有资源 OSTaskDel ( OS_PRIO_SELF ); / 删除自身 else ; / 任务 B的其他代码 page 山东科技大学 信息学院 78 2020/11/15 实验 3: 创建两个任务; Task_A - 控制一位 LED秒闪。 T

50、ask_B - 控制蜂鸣器每 3S 鸣 1.5S 。 LED闪烁 10次后,停止蜂鸣 。 1、学习任务的删除操作; 2、体验多任务系统设计基本原理; 实验目的: page 山东科技大学 信息学院 79 2020/11/15 第 2章 目录 1、任务的基本概念 2、任务堆栈 3、任务控制块及任务控制块链表 4、任务就绪表及任务调度 5、任务的创建 6、任务的挂起和恢复 7、其他任务管理函数 8、 uC/OS-II的初始化和任务的启动 page 山东科技大学 信息学院 80 2020/11/15 2.8 uC/OS-II的初始化和任务的启动 uC/OS-II的初始化 在使用 uC/OS-II之前,

51、必须对其运行环境初始化。 void OSInit( viod ) ; 用法举例: void main (void) . OSInit(); /* Initialize uC/OS-II */ . /* Craete Task */ OSStart(); /* Start Multitasking */ OSInit( ) 的主要工作: 对 uC/OS-II 的所有全局变量和数据结构初 始化。 创建空间任务 ( OSTaskIdel() ) 根据系统设置 ( OS_TASK_STAT_EN = 1 / 0 ) 启动统计任务。 page 山东科技大学 信息学院 81 2020/11/15 2.8

52、uC/OS-II的初始化和任务的启动 uC/OS-II的启动 主函数 main( ) 调用了 OSStart( ) 之后, uC/OS-II 才开始任务调度管理。 void OSStart( viod ) ; 用法举例: void main (void) . OSInit(); /* Initialize uC/OS-II */ . /* Craete Task */ OSStart(); /* Start Multitasking */ page 山东科技大学 信息学院 82 2020/11/15 本章小结 Task 由 TCB、 Task_Stack、 Task_Code 三部分组成。 u

53、C/OS-II使用 TCB 对任务进行控制。 Task_Stack 用于任务切换时私有现场保护。 uC/OS-II 按任务优先级对任务进行调度。 uC/OS-II 每调用一次 API函数和中断返回都会进行一次任务 调度。 任务调度的周期和任务调度器自身的运行事件无关。 任务的优先级 (prio)也是任务的句柄。 uC/OS-II 的初始化和启动。 page 山东科技大学 信息学院 83 2020/11/15 实验 4: 基于 Smart 2200 Demo Board 的资源情况,设计一 个试验,验证 “任务 优先级 ” 对任务调度的影响。 1、有目的地主动设计实验,验证推测,得到结论; 2、

54、体验多任务操作系统环境中,“任务优先级” 对任 务调度的影响,加深相关认识。 实验目的: page 山东科技大学 信息学院 84 2020/11/15 第 2章 补充 .目录 1、任务的特性 2、任务的划分目标 3、任务的划分方法 4、任务的可调度性分析 5、任务的执行分类和优先级安排 6、任务设计中的问题 7、系统设计编码实现过程 8、中断服务程序的设计 page 山东科技大学 信息学院 85 2020/11/15 补充: 1 - 任务的特性 任务的动态性 Task 的状态在整个生命过程中是在动态 变化的( Ready、 Wait、 Suspend.), 即使是已开始运行的 Task 也未必

55、一直占有 CPU。 “任务” 的三个基本特性: 动态性、独立性、并发行 page 山东科技大学 信息学院 86 2020/11/15 补充: 1 - 任务的特性 任务的独立性 应用系统中的 Task 之间在功能上可能有从属关系, 但在形式结构上都是平等的。 RTOS 下的各任务都可 以认为 CPU是自己独占的。 Task 间的数据交互必经由操作系统采用各种 “通信” 的机制实现。 任务的独立性表现为各个任务形式结 构上的平等性和任务间信息传递的非直接 性。 page 山东科技大学 信息学院 87 2020/11/15 补充: 1 - 任务的特性 任务的并发性 应用系统中的多个 Task 宏观上

56、都在运行,但微观上 不是同时运行,这种并发是“伪并发”。 哪一个 Task 占有 CPU 由 RTOS 按照优先级和就绪状态 剥夺式调度。 任务的独立性表现为各个任务形式结 构上的平等性和任务间信息传递的非直接 性。 page 山东科技大学 信息学院 88 2020/11/15 第 2章 补充 .目录 1、任务的特性 2、任务的划分目标 3、任务的划分方法 4、任务的可调度性分析 5、任务的执行分类和优先级安排 6、任务设计中的问题 7、系统设计编码实现过程 8、中断服务程序的设计 page 山东科技大学 信息学院 89 2020/11/15 补充: 2 - 任务的划分目标 设计一个嵌入式应用

57、系统时 Task 的划分可以有多 种方案。 主要依据:系统的组成和实现的功能目标。 任务划分的目标和要考虑的主要因素: 实时性。 任务数的合理性。 目标系统软件的简便清晰性。 降低系统对软硬件资源的需求。 page 山东科技大学 信息学院 90 2020/11/15 第 2章 补充 .目录 1、任务的特性 2、任务的划分目标 3、任务的划分方法 4、任务的可调度性分析 5、任务的执行分类和优先级安排 6、任务设计中的问题 7、系统设计编码实现过程 8、中断服务程序的设计 page 山东科技大学 信息学院 91 2020/11/15 补充: 3 - 任务的划分方法 按系统设备构成进行任务的划分

58、任何嵌入式系统硬件都是由 “ CPU + 外设 ” 构成的。 外设在 CPU的控制下协调工作, CPU通过运行 程序 实 现对外设的控制,这些 程序 就是裁减后的 RTOS和多 个 用户 Task 。 外设与 CPU的速度差是 “任务并发运行” 的前提和基 础,也是通常都能满足的实事。 外设分为 “主动性外设” 和 “被动性外设” ;主动 性外设通过中断的方式申请 CPU,被动性外设由其他 Task通过通信机制提出申请,激活该设备的 Task 。 page 山东科技大学 信息学院 92 2020/11/15 补充: 3 - 任务的划分方法 关键任务的划分 “关键性”功能(任务)是指在嵌入式系统

59、中不可遗 漏、及时响应的 Task。 关键 Task必须尽可能地与其他功能剥离,独立构成 Task,并赋以足够高的优先级,通过通信机制触发其 他 Task,完成系统的其它功能。 为进一步保证关键任务的实时性,可将关键 Task安排 为 ISR。可以在 ISR中完成关键功能,也可以在 ISR中仅 进行任务通信,触发与它相关 Task。 紧迫 TASK是指在嵌入式系统中需要及时响应的 Task。 page 山东科技大学 信息学院 93 2020/11/15 补充: 3 - 任务的划分方法 关于任务划分的几点建议: 关键性任务 的调度务必保证其 可靠性和实时性 。 紧迫性任务 尽量保证其 实时性 。

60、 触发条件相同的功能尽量安排在一个 Task中。 运行间隔周期相同的功能尽量安排在一个 Task中。 在进行系统任务规划时要充分考虑 外界事件的异步 性和突发性 。 page 山东科技大学 信息学院 94 2020/11/15 第 2章 补充 .目录 1、任务的特性 2、任务的划分目标 3、任务的划分方法 4、任务的可调度性分析 5、任务的执行分类和优先级安排 6、任务设计中的问题 7、系统设计编码实现过程 8、中断服务程序的设计 page 山东科技大学 信息学院 95 2020/11/15 补充: 4 - 任务的可调度性分析 任务规划 -主要完成了逻辑级的任 务划分,之后要进行 任务的可调度性分 析 - 定量的分析这些任务是否可以在 RTOS调度下正常运行。 page 山东科技大学 信息学院 96 2020/11/15 补充: 4 - 任务的可调度性分析 所有任务都是周期性的。 各个任务相互独立,功能间的逻辑关系通过 任务通信

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!