RTOS uCOS-II原理及应用.ppt

上传人:豆**** 文档编号:34126802 上传时间:2022-08-13 格式:PPT 页数:113 大小:2.10MB
返回 下载 相关 举报
RTOS uCOS-II原理及应用.ppt_第1页
第1页 / 共113页
RTOS uCOS-II原理及应用.ppt_第2页
第2页 / 共113页
点击查看更多>>
资源描述

《RTOS uCOS-II原理及应用.ppt》由会员分享,可在线阅读,更多相关《RTOS uCOS-II原理及应用.ppt(113页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、RTOS uCOS-II原理及应用page2022-8-13西安邮电学院西安邮电学院 计算机系计算机系2 2第2章 uC/OS-II中的任务page西安邮电学院西安邮电学院 计算机系计算机系3 32022-8-13第2章 目录n1、任务的基本概念n2、任务堆栈n3、任务控制块及任务控制块链表n4、任务就绪表及任务调度n5、任务的创建n6、任务的挂起和恢复n7、其他任务管理函数n8、uC/OS-II的初始化和任务的启动page西安邮电学院西安邮电学院 计算机系计算机系4 42022-8-13第2章 补充.目录n1、任务的特性n2、任务的划分目标n3、任务的划分方法n4、任务的可调度性分析n5、任

2、务的执行分类和优先级安排n6、任务设计中的问题n7、系统设计编码实现过程n8、中断服务程序的设计page西安邮电学院西安邮电学院 计算机系计算机系5 52022-8-13第2章 目录n1、任务的基本概念n2、任务堆栈n3、任务控制块及任务控制块链表n4、任务就绪表及任务调度n5、任务的创建n6、任务的挂起和恢复n7、其他任务管理函数n8、uC/OS-II的初始化和任务的启动page西安邮电学院西安邮电学院 计算机系计算机系6 62022-8-132.1 任务的基本概念任务的基本概念n复杂问题 “分而治之” 的问题解题思路。n针对目标系统拆分后的 “小且易” 的问题的具体处理方法编码和数据结构

3、- 任务。nuC/OS-II的两种任务:系统任务、用户任务。n任务的组成:n任务控制块 - uC/OS-II进行任务管理用的一个数据结构。n任务代码 - 描述任务算法的程序编码。n任务堆栈 - 任务的工作现场环境。page西安邮电学院西安邮电学院 计算机系计算机系7 72022-8-132.1 任务的基本概念任务的基本概念page西安邮电学院西安邮电学院 计算机系计算机系8 82022-8-132.1 任务的基本概念任务的基本概念 “宏观宏观” 上的多任务并发,实际上是上的多任务并发,实际上是用单用单 CPU 进行多任务处理,进行多任务处理,“微观微观” 任任何时刻,只能运行一个任务,存在何时

4、刻,只能运行一个任务,存在CPU资资源竞争源竞争 - 任务调度、任务现场。任务调度、任务现场。 各个任务在多任务系统中也随着环境条各个任务在多任务系统中也随着环境条件的情况而具有不同的状态。件的情况而具有不同的状态。 任务状态划分也是多任务操作系统的管任务状态划分也是多任务操作系统的管理手段。理手段。n 任务的任务的 5 种状态:种状态:nSleep - 仅有编码未激活。nReady - 已激活并“万事俱备,只欠调度”nRunning - 正占用 CPU 运行自己。nWait - 等待某事件发生。nISR_Sta - Running状态的任务被中断后进入的状态。page西安邮电学院西安邮电学院

5、 计算机系计算机系9 92022-8-13任务的状态及其转换正在运行的任务,需要等待一段时间或需要等待一个事件发生再运行时,该任务就会把CPU的使用权让给别的任务而使任务进入等待状态。 任务在没有被配备任务控制块或被剥夺了任务控制块时的状态叫做任务的睡眠状态 系统为任务配备了任务控制块且在任务就绪表中进行了就绪登记,这时任务的状态叫做就绪状态。 处于就绪状态的任务如果经调度器判断获得了CPU的使用权,则任务就进入运行状态 一个正在运行的任务一旦响应中断申请就会中止运行而去执行中断服务程序,这时任务的状态叫做中断服务状态 page西安邮电学院西安邮电学院 计算机系计算机系10102022-8-1

6、3n 用户任务代码的一般结构void MyTask(void *pdata) / 任务的初始化任务的初始化 for ( ; ; )/超循环构成任务体超循环构成任务体 可被中断的用户代码片断;可被中断的用户代码片断; OS_ENTER_CRITICAL(); /进入临界区(关中断)进入临界区(关中断) 不可被中断的用户代码片断;不可被中断的用户代码片断; OS_EXIT_CRITICAL(); /退出临界区(开中断)退出临界区(开中断) 可被中断的用户代码片断;可被中断的用户代码片断; page西安邮电学院西安邮电学院 计算机系计算机系11112022-8-13n 用户应用程序的一般结构n“用户

7、任务用户任务” 代码形式上很像代码形式上很像 C函数,但他不是函数,但他不是函数!函数!n“任务任务” 不能被主函数不能被主函数 main( ) 或其他函数调用,或其他函数调用,只能被主函数或已激活任务只能被主函数或已激活任务创建创建。n任务的运行由操作系统调度管理。任务的运行由操作系统调度管理。void MyTask1(void *pdata) void MyTask2(void *pdata) void main( ) OSInit( ); OSTaskCreate( MyTask1, ); OSTaskCreate( MyTask2, ); OSStart( ); page西安邮电学院西

8、安邮电学院 计算机系计算机系12122022-8-132.1 任务的基本概念任务的基本概念n在此我们学习了uC/OS-II 的 3 个系统函数和 2个宏。nOSInit( ) - 初始化初始化 uC/OS-II 环境。环境。nOSTaskCreate( ) - 创建任务系统函数。创建任务系统函数。nOSStart( ) - 启动启动 uC/OS-II 任务调度器。任务调度器。nOS_ENTER_CRITICAL( ) - 进入临界区进入临界区 (宏)(宏)nOS_EXIT_CRITICAL( ) - 退出临界区退出临界区 (宏)(宏)nOSInit( ) 函数原型:函数原型: void OSI

9、nit( void )nOSStar( ) 函数原型:函数原型: void OSStart( void )nOSTaskCreate( ) 函数原型:函数原型: INT8U OSTaskCreate( void (*task)(void *pd) , /指向任务的指针指向任务的指针 void *pdata , /传递给任务的参数传递给任务的参数 OS_STK *ptos , /任务堆栈栈顶的指针任务堆栈栈顶的指针 INT8U prio /任务的优先级别任务的优先级别 )page西安邮电学院西安邮电学院 计算机系计算机系13132022-8-13OSTaskCreate( ) 函数使用举例:定义

10、任务定义任务 task_Avoid task_A(void* pdata) ; /任务初始化部分 while (1) ; /任务功能代码 在系统在系统 “创建创建” 任务任务 task_Avoid main(void) OSInit(); /系统初始化部分 OSTaskCreate( task_A, void * 0, &MystackTop, 8 ); OSStart();page西安邮电学院西安邮电学院 计算机系计算机系14142022-8-132.1 任务的基本概念任务的基本概念n系统任务n空闲任务(空闲任务(OSTaskIdel( ))n统计任务(统计任务(OSTaskStat( ))

11、原型:原型:void OSTaskIdel(void* pdata)原型:原型:void OSTaskStat(void* pdata)n 空闲任务(空闲任务(OSTaskIdel( ))使用说明:)使用说明: 1、uC/OS-II规定用户程序中必须使用规定用户程序中必须使用OSTaskIdel。 2、该任务不能用软件删除。、该任务不能用软件删除。 3、该任务是、该任务是uC/OS-II初始化时自动创建,其任务优先初始化时自动创建,其任务优先级固定为最低级,用户也可修改该任务的业务。级固定为最低级,用户也可修改该任务的业务。 4、目的、目的 - 使使 CPU 在没有用户任务可执行时也有事可在没

12、有用户任务可执行时也有事可做。做。n 统计任务(统计任务(OSTaskStat( ))使用说明:)使用说明: 1、功能完成用户任务、功能完成用户任务 CPU 使用率的统计,结果以百分使用率的统计,结果以百分比的形式存放在变量比的形式存放在变量 OSCPUsage 中。中。 2、该任务用户可选择使用。、该任务用户可选择使用。OS_CFG.H文件中的常数文件中的常数OS_TASK_STAT_EN 设置为设置为 1,使能该函数。,使能该函数。 3、用户在、用户在OS_CFG.H中使能该任务后,系统自动创建中使能该任务后,系统自动创建该任务,但在用户使用统计数据前必须调用系统该任务,但在用户使用统计数

13、据前必须调用系统函数函数 OSStatInit() 先进行初始化。先进行初始化。 4、该任务固定拥有次末任务优先级。、该任务固定拥有次末任务优先级。page西安邮电学院西安邮电学院 计算机系计算机系15152022-8-132.1 任务的基本概念任务的基本概念n任务的优先权和优先级别任务的优先权和优先级别nuC/OS-II 的每个任务都必须有唯一的优先级。nuC/OS-II 最多可以管理64个优先级别分配给64个任务。nuC/OS-II 中用一个8b的整型数来表示优先级别,数字越小,优先级越高,prio = 0 的任务优先级最高。nuC/OS-II 中使用任务的优先级(prio)作为任务句柄。

14、n用户通过修改 OS_CFG.H 中的宏定义常数 OS_LOWEST_PRIO 的值,约定本用户系统的最大优先级数。page西安邮电学院西安邮电学院 计算机系计算机系16162022-8-13第2章 目录n1、任务的基本概念n2、任务堆栈n3、任务控制块及任务控制块链表n4、任务就绪表及任务调度n5、任务的创建n6、任务的挂起和恢复n7、其他任务管理函数n8、uC/OS-II的初始化和任务的启动page西安邮电学院西安邮电学院 计算机系计算机系17172022-8-132.2 任务堆栈任务堆栈n堆栈堆栈 - LIFO访问原则组织的连续存储器。访问原则组织的连续存储器。n任务堆栈在任务堆栈在 u

15、C/OS-II 中的应用:中的应用:n任务堆栈是任务的三大组成部分之一。任务堆栈是任务的三大组成部分之一。n保存保存 CPU 寄存器现场(寄存器现场(R0R12、LR、SPSR 等)。等)。n本本 Task 的私有数据。的私有数据。page西安邮电学院西安邮电学院 计算机系计算机系18182022-8-132.2 任务堆栈任务堆栈n任务堆栈的创建任务堆栈的创建- 在创建任务的同时,任务堆栈即被创建。在创建任务的同时,任务堆栈即被创建。举例举例:#define MyTaskStkSize 64OS_STK MyTaskStk MyTaskStkSize /在在 OS_CPU.H中定义中定义 OS

16、_STK / typedef INT32U OS_STKINT8U OSTaskCreate( void (*task) (void *pd), /指向任务的指针指向任务的指针 void * pdata, /传递给任务的参数传递给任务的参数 MyTaskStk MyTaskStkSize 1 /任务堆栈任务堆栈栈顶栈顶的指针的指针 INT8U prio /任务的优先级别任务的优先级别 )page西安邮电学院西安邮电学院 计算机系计算机系19192022-8-132.2 任务堆栈任务堆栈n任务堆栈的使用注意事项任务堆栈的使用注意事项 _ 存在两种堆栈形式存在两种堆栈形式n递增堆栈递增堆栈 - 进

17、栈操作进栈操作向大地址方向发展。向大地址方向发展。n递减堆栈递减堆栈 - 进栈操作进栈操作向小地址方向发展。向小地址方向发展。OSTaskCreate( &MyTaskStkStkSize - 1, )OSTaskCreate( &MyTaskStk 0 , )备注:利用条件编译技术和备注:利用条件编译技术和 OS_CPU.H 中的宏定义常数中的宏定义常数OS_STK_GROWTH 编写易移植用户系统;编写易移植用户系统;“1” - 递减堆栈递减堆栈 for ARM CPU。page西安邮电学院西安邮电学院 计算机系计算机系20202022-8-13第2章 目录n1、任务的基本概念n2、任务堆

18、栈n3、任务控制块及任务控制块链表n4、任务就绪表及任务调度n5、任务的创建n6、任务的挂起和恢复n7、其他任务管理函数n8、uC/OS-II的初始化和任务的启动page西安邮电学院西安邮电学院 计算机系计算机系21212022-8-132.3 任务控制块及任务控制块链表任务控制块及任务控制块链表n任务控制块(任务控制块(TCB)- 任务在系统中的身份证nTCB - uC/OS-II 中用于记录任务信息(任务堆栈指针、中用于记录任务信息(任务堆栈指针、任务当前状态、任务优先级别等)的数据结构。任务当前状态、任务优先级别等)的数据结构。nuC/OS-II 将系统中的所有将系统中的所有 TCB 构

19、成两个链表构成两个链表(OSTCBList、OSTCBFreeList)进行任务管理。)进行任务管理。u空任务控制块链表空任务控制块链表 - 未被分配的未被分配的 TCB 链链 OSTCBFreeList。u任务控制块链表任务控制块链表 - 已分配的已分配的 TCB 链链 OSTCBList。page西安邮电学院西安邮电学院 计算机系计算机系22222022-8-132.3 任务控制块及任务控制块链表任务控制块及任务控制块链表n任务控制块(任务控制块(TCB)的结构)的结构任务控制块结构的主要成员任务控制块结构的主要成员typedef struct os_tcb struct os_tcb *

20、OSTCBNext; /指向下一个指向下一个TCB的指针的指针 struct os_tcb *OSTCBPrev; /指向前一个指向前一个TCB的指针的指针 OS_STK *OSTCBStkPtr; /指向任务堆栈栈顶的指针指向任务堆栈栈顶的指针 INT16U OSTCBDly; /任务等待时间任务等待时间 INT8U OSTCBStat; /任务的当前状态标志任务的当前状态标志 INT8U OSTCBPrio; /任务的优先级别任务的优先级别 OS_TCB;page西安邮电学院西安邮电学院 计算机系计算机系23232022-8-132.3 任务控制块及任务控制块链表任务控制块及任务控制块链表

21、n任务控制块链表任务控制块链表n空任务控制块链表(空任务控制块链表(OSTCBFreeList)n任务控制块链表任务控制块链表 (OSTCBList)- uC/OS-II 用两个链表来管理用两个链表来管理 TCBpage西安邮电学院西安邮电学院 计算机系计算机系24242022-8-132.3 任务控制块及任务控制块链表任务控制块及任务控制块链表n任务控制块链表任务控制块链表 空任务块链表是在空任务块链表是在 uC/OS-II 初始化(初始化(OSInit())时系)时系统自建的,用户可依据目标系统的实际需求,设定其链表统自建的,用户可依据目标系统的实际需求,设定其链表长度。长度。nOS_CF

22、G.H 文件中的宏常数文件中的宏常数 OS_MAX_TASKS - 用于用于定义最大用户任务数。定义最大用户任务数。nUCOS_II.H 文件中的宏常数文件中的宏常数 OS_N_SYS_TASKS - 用用于约定系统任务数,其值固定为于约定系统任务数,其值固定为 2 。当应用程序调用函数OSTaskCreate( )创建一个任务时,这个函数会调用系统函数OSTCBInit( )来为任务控制块进行初始化。这个函数首先为被创建任务从空任务控制块链表获取一个任务控制块,然后用任务的属性对任务控制块各个成员进行赋值,最后再把这个任务控制块链入到任务控制块链表的头部。 当进行系统初始化时,初始化函数会按

23、用户提供的任务数为系统创建具有相应数量的任务控制块并把它们链接为一个链表。 由于这些任务控制块还没有对应的任务,故这个链表叫做空任务块链表。即相当于是一些空白的身份证。page西安邮电学院西安邮电学院 计算机系计算机系25252022-8-13任务控制块链表空任务控制块链表page西安邮电学院西安邮电学院 计算机系计算机系26262022-8-13uC/OS-II 中提供了系统函数 OSTaskDel( ),用于删除一个任务 - 实质就是将该任务的TCB从“任务控制块列表” 移到了“空任务控制块列表” 。 2.3 任务控制块及任务控制块链表任务控制块及任务控制块链表任务控制块就相当于是一个任务

24、的身份证,没有任务控制块的任务是不能被系统承认和管理。 n任务控制块链表任务控制块链表page西安邮电学院西安邮电学院 计算机系计算机系27272022-8-132.3 任务控制块及任务控制块链表任务控制块及任务控制块链表n任务控制块链表其他相关系统管理变量任务控制块链表其他相关系统管理变量nOSTCBPrioTbl :OS_TCB* 数据类型的数组,数据类型的数组,以以 Prio 为下标存放已使能的为下标存放已使能的 TCB 指针。用指针。用于加速于加速 TCB 的访问。的访问。nOSTCBCur:全局系统变量,指向当前正在:全局系统变量,指向当前正在运行的任务的运行的任务的 TCB 。OS

25、TCBFreeList、OSTCBListOSTCBTbl - OSInit()建立的任务控制块数组建立的任务控制块数组OSTCBPrioTbl - 任务控制块优先级数组任务控制块优先级数组OSTCBCurpage西安邮电学院西安邮电学院 计算机系计算机系28282022-8-13第2章 目录n1、任务的基本概念n2、任务堆栈n3、任务控制块及任务控制块链表n4、任务就绪表及任务调度n5、任务的创建n6、任务的挂起和恢复n7、其他任务管理函数n8、uC/OS-II的初始化和任务的启动page西安邮电学院西安邮电学院 计算机系计算机系29292022-8-13补充:多任务补充:多任务 OS -

26、的基本工作方式的基本工作方式page西安邮电学院西安邮电学院 计算机系计算机系30302022-8-13什么是多任务系统简单地说,就是能用一个处理器并发(注意,不是同时! )地运行多个程序的计算机管理系统。并发:由同一个处理器轮换地运行多个程序。或者说是由多个程序轮班地占用处理器这个资源。且在占用这个资源期间,并不一定能够把程序运行完毕。并发过程示意图处理器如何进行程序的切换?page西安邮电学院西安邮电学院 计算机系计算机系31312022-8-13程序的切换(两句话)处理器是个傻瓜,PC让它干啥,它就干啥。PC是个指路器,它指向哪儿,处理器就去哪儿。从此可以知道,哪个程序占有了PC,哪个程

27、序就占有了处理器。哪个人占有了一个姑娘的芳心,哪个人就 = PC深刻地理解深刻地理解PC是理解系统进行程序切换动作的关键。page西安邮电学院西安邮电学院 计算机系计算机系32322022-8-13所谓切换就是:PC 目标地址如何操作PC指令:不同的计算机类型的指令是不同的。数据传送指令数据传送指令子程序返回指令(子程序返回指令(由堆由堆栈弹出栈弹出)中断、中断返回指令中断、中断返回指令(由堆栈弹出由堆栈弹出)page西安邮电学院西安邮电学院 计算机系计算机系33332022-8-13小结小结系统是通过把待运行程系统是通过把待运行程序的地址赋予程序计数序的地址赋予程序计数器器PC来实现程序的切

28、换来实现程序的切换的。的。page西安邮电学院西安邮电学院 计算机系计算机系34342022-8-13任务代码任务堆栈处理器PCSP任务运行时与 处理器之间的关系处理器通过两个指针寄存器(PC和SP)来与任务代码和任务堆栈建立联系并运行它寄存器组程序运行环境运行环境包括了两部分:处理器中的运行环境和内存中的运行环境page西安邮电学院西安邮电学院 计算机系计算机系35352022-8-13任务代码任务堆栈内存处理器PCSP多任务时的问题任务代码任务堆栈内存任务代码任务堆栈内存?当有多个任务时,处理器中的运行环境应该怎么办?寄存器组程序运行环境page西安邮电学院西安邮电学院 计算机系计算机系3

29、6362022-8-13程序 虚拟处理器PCSP 虚拟处理器PCSP 虚拟处理器PCSP 虚拟处理器PCSP调度器多任务时任务与处理器之间关系的处理程序处理器PCSP在内存中为每个任务创建一个虚拟的处理器(处理器部分的运行环境由操作系统的调度器按某种规则来进行这两个复制工作复制当需要运行某个任务时就把该任务的虚拟处理器复制到实际处理器中复制当需要中止当前任务时,则把任务对应的虚拟处理器复制到内存复制再把另一个需要运行的任务的虚拟处理器复制到实际处理器中寄存器组寄存器组也就是说,任务的切换是任务运行环境的切换page西安邮电学院西安邮电学院 计算机系计算机系37372022-8-13虚拟处理器虚

30、拟处理器应该存储的主要信息:1。程序的断点地址(PC)2。任务堆栈指针(SP)3。程序状态字寄存器(PSW)4。通用寄存器内容5。函数调用信息(已存在于堆栈)这些内容通常保存在任务堆栈中,这些内容也常叫做任务的上下文。其实,程序切换的关键是把程序的私有堆栈指针赋予处理器的堆栈指针SPSP实质上系统是通过SP的切换来实现程序的切换的。要建立一个概念:u具有控制块的程序才是一个可以被系统所运行的任务。u程序代码、私有堆栈、任务控制块 是任务的三要件。u任务控制块提供了运行环境的存储位置。page西安邮电学院西安邮电学院 计算机系计算机系38382022-8-132.4 任务就绪表及任务调度任务就绪

31、表及任务调度 多任务操作系统的核心工作就是任务调度。 所谓调度,就是通过一个算法在多个任务中确定该运行的任务,做这项工作的函数就叫做调度器。 C/OS_II进行任务调度的思想是 “近似地每时每刻总是让优先级最高的就绪任务处于运行状态” 。为了保证这一点,它在系统或用户任务调用系统函数及执行中断服务程序结束时总是调用调度器,来确定应该运行的任务并运行它 。C/OS_II进行任务调度的依据就是任务就绪表 page西安邮电学院西安邮电学院 计算机系计算机系39392022-8-132.4 任务就绪表及任务调度任务就绪表及任务调度n任务就绪表的结构任务就绪表的结构为了能够使系统清楚地知道,系统中哪些任

32、务已为了能够使系统清楚地知道,系统中哪些任务已经就绪,哪些还没有就绪,经就绪,哪些还没有就绪,C/OS_II 在在 RAM中设立中设立了一个记录表,了一个记录表,系统中的每个任务都在这个表中系统中的每个任务都在这个表中占据一占据一 Bit 的位置,并用这个位置的状态(的位置,并用这个位置的状态(1或者或者0)来表示任务是否处于就绪状态来表示任务是否处于就绪状态,这个表就叫做任,这个表就叫做任务就绪状态表,简称叫务就绪状态表,简称叫任务就绪表任务就绪表 - 一个一个 INT8U 的数组的数组 OSRdyTbl 充当,最多充当,最多8个元素,可以标示个元素,可以标示64个任务。个任务。page西安

33、邮电学院西安邮电学院 计算机系计算机系40402022-8-13就是一个二维数组OSRdyTbl page西安邮电学院西安邮电学院 计算机系计算机系41412022-8-13为加快访问任务就绪表的速度,系统定义了一个变量OSRdyGrp来表明就绪表每行中是否存在就绪任务。OSRdyTbl 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/01/0 1/0 1/0 1/0 1/0 1/0 1/0 1/01/0 1/0 1/0 1/0 1/0 1/0 1/0 1/01/0 1/0 1/0 1/0 1/0 1/0 1/0 1/01/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0

34、1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/01/0 1/0 1/0 1/0 1/0 1/0 1/0 1/01/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0OSRdyGrp D7 D6 D5 D4 D3 D2 D1 D0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0任务就绪表的示意图01234567xy01234567page西安邮电学院西安邮电学院 计算机系计算机系43432022-8-132.4 任务就绪表及任务调度任务就绪表及任务调度n任务优先级数据结构分析任务优先级数据结构分析nuC/OS-II 最多管理最多管理64个任务,个任务,Pri

35、o值域:值域:0 63,对应,对应的二进制数的二进制数 000,000 111,111(6bit),), OSRdyGrp(任务组就绪变量)(任务组就绪变量)8 bit,任务就续数组元素,任务就续数组元素 OSRdyTbl 也是也是8bit。nprio.D5:3 - 对应对应 OSRdyTbl 的的下标(任务组号下标(任务组号 x ),), 也对应也对应 OSRdyGrp 的位号。的位号。nprio.D2:0 -对应对应 OSRdyTbl 元素的位号(任务组号元素的位号(任务组号 y )备注:这就是备注:这就是 prio 的值和任务就绪表的映射关系。的值和任务就绪表的映射关系。page西安邮电

36、学院西安邮电学院 计算机系计算机系44442022-8-13举例:举例:prio = 29 的任务在任务就续表中的表示。的任务在任务就续表中的表示。prio = 29 , 其其 8 进制表示为:进制表示为:35 OOSRdyGrp D7 D6 D5 D4 D3 D2 D1 D0 11110000prio=29D7 D6 D5 D4 D3 D2 D1 D0 1D7 D6 D5 D4 D3 D2 D1 D0 1OSRdyTbl3prio 为29的任务就绪状态在任务就绪表中的表示YXpage西安邮电学院西安邮电学院 计算机系计算机系45452022-8-132.4 任务就绪表及任务调度任务就绪表及任

37、务调度n 依照依照 prio “置置/清清” 任务就绪表的操作任务就绪表的操作OSMapTbl0 = 0000,0001BOSMapTbl1 = 0000,0010BOSMapTbl2 = 0000,0100BOSMapTbl3 = 0000,1000BOSMapTbl4 = 0001,0000BOSMapTbl5 = 0010,0000BOSMapTbl6 = 0100,0000BOSMapTbl7 = 1000,0000B在在 uC/OS-II 中预定义了一个中预定义了一个 OSMapTbl 数组:数组:page西安邮电学院西安邮电学院 计算机系计算机系46462022-8-13OSRdy

38、Grp D7 D6 D5 D4 D3 D2 D1 D0 11110000prio=29D7 D6 D5 D4 D3 D2 D1 D0 1D7 D6 D5 D4 D3 D2 D1 D0 1OSRdyTbl3 操作:把prio为29的任务置为就绪状态YX | = OSMapTbl prio3 ; prio3 | = OSMapTbl prio&0 x07 ; OSMapTbl0 = 0000,0001BOSMapTbl1 = 0000,0010BOSMapTbl2 = 0000,0100BOSMapTbl3 = 0000,1000BOSMapTbl4 = 0001,0000BOSMapTbl5 =

39、 0010,0000BOSMapTbl6 = 0100,0000BOSMapTbl7 = 1000,0000Bn在程序中,可以用下面的代码把优先级别为 prio 的任务置为就绪状态: OSRdyGrp | = OSMapTblprio3;OSRdyTblprio3 | = OSMapTblprio&0 x07;n使用如下代码可使一个优先级别为prio的任务脱离就绪状态:if(OSRdyTblprio3 &= OSMapTblprio&0 x07)=0)OSRdyGrp &= OSMapTblprio3; page西安邮电学院西安邮电学院 计算机系计算机系47472022-8-132.4 任务就

40、绪表及任务调度任务就绪表及任务调度n任务就绪表的操作任务就绪表的操作n从从 prio 到就绪表到就绪表( OSRdyGrp、OSRdyTbl )的操作(进入的操作(进入/脱离脱离 - 就绪状态)。就绪状态)。n从就绪表从就绪表( OSRdyGrp、OSRdyTbl )的当前的当前状态(位图)到最高优先级别状态(位图)到最高优先级别 prio 的(任务)的(任务)映射操作。映射操作。page西安邮电学院西安邮电学院 计算机系计算机系48482022-8-132.4 任务就绪表及任务调度任务就绪表及任务调度n 依照任务就绪表的状态计算依照任务就绪表的状态计算 prio 的操作的操作INT8U co

41、nst 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西安邮电学院西安邮电学院 计算机系计算机系49492022-8-13OSRdyGrp D7 D6 D5 D4 D3 D2 D1 D0 11110

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

43、第的第 y 元素为下标,查元素为下标,查 OSUnMapTbl 表,可得表,可得 x 。page西安邮电学院西安邮电学院 计算机系计算机系50502022-8-13用下代码可从任务就绪表中获取优先级别最高的就绪任务(prio): y = OSUnMapTalOSRdyGrp; / D5、D4、D3位x = OSUnMapTalOSRdyTbly; / D2、D1、D0位prio = (y3)+x; / 优先级别 或 y = OSUnMapTblOSRdyGrp;prio = (INT8U)(y OSTCBStkPtr获得待运行任务获得待运行任务TCB获得待运行任务获得待运行任务 TCB-OST

44、CBStkPtr恢复待运行任务恢复待运行任务CPU现场(不包含现场(不包含PC)切换切换CPU.PC ,使,使CPU接续运行待运行接续运行待运行Task断点。断点。备注:备注:Step1 - 中断方式保护;中断方式保护;Step7 - IRET指令恢复指令恢复PC;汇编;汇编语言编程语言编程OS_TASK_SW( ) - 直接操作寄存器直接操作寄存器page西安邮电学院西安邮电学院 计算机系计算机系60602022-8-13第2章 目录n1、任务的基本概念n2、任务堆栈n3、任务控制块及任务控制块链表n4、任务就绪表及任务调度n5、任务的创建n6、任务的挂起和恢复n7、其他任务管理函数n8、u

45、C/OS-II的初始化和任务的启动page西安邮电学院西安邮电学院 计算机系计算机系61612022-8-132.5 任务的创建任务的创建任务的创建任务的创建 - 创建该任务的创建该任务的TCB;在;在TCB中将该中将该任务的任务的Code、Stack关联起来和关联起来和TCB共同构成共同构成Task。uC/OS-II提供两个系统函数创建提供两个系统函数创建Task :nOSTaskCreate( )nOSTaskCreateExt( )备注:关于这两个函数的使用很简单,不再重复。备注:关于这两个函数的使用很简单,不再重复。 创建创建Task时,要求注意核算时,要求注意核算Task.Stack

46、的大小的大小和核定和核定Task.Prio必须保证不重复。必须保证不重复。page西安邮电学院西安邮电学院 计算机系计算机系62622022-8-132.5 任务的创建任务的创建n创建任务的一般方法创建任务的一般方法Task 可在主函数可在主函数 main( ) 中操作系统调度启动中操作系统调度启动(OSStart( ))前创建。)前创建。也可在也可在Task中创建其他的中创建其他的Task,应用中习惯使,应用中习惯使用此结构。用此结构。uC/OS-II要求:在要求:在OSStart( )前,必须至少创建前,必须至少创建一个用户一个用户Task。page西安邮电学院西安邮电学院 计算机系计算机

47、系63632022-8-132.5 任务的创建任务的创建n创建任务的示意代码创建任务的示意代码void main( ) /主要是系统硬件初始化主要是系统硬件初始化OSInit( );/ uC/OS-II 初始化初始化 /创建消息机制创建消息机制OSTaskCreate(Task_A,); / 创建任务创建任务AOSStart( );/ 启动多任务调动启动多任务调动void Task_A(void * pdata) /任务任务A/ 安装并启动安装并启动 uC/OS-II 系统时钟系统时钟OSStatInit( );/ 初始化统计任务(如果需要的话)初始化统计任务(如果需要的话)/ 在此处可以创建

48、其他任务在此处可以创建其他任务For ( ; ; )/ Task_A 任务体任务体page西安邮电学院西安邮电学院 计算机系计算机系64642022-8-13两个延时函数的原型:两个延时函数的原型:void OSTimeDly( INT16U ticks ) /* ticks 是节拍数是节拍数 */INT8U OSTimeDlyHMSM (INT8U hours, INT8U minutes, INT8U seconds, INT16U milli) /* 绝对时间延时,位于绝对时间延时,位于OS_TIME.C */备注:备注: 1、参数值域、参数值域 hours255, minutes59,

49、 seconds59, milli9992、这两个系统函数定义在、这两个系统函数定义在OS_TIME.C文件中。文件中。3、关于节拍周期定义在、关于节拍周期定义在OS_CFG.H文件中。文件中。补充:任务延时系统函数。补充:任务延时系统函数。page西安邮电学院西安邮电学院 计算机系计算机系65652022-8-13实验1:创建两个任务; Task_A - 控制一位LED秒闪。 Task_B - 控制蜂鸣器每3S鸣1.5S。1、学习创建任务操作编程;2、体验延时函数的使用;3、体验多任务系统设计基本方式;实验目的:page西安邮电学院西安邮电学院 计算机系计算机系66662022-8-13第2

50、章 目录n1、任务的基本概念n2、任务堆栈n3、任务控制块及任务控制块链表n4、任务就绪表及任务调度n5、任务的创建n6、任务的挂起和恢复n7、其他任务管理函数n8、uC/OS-II的初始化和任务的启动page西安邮电学院西安邮电学院 计算机系计算机系67672022-8-132.6 任务的挂起和恢复任务的挂起和恢复n所谓的挂起一个任务,就是暂停这个任务的调度。所谓的挂起一个任务,就是暂停这个任务的调度。n挂起任务的挂起任务的 TCB 还存在系统中,只是该任务的状态还存在系统中,只是该任务的状态是是 “挂起挂起” ,对挂起态的任务,对挂起态的任务uC/OS-II不再调度运行。不再调度运行。n挂

展开阅读全文
相关资源
相关搜索

当前位置:首页 > pptx模板 > 企业培训

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

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com