本文主要是介绍μC/OS-Ⅱ之任务控制块、任务就绪表,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
任务其实就是一个线程,或者更通俗点说就是一个函数和与之相关联的一些数据结构构成的一个实体,可执行程序单元。
任务的特性:
动态性:就绪态、运行态、等待态(挂起态、阻塞态)。一个任务的开始运行并不代表着一只占有CPU的使用权。
独立性:表现为逻辑上的“平等性”和信息传输的“异步性”。
并发性:“已经就绪的高优先级任务”可以剥夺另一个“正在运行的低优先级任务”的运行权而进入运行状态。从宏观上看,不同的任务可以并发运行,好像每个任务都有自己的CPU一样。
μC/OS-Ⅱ中任务包含三个部分:
1、任务控制块:保存了任务的属性;
2、任务堆栈:保存了任务的工作环境;
任务堆栈用于保存任务的私有数据,以及在任务切换和中断的时候保存断点数据(CPU的PC、PSW(程序状态字)、通用寄存器中的数据)。所以每个任务都需要一个任务堆栈。ucos-II中定义了一个无符号的16位的整形作为堆栈的基本单元。
即:typedef unsigned int OS_STK; //为16位长
示例:OS_STK MyTask[512]; //定义堆栈的长为1024字节
3、任务程序代码:任务的执行部分。
任务的执行代码通常都是一个无限循环结构,但是在其循环中能够响应中断,这种结构也叫做超循环结构。
1、 任务的创建
创建任务实际上是创建一个任务控制块,并通过任务控制块把任务代码和任务堆栈关联起来形成一个完整的任务,并使刚刚创建的任务进入就绪状态,并接着引发一次任务调度。(注:区分任务其实就是其优先级,所以任务可以同名,但是优先级必须是唯一的)。
OSTaskCreate()创建任务的过程:首先先判断其优先级是否合法,如果合法的话,那么接着调用OSTaskStkInit()和OSTCBInit()对其任务堆栈和任务控制块进行初始化,初始化成功后,将任务计数器OSTaskCtr+1,若ucos-II的核处于运行状态(即OSRunning ==1),则接着引发一次任务调度。
2、 任务挂起
OSTaskSuspend()挂起任务的过程: 首先判断待挂起的任务是否调用了这个函数的任务本身,如果是任务本身,则必须删除任务在任务就绪表中的就绪标志,并在任务控制块成员OSTCBStat中 做挂起记录,然后引发一次任务调度。如果待挂起的任务不是调用函数的任务本身,而是其他任务,那么只要删除任务就绪表中被挂起任务的就绪标志,并在其任务 控制块成员OSTCBStat中作挂起记录就行了。
3、 任务删除
OSTaskDel()删除任务的过程:把被删除的任务控制块从任务控制块链表中删除,并归还给空任务控制块链表,然后在任务就绪表中将该任务的就绪状态置0。(注:可以通过该函数来删除任务自身或者除了空闲任务之外的其他任务)。
4、 任务恢复
OSTaskResume()恢复任务的过程:首先判断其是否是已挂起的任务,并且同时又不是一个等待任务,如果符合条件,则清楚其OSTCBStat中的挂起记录并使该任务就绪,再接着进行一次任务调度。
任务创建的一般步骤:
在调用启动函数OSStart()之前,必须先创建一个任务,并赋予它罪该优先级别,使其成为起始任务,然后在这个起始任务中,再创建其他任务。
接着,来看看最关键的任务调度。
任务调度是靠任务调度器完成的,μC/OS-Ⅱ中有两种任务调度器,一种是任务级的调度器(OSSched()),另一种是中断级的任务调度器(OSIntExt()),这里只说任务级的任务调度器。
任务调度器(OSSched())有两个作用:一是直接查找出最高优先级的就绪任务;二是实现任务的切换,即让最高优先级的任务运行。OSSched()中调用了OS_Task_sw()来完成任务的切换。
OSSched()的工作过程:首先判断任务调度器是否被上锁且不是中断服务程序(ISR)中调用任务调度器(ISR程序应该调 用OSIntExt()),如果满足条件,则查找出任务就绪表中的最高优先级的任务,然后判断该任务是否是当前任务,如果不是,则将该任务的的任务控制块 指针赋值给OSTCBHighRdy,并给统计任务切换次数的计数器(OSCtxSwCtr)加1.最后调用OS_TASK_SW()进行任务切换。
OS_TASK_SW()的工作过程:因为任务切换的本质就是断点数据的切换,所以OS_TASK_SW()主要的工作就是保存和恢复断点数据(CPU的pc、PWS和通用寄存器中的数据)。 当任务中止时,OS_TASK_SW()先将该任务的断点数据保存在任务的堆栈中,然后将该任务堆栈的指针保存在该任务控制块成员OSTCBStkPtr 中。任务恢复运行时,首先从其任务控制块成员OSTCBStkPtr中获得该任务堆栈的指针,并将其放入CPU的堆栈指针SP中,接着进行断点数据的恢 复,最后CPU获得运行任务的断点指针(PC)。
这篇关于μC/OS-Ⅱ之任务控制块、任务就绪表的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!