版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
任务管理与调度需要掌握的主要知识点任务任务管理任务调度优先级反转第一节
任务HighPriorityTaskLowPriorityTaskTaskTaskTaskTaskTaskTaskEventEventEachTaskInfiniteLoopImportanceSplittinganapplicationintoTasksintmain(void){//InitializeuCOS-II.OSInit();//CreatethefirsttaskOSTaskCreate(TestTask1,(void*)11,&TestTaskStk1[TASK_STK_SIZE],11);//Startmultitasking.OSStart();return0;}voidTestTask1(void*pdata){printf("%4u:*****TestTask1Firstcall*****\n",OSTime);
//Create3othertasksOSTaskCreate(TestTask2,(void*)22,&TestTaskStk2[TASK_STK_SIZE],22);OSTaskCreate(TestTask3,(void*)33,&TestTaskStk3[TASK_STK_SIZE],33);OSTaskCreate(TestTask4,(void*)10,&TestTaskStk3[TASK_STK_SIZE],10);while(1){
printf("%4u:*****TestTask11*****\n",OSTime);
OSTimeDly(1);}}TaskdemobasedonucOSvoidTestTask2(void*pdata){
while(1){printf("%4u:*****TestTask22*****\n",OSTime);
OSTimeDly(1);
}}voidTestTask3(void*pdata){
while(1){
printf("%4u:*****TestTask33*****\n",OSTime);OSTimeDly(1);}}voidTestTask4(void*pdata){
while(1){printf("%4u:+++++TestTask10+++++\n",OSTime);OSTaskSuspend(10);//Suspendyourself
}}程序运行结果单进程/单线程模型单进程/多线程模型多进程/多线程模型多进程/单线程模型任务的定义及其主要特性任务是一个具有独立功能的无限循环的程序段的一次运行活动,是实时内核调度的单位,具有以下特性:动态性:任务状态是不断变化的。一般分为就绪态、运行态和等待态。在多任务系统中,任务的状态将随着系统的需要不断进行变化。并行性:系统中同时存在多个任务,这些任务在宏观上是同时运行的。异步独立性:每个任务各自按相互独立的不可预知的速度运行,走走停停。任务的内容任务主要包含以下内容:代码:一段可执行的程序数据:程序所需要的相关数据(变量、工作空间、缓冲区等)堆栈程序执行的上下文环境任务的内容任务所包含的程序通常为一个具有无限循环的程序/*ioTaskimplementsdataobtainingandhandlingcontinuously*/voidioTask(void){ intdata;
initial(); /*Thefollowingsentencesgetdataandhandledatacontinuously*/ while(TRUE) { data=getData(); handleData(data); }}
voidYourTask(void*pdata){for(;;){/*USERCODE*/CalloneofuC/OS-II’sservices:OSFlagPend();OSMboxPend();OSMutexPend();OSQPend();OSSemPend();OSTaskDel(OS_PRIO_SELF);OSTaskSuspend(OS_PRIO_SELF);OSTimeDly();OSTimeDlyHMSM();/*USERCODE*/}}voidYourTask(void*pdata){/*USERCODE*/OSTaskDel(OS_PRIO_SELF);}voidTestTask2(void*pdata){
while(1){printf("%4u:*****TestTask22*****\n",OSTime);
OSTimeDly(1);}}voidTestTask3(void*pdata){
while(1){
printf("%4u:*****TestTask33*****\n",OSTime);OSTimeDly(1);}}voidTestTask4(void*pdata){
while(1){printf("%4u:+++++TestTask10+++++\n",OSTime);OSTaskSuspend(10);//Suspendyourself
}}任务的内容任务与程序的区别:任务能真实地描述工作内容的并发性,而程序不能;程序是任务的组成部分除程序外,任务还包括数据、堆栈及其上下文环境等内容;程序是静态的,任务是动态的;任务有生命周期,有诞生、有消亡,是短暂的;而程序是相对长久的;一个程序可对应多个任务,反之亦然;任务具有创建其他任务的功能,而程序没有。任务的内容任务上下文环境(context)包括了实时内核管理任务、以及处理器执行任务所需要的所有信息。任务优先级、任务的状态等实时内核所需要的信息,以及处理器的各种寄存器的内容(hardwarecontext):程序计数器、堆栈指针、通用寄存器等的内容任务的上下文环境通过任务控制块(taskcontrolblock,TCB)来体现。任务1任务2任务3内核内核代码内核数据栈数据任务控制块代码栈数据任务控制块代码栈数据任务控制块代码任务1任务2任务3多任务系统示意图任务的分类按照到达情况的可预测性,任务可以划分为:周期任务(periodictask)非周期任务按照重要程度,可分为:关键任务(criticaltask)非关键任务(noncriticaltask)任务参数任务参数:优先级(priority)周期(period)计算时间(computationtime)就绪时间(readytime)截止时间(deadline)任务的优先级表示任务对应工作内容在处理上的优先程度优先级越高,表明任务越需要得到优先处理飞行器中处理稳定性控制的任务,就需要具有较高的优先级,一旦执行条件得到满足,应及时得到执行任务的优先级分为静态优先级和动态优先级。静态优先级:任务的优先级被确定后,在系统运行过程中将不再发生变化;动态优先级:系统运行过程中,任务的优先级是可以动态变化的。任务参数周期周期任务所具有的参数,表示任务周期性执行的间隔时间任务的计算时间任务在特定硬件环境下被完整执行所需要的时间,也被称为是任务的执行时间(executiontime)。由于任务每次执行的软件环境的差异性,导致任务在各次具体执行过程中的计算时间各有不同。通常用最坏情况下的执行时间(worstcasetime)或是需要的最长执行时间来表示,也可用统计时间(statisticaltime)来表示。任务参数任务的就绪时间任务具备了在处理器上被执行所需要的条件时的时间任务的截止时间意味着任务需要在该时间到来之前被执行完成。截止时间可以通过绝对截止时间(absolutedeadline)和相对截止时间(relativetime)两种方式来表示相对截止时间为任务的绝对截止时间减去任务的就绪时间。截止时间可以分为强截止时间(harddeadline)和弱截止时间(softdeadline)两种情况:具有强截止时间的任务即为关键任务,如果截止时间不能得到满足,就会出现严重的后果。拥有关键任务的实时系统又被称为强实时(hardreal-time)系统,否则称为弱实时(softreal-time)系统。空闲任务whichisexecutedwhennoneoftheothertasksisreadytorun.Theidletaskisalwayssettothelowestpriority.Theidletaskcanneverbedeletedbyapplicationsoftware.voidOS_TaskIdle(void*pdata){
/*Preventcompilerwarningfornotusing'pdata‘
*/pdata=pdata;for(;;)
{OS_ENTER_CRITICAL();OSIdleCtr++;OS_EXIT_CRITICAL();
/*CalluserdefinableHOOK*/OSTaskIdleHook();
}}IdelTaskofucOSOSIdleCtrisusedbythestatisticstasktodeterminehowmuchCPUtime(inpercentage)isactuallybeingconsumedbytheapplicationsoftware.
任务状态与变迁任务状态与变迁任务拥有的资源情况是不断变化的,导致任务状态也表现出不断变化的特性。不同的实时内核实现方式对任务状态的定义不尽相同,但是都可以概括为三种基本的状态:等待(waiting):任务在等待某个事件的发生;就绪(ready):任务等待获得处理器资源;执行(running):任务获得处理器资源,所包含的代码内容正在被执行。就绪态运行态等待态获得CPU被高优先级任务抢占或超时获得资源需要资源任务状态变迁任务1任务2任务3调度程序05101520253035404550运行等待就绪三个任务进行状态转换的过程
包含三个任务和一个调度程序。调度程序用来确定下一个需要投入运行的任务,因此调度程序本身也需要占用一定的处理时间。TaskstatesandtransitionofucOS
第二节
任务管理
任务管理
——任务控制块任务控制块任务管理是通过对任务控制块(taskcontrolblock,TCB)的操作来实现的。任务控制块是包含任务相关信息的数据结构包含了任务执行过程中所需要的所有信息。任务控制块大都包括以下信息:任务的名字任务执行的起始地址任务的优先级任务的状态任务的硬件上下文(堆栈指针、PC和寄存器等)、任务的队列指针等内容任务控制块管理机制为节约内存,任务数量通常需要进行预先配置按照配置的任务数量初始化任务控制块,一个任务对应一个初始的任务控制块,形成一个空闲任务控制块链。在任务创建时,实时内核从空闲任务控制块链中为任务分配一个任务控制块。随后对任务的操作,都是基于对应的任务控制块来进行的。当任务被删除后,对应的任务控制块又会被实时内核回收到空闲任务控制块链。typedefstructos_tcb{
OS_STK*OSTCBStkPtr;
/*Pointertocurrenttopofstack
*/#ifOS_TASK_CREATE_EXT_EN>0void*OSTCBExtPtr;
/*PointertouserdefinabledataforTCBextension*/OS_STK*OSTCBStkBottom;/*Pointertobottomofstack
*/INT32UOSTCBStkSize;/*Sizeoftaskstack(innumberofstackelements)*/INT16UOSTCBOpt;/*TaskoptionsaspassedbyOSTaskCreateExt()*/INT16UOSTCBId;/*TaskID(0..65535)*/#endifstructos_tcb*OSTCBNext;/*PointertonextTCBintheTCBlist
*/structos_tcb*OSTCBPrev;/*PointertopreviousTCBintheTCBlist*/#if((OS_Q_EN>0)&&(OS_MAX_QS>0))||(OS_MBOX_EN>0)||(OS_SEM_EN>0)||(OS_MUTEX_EN>0)OS_EVENT*OSTCBEventPtr;/*Pointertoeventcontrolblock
*/#endif#if((OS_Q_EN>0)&&(OS_MAX_QS>0))||(OS_MBOX_EN>0)void*OSTCBMsg;/*MessagereceivedfromOSMboxPost()orOSQPost()*/#endifTCBofucOS#if(OS_VERSION>=251)&&(OS_FLAG_EN>0)&&(OS_MAX_FLAGS>0)#ifOS_TASK_DEL_EN>0OS_FLAG_NODE*OSTCBFlagNode;/*Pointertoeventflagnode*/#endifOS_FLAGSOSTCBFlagsRdy;/*Eventflagsthatmadetaskreadytorun*/#endifINT16UOSTCBDly;/*Nbrtickstodelaytaskor,timeoutwaitingforevent*/INT8UOSTCBStat;/*Taskstatus
*/INT8UOSTCBPrio;/*Taskpriority(0==highest,63==lowest)
*/INT8UOSTCBX;/*Bitpositioningroupcorrespondingtotaskpriority
(0..7)*/INT8UOSTCBY;/*Indexintoreadytablecorrespondingtotaskpriority
*/INT8UOSTCBBitX;/*Bitmasktoaccessbitpositioninreadytable
*/INT8UOSTCBBitY;/*Bitmasktoaccessbitpositioninreadygroup
*/#ifOS_TASK_DEL_EN>0BOOLEANOSTCBDelReq;/*Indicateswhetherataskneedstodeleteitself
*/#endif}OS_TCB;Uc-OS的任务管理任务管理
——任务切换任务切换任务切换(contextswitching)保存当前任务的上下文,并恢复需要执行的任务的上下文的过程。当发生任务切换时:当前正在运行的任务的上下文就需要通过该任务的任务控制块保存起来;把需要投入运行的任务的上下文从对应的任务控制块中恢复出来。任务1任务2实时内核调度程序保存任务1的上下文到TCB1从TCB2恢复任务2的上下文……保存任务2的上下文到TCB2从TCB1恢复任务1的上下文……时间任务1执行一段时间后,由于某种原因,需要进行任务切换,进入实时内核的调度程序。调度程序首先把当前的上下文内容保存到任务1的任务控制块TCB1中,然后又把任务2的上下文从TCB2中恢复到CPU寄存器,随后任务2得到执行。任务2执行一段时间后,由于某种原因,需要进行任务切换,进入实时内核的调度程序。调度程序首先把当前的上下文内容保存到任务2的任务控制块TCB2中,然后又把任务1的上下文从TCB1中恢复到CPU寄存器,随后任务1得到执行。
任务切换任务切换将导致任务状态发生变化:当前正在运行的任务将由运行状态变为就绪或是等待状态;需要投入运行的任务则由就绪状态变为运行状态。任务切换具有如下基本步骤:保存任务上下文环境;更新当前处于运行状态的任务的任务控制块的内容,如把任务的状态由运行状态改变为就绪或是等待状态;把任务的任务控制块移到相应的队列(就绪队列或是等待队列);选择另一个任务进行执行:调度;改变需要投入运行的任务的任务控制块的内容,把任务的状态变为运行状态;根据任务控制块,恢复需要投入运行的任务的上下文环境。voidOS_Sched(void){INT8Uy;OS_ENTER_CRITICAL();if((OSIntNesting==0)&&(OSLockNesting==0))
{/*Sched.onlyifallISRsdone¬locked*/
y=OSUnMapTbl[OSRdyGrp];/*GetpointertoHPTreadytorun*/OSPrioHighRdy=(INT8U)((y<<3)+OSUnMapTbl[OSRdyTbl[y]]);if(OSPrioHighRdy!=OSPrioCur)
{/*NoCtxSwifcurrenttaskishighestrdy
*/OSTCBHighRdy=OSTCBPrioTbl[OSPrioHighRdy];OSCtxSwCtr++;/*Incrementcontextswitchcounter
*/OS_TASK_SW();/*Performacontextswitch
*/}}OS_EXIT_CRITICAL();}TaskschedulingofucOSvoidOSCtxSw(void){PUSHR1,R2,R3andR4ontothecurrentstack;OSTCBCur->OSTCBStkPtr=SP;OSTCBCur=OSTCBHighRdy;SP=OSTCBHighRdy->OSTCBStkPtr;POPR4,R3,R2andR1fromthenewstack;Executeareturnfrominterruptinstruction;}OS_TASK_SW()Context-switchinucOSDatastructuresbeforecontext-switchContext-switchinucOSDatastructuresaftersavingthecontext-switchofcurrenttaskContext-switchinucOSDatastructuresafterrestoringthecontext-switchofhighprioritytaskContext-switchinucOSBasedon80X86CPUrealmode_OSCtxSwPROCFARPUSHA;Savecurrenttask'scontextPUSHES;PUSHDS;;MOVAX,SEG_OSTCBCur;ReloadDSincaseitwasalteredMOVDS,AX;;LESBX,DWORDPTRDS:_OSTCBCur;OSTCBCur->OSTCBStkPtr=SS:SPMOVES:[BX+2],SS;MOVES:[BX+0],SP;;CALLFARPTR_OSTaskSwHook;MOVAX,WORDPTRDS:_OSTCBHighRdy+2;OSTCBCur=OSTCBHighRdyMOVDX,WORDPTRDS:_OSTCBHighRdy;MOVWORDPTRDS:_OSTCBCur+2,AX;MOVWORDPTRDS:_OSTCBCur,DX;;MOVAL,BYTEPTRDS:_OSPrioHighRdy;OSPrioCur=OSPrioHighRdyMOVBYTEPTRDS:_OSPrioCur,AL;LESBX,DWORDPTRDS:_OSTCBHighRdy;SS:SP=OSTCBHighRdy->OSTCBStkPtr
MOVSS,ES:[BX+2];MOVSP,ES:[BX];;POPDS;Loadnewtask'scontextPOPES;POPA;;IRET;Returntonewtask;_OSCtxSwENDPContext-switchunder80x86任务管理
——任务队列任务队列任务队列通过任务控制块实现对系统中所有任务的管理。新任务CPU就绪队列等待队列超时调度等待资源获得资源释放CPU单就绪队列和单等待队列任务队列队列由任务控制块构成tasknametaskIDtaskstatustaskprioritytaskcontext…tasknametaskIDtaskstatustaskprioritytaskcontext…tasknametaskIDtaskstatustaskprioritytaskcontext…Head队列TCB1TCB2TCBnNULL任务队列FreeTCBsafterOS_TCBInit()inucOSTaskreadylistafterOSInit()inucOSTaskreadylistafterOSStart()inucOS任务管理
——优先级管理优先级位图算法OSRdyGrp:优先级就绪组OSRdyTbl:优先级就绪表35:00100011charOSRdyGrp;charOSRdyTbl[8];下标二进制值000000001100000010200000100300001000400010000500100000601000000710000000优先级映射表charOSMapTbl[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};OSMapTbl的数组元素的下标与任务优先级的高三位或低三位相对应。OSMapTbl的数组元素对应的二进制值中,位为1的位表示OSRdyGrp或是OSRdyTbl[]的对应位也为1。
35:00100011优先级判定表charOSUnMapTbl[256];以OSRdyGrp或是OSRdyTbl[]数组元素的值为索引,获取该值对应二进制表示中1出现的最低二进制位的序号(0-7)。
任务进入就绪态OSRdyGrp|=OSMapTbl[priority>>3];OSRdyTbl[priority>>3]|=OSMapTbl[priority&0x07];35:00100011OSRdyGrp765432101514131211109823222120191817163130292827262524393837363534333247464554434241405554535251504948636261605958575676543210OSRdyTblOSRdyTbl[0]OSRdyTbl[1]OSRdyTbl[2]OSRdyTbl[3]OSRdyTbl[4]OSRdyTbl[5]OSRdyTbl[6]OSRdyTbl[7]
00010000
00001000任务退出就绪态
if((OSRdyTbl[priority>>3]&=~OSMapTbl[priority&0x07])==0) OSRdyGrp&=~OSMapTbl[priority>>3];
35:00100011OSRdyGrp765432101514131211109823222120191817163130292827262524393837363534333247464554434241405554535251504948636261605958575676543210OSRdyTbl
00001000->11110111
00010000->11101111OSRdyTbl[0]OSRdyTbl[1]OSRdyTbl[2]OSRdyTbl[3]OSRdyTbl[4]OSRdyTbl[5]OSRdyTbl[6]OSRdyTbl[7]获取进入就绪态的最高优先级high3Bit=OSUnMapTbl[OSRdyGrp];low3Bit=OSUnMapTbl[OSRdyTbl[high3Bit]]; priority=(high3Bit<<3)+low3Bit;
35:00100011OSRdyGrp7654321015141312111098232221201918171631302928272625241000100047464554434241405554535251504948636261605958575601010000OSRdyTbl
0x60->4/high3Bit
0x88->3/low3Bit
ucOS中,任务按优先级进行组织,以优先级为数组元素下标,通过OSTCBPrioTbl[]即可找到相应的TCB。OSRdyTbl[0]OSRdyTbl[1]OSRdyTbl[2]OSRdyTbl[3]OSRdyTbl[4]OSRdyTbl[5]OSRdyTbl[6]OSRdyTbl[7]任务管理
——基本函数任务管理机制任务管理用来实现对任务状态的直接控制和访问。内核的任务管理是通过系统调用来体现,主要包括任务创建、任务删除、任务挂起、任务唤醒、设置任务属性等内容。创建任务删除任务挂起任务唤醒任务设置任务属性改变任务优先级获取任务信息…任务管理功能任务管理基本函数创建create创建任务任务创建为任务分配和初始化相关的数据结构。任务创建时通常需要使用如下信息:任务的名字任务的初始优先级任务栈任务属性任务对应的函数入口地址任务对应函数的参数任务删除时的回调函数创建任务栈空间:由于不同任务运行时需要的的大小不同,由内核进行任务栈的分配就不能适应应用任务的多样性需求。通常由用户指定任务运行过程中需要使用的栈空间。确定任务到底需要多少栈空间是一个比较困难的事情。大都需要进行一个反复修正的过程:在最开始的时候,根据应用的类型,为任务分配一个比预期估计更大的栈空间;使用栈检测函数,定期监控任务对栈的使用情况,并据此对任务栈的大小进行调整。创建任务任务创建通常需要完成以下工作:获得任务控制块TCB根据实时内核用户提供的信息初始化TCB为任务分配一个可以唯一标识任务的ID使任务处于就绪状态,把任务放置到就绪队列进行任务调度处理INT8UOSTaskCreate(void(*task)(void*pd),void*pdata,OS_STK*ptos,INT8Uprio){
OS_STK*psp;
INT8Uerr;
OS_ENTER_CRITICAL();
if(OSTCBPrioTbl[prio]==(OS_TCB*)0){/*Makesuretaskdoesn'talreadyexistatthispriority*/
OSTCBPrioTbl[prio]=(OS_TCB*)1;
/*Reservetheprioritytopreventothersfromdoing
thesamethinguntiltaskiscreated.*/
OS_EXIT_CRITICAL();psp=(OS_STK*)OSTaskStkInit(task,pdata,ptos,0);/*Initializethetask'sstack*/err=OS_TCBInit(prio,psp,(OS_STK*)0,0,0,(void*)0,0);if(err==OS_NO_ERR){OS_ENTER_CRITICAL();OSTaskCtr++;
/*Incrementthe#taskscounter*/OS_EXIT_CRITICAL();if(OSRunning==TRUE){/*Findhighestprioritytaskifmultitaskinghasstarted*/OS_Sched();}}else{OS_ENTER_CRITICAL();OSTCBPrioTbl[prio]=(OS_TCB*)0;/*Makethispriorityavailabletoothers*/OS_EXIT_CRITICAL();}return(err);}OS_EXIT_CRITICAL();return(OS_PRIO_EXIST);}
OSTaskCreateinucOSOS_STK*OSTaskStkInit(void(*task)(void*pd),void*pdata,OS_STK*ptos,INT16Uopt)
{
模拟带参数(pdata)的函数调用;//(1)
模拟ISR向量;//(2)
按照预先设计的寄存器值初始化堆栈结构;//(3)spsr,允许IRQ,FIQ中断,清中断计数器等;//(4)
返回栈顶指针给调用该函数的函数;//(5)
}
任务管理基本函数删除delete删除任务
内核根据任务创建时获得的ID删除指定的任务。在删除一个任务时,需要释放该任务所拥有的资源。释放任务所拥有的资源通常由内核和任务共同完成。内核通常只释放那些由内核为任务分配的资源如任务名字和TCB等内容所占用的空间。由任务自己分配的资源则通常由任务自身进行释放如任务的堆栈空间,以及其他一些任务申请的资源,信号量、timer、文件系统资源、I/O设备和使用malloc等函数动态获得的内存空间等。删除任务任务删除通常需要进行以下工作:根据指定的ID,获得对应任务的TCB把任务的TCB从队列中取出来,挂入空闲TCB队列释放任务所占用的资源INT8UOSTaskDel(INT8Uprio){OS_EVENT*pevent;OS_TCB*ptcb;BOOLEANself;if(OSIntNesting>0){/*SeeiftryingtodeletefromISR*/return(OS_TASK_DEL_ISR);}
OS_ENTER_CRITICAL();if(prio==OS_PRIO_SELF){/*Seeifrequestingtodeleteself*/prio=OSTCBCur->OSTCBPrio;/*Setprioritytodeletetocurrent*/}ptcb=OSTCBPrioTbl[prio];if(ptcb!=(OS_TCB*)0){/*Tasktodeletemustexist*/if((OSRdyTbl[ptcb->OSTCBY]&=~ptcb->OSTCBBitX)==0x00){/*Maketasknotready*/OSRdyGrp&=~ptcb->OSTCBBitY;}
pevent=ptcb->OSTCBEventPtr;
if(pevent!=(OS_EVENT*)0){/*Iftaskiswaitingonevent*/
if((pevent->OSEventTbl[ptcb->OSTCBY]&=~ptcb->OSTCBBitX)==0){
/*...removetaskfromeventctrlblock*/
pevent->OSEventGrp&=~ptcb->OSTCBBitY;}}
ptcb->OSTCBDly=0;/*PreventOSTimeTick()fromupdating*/
ptcb->OSTCBStat=OS_STAT_RDY;/*Preventtaskfrombeingresumed*/
if(OSLockNesting<255){OSLockNesting++;
}
OS_EXIT_CRITICAL();OSTaskDelinucOS
OS_Dummy();/*...DummyensuresthatINTswillbe*/OS_ENTER_CRITICAL();/*...disabledHERE!*/
if(OSLockNesting>0){OSLockNesting--;
}OSTaskDelHook(ptcb);/*Calluserdefinedhook*/OSTaskCtr--;/*Onelesstaskbeingmanaged*/OSTCBPrioTbl[prio]=(OS_TCB*)0;/*Clearoldpriorityentry*/if(ptcb->OSTCBPrev==(OS_TCB*)0){/*RemovefromTCBchain*/ptcb->OSTCBNext->OSTCBPrev=(OS_TCB*)0;OSTCBList=ptcb->OSTCBNext;}else{ptcb->OSTCBPrev->OSTCBNext=ptcb->OSTCBNext;ptcb->OSTCBNext->OSTCBPrev=ptcb->OSTCBPrev;}ptcb->OSTCBNext=OSTCBFreeList;/*ReturnTCBtofreeTCBlist*/OSTCBFreeList=ptcb;OS_EXIT_CRITICAL();OS_Sched();/*Findnewhighestprioritytask*/return(OS_NO_ERR);}OS_EXIT_CRITICAL();return(OS_TASK_DEL_ERR);}任务管理基本函数挂起Suspend挂起任务
挂起指定任务,直到通过唤醒任务对任务进行解挂。一个任务可以把自己挂起当任务把自己挂起后,会引起任务的调度,实时内核将选取另外一个合适的任务进行执行。任务被挂起后,该任务将处于等待状态挂起任务通常需要进行以下工作:根据指定的ID,获得对应任务的TCB把任务的状态变为等待状态,并把TCB放置到等待队列如果任务自己挂起自己,进行任务调度INT8UOSTaskSuspend(INT8Uprio){BOOLEANself;OS_TCB*ptcb;
OS_ENTER_CRITICAL();if(prio==OS_PRIO_SELF){
/*SeeifsuspendSELF*/prio=OSTCBCur->OSTCBPrio;self=TRUE;}elseif(prio==OSTCBCur->OSTCBPrio){/*Seeifsuspendingself*/self=TRUE;}else{self=FALSE;
/*Nosuspendinganothertask*/}ptcb=OSTCBPrioTbl[prio];if(ptcb==(OS_TCB*)0){
/*Tasktosuspendmustexist*/OS_EXIT_CRITICAL();return(OS_TASK_SUSPEND_PRIO);}if((OSRdyTbl[ptcb->OSTCBY]&=~ptcb->OSTCBBitX)==0x00){/*Maketasknotready*/OSRdyGrp&=~ptcb->OSTCBBitY;}ptcb->OSTCBStat|=OS_STAT_SUSPEND;/*Statusoftaskis'SUSPENDED'*/OS_EXIT_CRITICAL();if(self==TRUE){
/*ContextswitchonlyifSELF*/OS_Sched();}return(OS_NO_ERR);}OSTaskSuspendinucOS进入挂起自己清就绪表清就绪表OS_Sched()返回YN任务管理基本函数唤醒Resume唤醒任务
根据任务ID解挂指定的任务。如果任务还在等待其他资源,任务解挂后仍然处于等待状态;否则,解挂后的任务将处于就绪状态。解挂任务通常需要进行以下工作:根据指定的ID,获得对应任务的TCB如果任务在等待其他资源,任务将仍然处于等待状态;否则,把任务的状态变为就绪状态,并把TCB放置到就绪队列进行任务调度INT8UOSTaskResume(INT8Uprio){OS_TCB*ptcb;
OS_ENTER_CRITICAL();ptcb=OSTCBPrioTbl[prio];if(ptcb==(OS_TCB*)0){/*Tasktosuspendmustexist*/OS_EXIT_CRITICAL();return(OS_TASK_RESUME_PRIO);}if((ptcb->OSTCBStat&OS_STAT_SUSPEND)!=OS_STAT_RDY){/*Taskmustbesuspended*/if(((ptcb->OSTCBStat&=~OS_STAT_SUSPEND)==OS_STAT_RDY)&&/*Removesuspension*/(ptcb->OSTCBDly==0)){/*Mustnotbedelayed*/OSRdyGrp|=ptcb->OSTCBBitY;/*Maketaskreadytorun*/OSRdyTbl[ptcb->OSTCBY]|=ptcb->OSTCBBitX;OS_EXIT_CRITICAL();OS_Sched();}else{OS_EXIT_CRITICAL();}return(OS_NO_ERR);}OS_EXIT_CRITICAL();return(OS_TASK_NOT_SUSPENDED);}OSTaskResumeinucOS进入延迟挂起置就绪表OS_Sched()返回NY挂起YN任务管理基本函数睡眠TimeDly任务睡眠
使当前任务睡眠一段指定的时间,时间到后,任务又重新回到就绪状态。任务睡眠通常需要进行以下工作:修改任务状态,把任务状态变为等待状态把任务TCB放置到时间等待链进行任务调度第三节
任务调度任务调度要解决的问题WHAT:按什么原则分配CPU
任务调度算法WHEN:何时分配CPU任务调度的时机HOW:如何分配CPU任务调度过程(任务的上下文切换)对于大量的实时调度方法而言,存在着以下几类主要的划分方法:离线(off-line)和在线(on-line)调度抢占(preemptive)和非抢占(non-preemptive)调度静态(static)和动态(dynamic)调度最佳(optimal)和试探性(heuristic)调度ISRLowPriorityTaskHighPriorityTaskISRISRmakeHighPriorityTaskReadyISRCompletes(ReturntoTask)LowPriorityTaskCompletes(SwitchtoHPTask)InterruptOccursVectortoISRNon-Preemptive
ISRLowPriorityTask(LPT)HighPriorityTask(HPT)ISRISRmakeHighPriorityTaskReadyInterruptOccursVectortoISRISRCompletes(SwitchtoHPTask)HPTaskCompletes(SwitchbacktoLPTask)Preemptive
任务1任务2任务3优先级高低时间任务2就绪任务3就绪任务2任务1抢占抢占任务3运行结束任务2运行结束在可抢占调度方式下的任务运行情况
任务1被具有更高优先级的任务2所抢占,然后任务2又被任务3抢占。当任务3完成运行后,任务2继续执行。当任务2完成运行后,任务1才又得以继续执行。时间片轮转调度时间片轮转调度(round-robinscheduling)算法当有两个或多个就绪任务具有相同的优先级,且它们是就绪任务中优先级最高的任务时,任务调度程序按照这组任务就绪的先后次序调度第一个任务,让第一个任务运行一段时间,然后又调度第二个任务,让第二个任务又运行一段时间,依次类推,到该组最后一个任务也得以运行一段时间后,接下来又让第一个任务运行。任务运行的这段时间称为时间片(timeslicing)。任务1任务2任务3优先级高低时间任务3就绪任务3运行结束任务1任务2任务1任务2在时间片轮转调度方式下的任务运行情况任务1和任务2具有相同的优先级,按照时间片轮转的方式轮流执行。当高优先级任务3就绪后,正在执行的任务2被抢占,高优先级任务3得到执行。当任务3完成运行后,任务2才重新在未完成的时间片内继续执行。随后任务1和任务2又按照时间片轮转的方式执行。静态调度静态调度算法任务的优先级需要在系统运行前进行确定。确立任务优先级的主要依据为:
执行时间。以执行时间为依据的调度算法为:最短执行时间优先(smallestexecutiontimefirst);最长执行时间优先(largestexecutiontimefirst)。周期。以周期为依据的调度算法为:短周期任务优先(smallestperiodfirst);长周期任务优先(largestperiodfirst)。静态调度任务的CPU使用率。任务的CPU使用率为任务计算时间与任务周期的比值。以任务的CPU使用率为依据的调度算法为:最小CPU使用率优先(smallesttaskutilizationfirst);最大CPU使用率优先(largesttaskutilizationfirst)。紧急程度。根据任务的紧急程度,以人为的方式进行优先级的静态安排。人为安排优先级比率单调调度算法
人为安排优先级
人为安排优先级是嵌入式实时软件开发中使用得非常多的一种方法。以系统分析、设计人员对系统需求的理解为基础,确定出系统中各个任务之间的相对优先情况,并据此确定出各个任务的优先级。webDisplaydataHandlingdataRecv1请求Web页面2请求Web页面3请求Web页面4Web数据5Web数据6解析后的Web数据在一个用来实现网页浏览的应用中,可把整个应用划分为网络数据接收dataRecv、网页数据处理dataHandling和网页显示webDisplay等三个任务。由于dataRecv需要及时接收从网络传过来的数据,其优先级应最高;webDisplay需要及时处理用户的输入(如停止获取当前页面或是请求新的页面等),其优先级应比dataHandling高。据此,可人为地把dataRecv、dataHandling和webDisplay的优先级分别安排为5、7、6(设定数字越大,任务的优先级越低)。比率单调调度算法Liu和Layland把提出调度算法定位于单处理器的实时任务调度RMS是一个静态的固定优先级调度算法:任务的优先级与任务的周期表现为单调函数关系任务周期越短,任务的优先级越高;任务周期越长,任务的优先级越低。RMS是静态调度中的最优调度算法如果一组任务能够被任何静态调度算法所调度,则这些任务在RMS下也是可调度的。动态调度对于静态调度,任务的优先级不会发生变化。在动态调度中,任务的优先级可根据需要进行改变,也可能随着时间按照一定的策略自动发生变化。截止时间优先调度算法最短空闲时间优先调度算法第四节
优先级反转优先级继承协议优先级天花板协议t0t0t1t2t3t4t5t6t7t8CriticalsectionguardedbyStimeτ1τ2τ3t9t0t10t11t12t13t14t15t16t18t17假设T1,T2,T3为优先级顺序降低的三个任务,T1具有最高优先级。假定T1和T3通过信号量S共享一个数据结构,并且,在时刻t1,任务T3获得信号量S,开始执行临界区代码。在T3执行临界区代码的过程中,高优先级任务T1就绪,抢占任务T3而获得CPU资源,并在随后试图使用共享数据,但该共享数据已被T1通过信号量S加锁。在这种情况下,会期望具有最高优先级的任务T1被阻塞的时间不超过任务T3执行完整个临界区的时间。但事实上,这种阻塞时间的长度是无法预知的。这主要是由于任务T3还可能被具有中等优先级的任务T2所阻塞,使得T1也需要等待T2和其他中等优先级的任务释放CPU资源。优先级继承协议
优先级继承协议的基本思想是:
当一个任务阻塞了一个或多个高优先级任务时,该任务将不使用其原来的优先级,而使用被该任务所阻塞的所有任务的最高优先级作为其执行临界区的优先级。 当该任务退出临界区时,又恢复到其最初的优先级。
t0t0t1t2t3t4t5t6t7t8CriticalsectionguardedbyStimeτ1τ2τ3t9t0t10t11t12t13t14t15t16t18t17如果任务T1被T3阻塞,优先级继承协议要求任务T3以任务T1的优先级执行临界区。这样,任务T3在执行临界区的时候,原来比T3具有更高优先级的任务T2就不能抢占T3了。当T3退出临界区时,T3又恢复到其原来的低优先级,使任务T1又成为最高优先级的任务。这样任务T1会抢占任务T3而继续获得CPU资源,而不会出现T1会无限期被任务T2所阻塞。优先级天花板协议使用优先级天花板协议的目的在于解决优先级继承协议中存在的死锁和阻塞链问题。优先级天花板指控制访问临界资源的信号量的优先级天花板。信号量的优先级天花板为所有使用该信号量的任务的最高优先级。在优先级天花板协议中,如果任务获得信号量,则在任务执行临界区的过程中,任务的优先级将被抬升到所获得信号量的优先级天花板。t0t0t1t2t3t4t5t6t7t8CriticalsectionguardedbyStimeτ1τ2τ3t9t0t10t11t12t13t14t15t16t18t17假设系统中存在T1,T2,T3三个优先级顺序降低的任务(优先级分别为p1、p2、p3)。假定T1和T3通过信号量S共享一个临界资源。根据优先级天花板协议,信号量S的优先级天花板为p1。假定在时刻t1,T3获得信号量S,按照优先级天花板协议,T3的优先级将被抬升为信号量S的优先级天花板p1,直到T3退出临界区。这样,T3在执行临界区的过程中,T1和T2都不能抢占T3,确保T3能尽快完成临界区的执行,并释放信号量S,退出临界区。当T3退出临界区后,T3的优先级又回落为p3。此时,如果T3在执行临界区的过程中,任务T1或T2已经就绪,则T1或T2将抢占T3的执行。t0t0t1t2t3t4t5t6t7t8τ1τ2τ3Criticalsectionguarded
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年共青团入团考试辨析判断知识点题库与答案
- 2026年共青团团干部考试题库附标准答案
- 2026年成考专升本政治入门试题及答案
- 2026年成人高考专升本政治速成试题及答案
- 抽样检验技术试题及答案
- 2026北师大三下游戏情境课件
- 企业导师带徒形象规范
- 企业供应链数字化水平调研报告
- 企业办公工位清洁指南
- 2026数学核心素养落地说课课件
- CMF中国宏观经济分析与预测报告(2026年中期) 中国经济 2026承前启后
- 汽车-招股说明书梳理系列:Momenta
- 2026人教版一年级下册数学暑假作业每日一练
- 2025-2026学年四川省成都市成华区八年级下册期末学业检测数学试题 含答案
- 地下室工程监理实施细则
- 2026广东广州市海珠区城市管理和综合执法局招聘雇员26人考试参考试题及答案解析
- 电力电缆及通道防火技术要求(DLT2880-2025 )
- 2026年南平光泽县总医院招聘编外专业技术人员笔试参考题库及答案解析
- 2026零碳园区(区域)综合解决方案
- 深度融合与创新实践:中职数学与汽车维修专业的协同发展研究
- 应急联锁设备设施专项检查表
评论
0/150
提交评论