第三章11进程描述和状态控制课件.ppt

上传人:小飞机 文档编号:4093709 上传时间:2023-04-03 格式:PPT 页数:34 大小:470.50KB
返回 下载 相关 举报
第三章11进程描述和状态控制课件.ppt_第1页
第1页 / 共34页
第三章11进程描述和状态控制课件.ppt_第2页
第2页 / 共34页
第三章11进程描述和状态控制课件.ppt_第3页
第3页 / 共34页
第三章11进程描述和状态控制课件.ppt_第4页
第4页 / 共34页
第三章11进程描述和状态控制课件.ppt_第5页
第5页 / 共34页
点击查看更多>>
资源描述

《第三章11进程描述和状态控制课件.ppt》由会员分享,可在线阅读,更多相关《第三章11进程描述和状态控制课件.ppt(34页珍藏版)》请在三一办公上搜索。

1、2023/4/3,1,第三章 任务管理,3.3 任务同步,3.2 多任务,3.1 任务描述和状态,控制,2023/4/3,2,3.1.1 任务基本概念,从代码上看,uC/OS-II任务就是一个函数uC/OS-II任务有两种:用户任务和系统任务从任务的存储结构上看,uC/OS-II由三部分组成:任务程序代码(函数):任务的执行部分任务堆栈:用来保存任务的工作环境任务控制块:记录任务的各个属性,2023/4/3,3,3.1.2 任务的状态,uC/OS-II中任务有5中状态睡眠状态:任务只是以代码的形式驻留在程序空间(ROM或RAM),还没有交给操作系统管理时的情况叫做睡眠状态。即任务在没有被分配任

2、务控制块或者被剥夺了任务控制块时的状态叫做睡眠状态。就绪状态:如果系统为任务配备了任务控制块且在任务就绪表中进行了就绪登记,则任务就具备了运行的充分条件这时任务的状态叫做就绪状态,2023/4/3,4,运行状态:处于就绪态的任务如果经调度器判断获得了CPU的使用权,进入运行状态。等待状态:正在运行的任务需要等待一段时间或需要等待一个事件发生在运行时,该任务就把CPU的使用权让给其他任务,进入等待状态,2023/4/3,5,中断服务状态:一个正在运行的任务一旦响应中断请求就会中止运行而去执行中断服务程序,这时任务的状态叫做中断服务状态。,2023/4/3,6,状态间的切换,2023/4/3,7,

3、2023/4/3,8,3.1.3 用户任务代码一般结构,无限循环结构void mytask(void*pdata)for(;)可以被中断的用户代码;OS_ENTER_CRITICAL();/进入临界段(关中断)不可以被中断的用户代码;OS_EXIT_CRITICAL();/退出临界段(开中断)可以被中断的用户代码;,2023/4/3,9,OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()是uC/OS-II定义的两个宏。分别封装了关中断代码和开中断代码,2023/4/3,10,用户应用程序一般结构,void Mytask1(void*pdata)/定义用户任务1for(

4、;).void Mytask2(void*pdata)/定义用户任务2for(;).void main().OSInit();/初始化uc/os.OSTaskCreate(Mytask1,.);/创建用户任务1OSTaskCreate(Mytask2,.);/创建用户任务2.OSStart();/启动uc/os,2023/4/3,11,3.1.4 系统任务,uC/OS-II预定义了两个系统任务:空闲任务和统计任务空闲任务是每个应用程序必须使用的统计任务是应用程序可以根据实际需求来选择使用的,2023/4/3,12,1.空闲任务,任务在系统中可以有5种状态,即系统极有可能会在某个时间内无用户任务

5、可运行而处于所谓空闲状态。为了使CPU在没有用户任务可执行时有事可做,uC/OS-II提供了一个叫做空闲任务OSTaskIdle()的系统任务。代码如下:,2023/4/3,13,void OSTask(void*pdata)#if OS_CRITICAL_METHOD=3OS_CPU_SR cpu_sr;#endifpdata=pdata;/防止某些编译器报错for(;)OS_ENTER_CRITICAL();/关闭中断 OSdleCtr+;/计数OS_EXIT_CRITICAL();/开中断,2023/4/3,14,2.统计任务,该任务每秒计算一次CPU在单位时间内被使用的时间,并把计算结

6、果以百分比的形式存放在变量OSCPUsage中,以便其他应用程序了解CPU的利用率。是否使用统计任务,用户可以根据应用程序的实际需求来进行选择。,2023/4/3,15,3.1.4 任务堆栈,为了满足任务切换和响应中断时保存CPU寄存器中的内容及任务调用其他函数时的需要,每个任务都有自己的堆栈所有uC/OS-II任务的控制块中都含有一个指向该任务堆栈的指针,2023/4/3,16,任务堆栈的创建,为了定义任务堆栈的方便,在文件OS_CPU.H中专门定义了一个数据类型OS_STK:typedef unsigned int OS_STK;/该类型长度为16位在定义任务堆栈的栈区时,只要定义一个OS

7、_STK类型的数组即可。如:#define TASK_STK_SIZE 512/定义堆栈长度(1024)OS_STK TaskStkTASK_STK_SIZE/定义数组作为任务堆栈,2023/4/3,17,当调用OSTaskCreate()来创建一个任务时,把数组的指针传递给函数OSTaskCreate()中的堆栈栈顶参数,就可以把数组与任务关联起来而成为该任务的任务堆栈,2023/4/3,18,INT8UOSTaskCreate(void(*task)(void*pd),/指向任务的指针void*pdata,/传递给任务的参数OS_STK*ptos,/任务堆栈栈顶指针INT8U prio/任

8、务优先级别);,2023/4/3,19,需要注意的是:堆栈的增长方向是随系统所使用的处理器不同而不同的。有的处理器要求堆栈的增长方向是向上的,而另一些处理器要求堆栈的增长方向是向下的使用函数OSTaskCreate()创建任务时,要注意所使用的处理器所支持的堆栈增长方向,2023/4/3,20,任务堆栈的初始化,应用程序在创建一个新任务时,必须把系统启动这个任务时所需要的CPU各寄存器初始数据(任务指针,任务堆栈指针,程序状态字等)存放在任务堆栈把任务初始数据存放到任务堆栈的工作就叫做任务堆栈的初始化系统提供OSTaskStkInit(),2023/4/3,21,OS_STK*OSTaskSt

9、kInit(void(*task)(void*pd),void*pdato,OS_STK*ptos,INT16U opt);通常用户不会直接接触到这个函数,改函数有任务创建函数OSTaskCreate()调用,2023/4/3,22,3.1.5 任务控制块,uC/OS-II用来记录任务的堆栈指针,任务的当前状态,任务的优先级等一些任务管理有关的属性的表就叫做任务控制块任务控制块相当于一个任务的身份证,系统通过任务控制块感知和管理任务uC/OS-II把系统所有任务的控制块链接为两条链表,并通过它们管理各个任务,2023/4/3,23,任务控制块是一个结构体数据结构,用于记录各个任务的信息。当任务

10、的CPU的使用权被剥夺时,uCOS-II用它来保存任务的当前状态。当任务重新获得CPU的使用权时,任务控制块能确保任务从当时被中断的那一点丝毫不差的继续执行。任务控制块全部存放在RAM中。,2023/4/3,24,typedef struct os_tcb OS_STK*OSTCBStkPtr;/*指向当前任务使用的堆栈的栈顶。uCOS-II允许每个任务堆栈的大小可以不同,这样用户可以根据实际需要定义任务堆栈的大小,可以节省RAM的空间。另外,由于OSTCBStkPtr是该结构体中的第一个变量,所以可以使用汇编语言方便的访问,因为其偏移量是0。当切换任务时,用户可以容易的知道就绪任务中优先级最

11、高任务的栈顶。*/#if OS_TASK_CREATE_EXT_EN 0u void*OSTCBExtPtr;/*指向用户定义的扩展任务控制块*/OS_STK*OSTCBStkBottom;/*指向任务堆栈的栈底。需要考虑一下你使用的MCU的栈指针是按照从高到低还是从低到高变化的。这个变量在测试任务需要的栈空间的时候需要使用。*/INT32U OSTCBStkSize;/*同样,该变量也是测试任务需要的栈空间需要。需要注意的是,该变量存储的是指针元的数目,而不是字节数目。*/INT16U OSTCBOpt;/*传给函数OSTaskCreateExt()的选择项。目前有OS_TASK_OPT_S

12、TK_CHK,OS_TASK_OPT_STK_CLR,OS_TASK_OPT_SAVE_EP*/INT16U OSTCBId;/*Task ID(0.65535),目前没有使用。*/#endif,2023/4/3,25,struct os_tcb*OSTCBNext;struct os_tcb*OSTCBPrev;/*指向TCB的双向链表的前后链接,在OSTimeTick()中使用,用来刷新各任务的任务延迟变量.OSTCBDly。*/#if(OS_EVENT_EN)|(OS_FLAG_EN 0u)OS_EVENT*OSTCBEventPtr;/*指向事件控制块的指针。*/#endif#if(O

13、S_EVENT_EN)/*指向传递给任务的消息的指针。*/#endif,2023/4/3,26,#if(OS_FLAG_EN 0u)/*计算优先级用*/#endif,2023/4/3,27,#if OS_TASK_DEL_EN 0u INT8U OSTCBDelReq;/*表示任务是否需要删除。*/#endif#if OS_TASK_PROFILE_EN 0u INT32U OSTCBCtxSwCtr;/*任务切换的次数。*/INT32U OSTCBCyclesTot;/*任务运行的时钟周期数。*/INT32U OSTCBCyclesStart;/*任务恢复开始的循环计数器。*/OS_STK*

14、OSTCBStkBase;/*指向任务栈开始的指针。*/INT32U OSTCBStkUsed;/*使用的栈的字节数*/#endif#if OS_TASK_NAME_EN 0u INT8U*OSTCBTaskName;#endif#if OS_TASK_REG_TBL_SIZE 0u INT32U OSTCBRegTblOS_TASK_REG_TBL_SIZE;#endif OS_TCB;,2023/4/3,28,任务控制块结构的主要成员,2023/4/3,29,任务控制块OS_TCB中几个成员的算法,2023/4/3,30,任务控制链表,uC/OS-II用两条链表管理任务控制块空任务块链表:

15、其中所有任务控制块还为分配给任务任务块链表:其中所有任务控制块已分配给任务,2023/4/3,31,为了加快对任务控制块的访问速度,uC/OS-II在uC/OS-II.H文件中还定义了一个数据类型为OS_TCB*的数组OSPrioTbl该数组以任务的优先级为顺序在各个元素里存放了指向各个任务控制块的指针删除一个任务,实质上就是把该任务的任务控制块从任务控制块链表中删除,并归还给空任务控制块链表,2023/4/3,32,任务控制块的初始化,当应用程序调用函数OSTaskCreate()创建一个任务时,这个函数会调用系统函数OSTCBInit()来为任务控制块进行初始化INT8U OSTCBInit(INT8U prio,/任务优先级别OS_STK*ptos,/任务堆栈栈顶指针OS_STK*pbos,/任务堆栈栈底指针INT16U stk_size,/任务的标识符void*pext,/任务堆栈的长度INT16U opt/任务控制块的选择项);,2023/4/3,33,该函数主要任务为被创建任务从空任务控制块链表获取一个任务控制块用任务的属性对任务控制块各个成员进行赋值把这个任务控制块链入到任务控制块链表,2023/4/3,34,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号