μC/OS-II的任务管理
码如程序清单L4.12所示。任务B需要决定在怎样的情况下请求删除任务[L4.12(1)]。换句话说,用户的应用程序需要决定在什么样的情况下删除任务。如果任务需要被删除,可以通过传递被删除任务的优先级来调用OSTaskDelReq()[L4.12(2)]。如果要被删除的任务不存在(即任务已被删除或是还没被建立),OSTaskDelReq()返回OS_TASK_NOT_EXIST。如果OSTaskDelReq()的返回值为OS_NO_ERR,则表明请求已被接受但任务还没被删除。用户可能希望任务B等到任务A删除了自己以后才继续进行下面的工作,这时用户可以象笔者一样,通过让任务B延时一定时间来达到这个目的[L4.12(3)]。笔者延时了一个时钟节拍。如果需要,用户可以延时得更长一些。当任务A完全删除自己后,[L4.12(2)]中的返回值成为0S_TASK_NOT_EXIST,此时循环结束[L4.12(4)]。 程序清单 L4.12 请求删除其它任务的任务(任务B) voidRequestorTask(void*pdata) { INT8Uerr; pdata=pdata; for(;;){ /* 应用程序代码 */ if('TaskToBeDeleted()' 需要被删除){(1) while(OSTaskDelReq(TASK_TO_DEL_PRIO)!=OS_TASK_NOT_EXIST){(2) OSTimeDly(1);(3) } } /*应用程序代码*/(4) } } 程序清单 L4.13 需要删除自己的任务(任务A) voIDTaskToBeDeleted(void*pdata) { INT8Uerr; pdata=pdata; for(;;){ /*应用程序代码*/ If(OSTaskDelReq(OS_PRIO_SELF)==OS_TASK_DEL_REQ){(1) 释放所有占用的资源;(2) 释放所有动态内存; OSTaskDel(OS_PRIO_SELF);(3) }else{ /*应用程序代码*/ } } } 需要删除自己的任务(任务A)的代码如程序清单L4.13所示。在OS_TAB中存有一个标志,任务通过查询这个标志的值来确认自己是否需要被删除。这个标志的值是通过调用OSTaskDelReq(OS_PRIO_SELF)而得到的。当OSTaskDelReq()返回给调用者OS_TASK_DEL_REQ[L4.13(1)]时,则表明已经有另外的任务请求该任务被删除了。在这种情况下,被删除的任务会释放它所拥有的所用资源[L4.13(2)],并且调用OSTaskDel(OS_PRIO_SELF)来删除自己[L4.13(3)]。前面曾提到过,任务的代码没有被真正的删除,而只是μC/OS-Ⅱ不再理会该任务代码,换句话说,就是任务的代码不会再运行了。 但是,用户可以通过调用OSTaskCreate()或OSTaskCreateExt()函数重新建立该任务。OSTaskDelReq()的代码如程序清单L4.14所示。通常OSTaskDelReq()需要检查临界条件。首先,如果正在删除的任务是空闲任务,OSTaskDelReq()会报错并返回[L4.14(1)]。接着,它要保证调用者请求删除的任务的优先级是有效的[L4.14(2)]。如果调用者就是被删除任务本身,存储在OS_TCB中的标志将会作为返回值[L4.14(3)]。如果用户用优先级而不是OS_PRIO_SELF指定任务,并且任务是存在的[L4.14(4)],OSTaskDelReq()就会设置任务的内部标志[L4.14(5)]。如果任务不存在,OSTaskDelReq()则会返回OS_TASK_NOT_EXIST,表明任务可能已经删除自己了[L4.14(6)]。 程序清单 L4.14 OSTaskDelReq(). INT8UOSTaskDelReq(INT8Uprio) { BOOLEANstat; INT8Uerr; OS_TCB*ptcb; if(prio==OS_IDLE_PRIO){(1) return(OS_TASK_DEL_IDLE); } if(prio>=OS_LOWEST_PRIOprio!=OS_PRIO_SELF){ (2) return(OS_PRIO_INVALID); } if(prio==OS_PRIO_SELF){(3) OS_ENTER_CRITICAL(); stat=OSTCBCur->OSTCBDelReq; OS_EXIT_CRITICAL(); return(stat); } else{ OS_ENTER_CRITICAL(); if((ptcb=OSTCBPrioTbl[prio])!=(OS_TCB*)0){(4) ptcb->OSTCBDelReq=OS_TASK_DEL_REQ;(5) err=OS_NO_ERR; }else{ err=OS_TASK_NOT_EXIST;(6) } OS_EXIT_CRITICAL(); return(err); } } 4.6改变任务的优先级,OSTaskChangePrio() 在用户建立任务的时候会分配给任务一个优先级。在程序运行期间,用户可以通过调用OSTaskChangePrio()来改变任务的优先级。换句话说,就是μC/OS-Ⅱ允许用户动态的改变任务的优先级。 OSTaskChangePrio()的代码如程序清单L4.15所示。用户不能改变空闲任务的优先级[L4.15(1)],但用户可以改变调用本函数的任务或者其它任务的优先级。为了改变调用本函数的任务的优先级,用户可以指定该任务当前的优先级或OS_PRIO_SELF, OSTaskChangePrio()会决定该任务的优先级。用户还必须指定任务的新(即想要的)优先级。因为μC/OS-Ⅱ不允许多个任务具有相同的优先级,所以OSTaskChangePrio()需要检验新优先级是否是合法的(即不存在具有新优先级的任务)[L4.15(2)]。如果新优先级是合法的,μC/OS-Ⅱ通过将某些东西储存到OSTCBPrioTbl[newprio]中保留这个优先级[L4.15(3)]。如此就使得OSTaskChangePrio()可以重
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)
