uCOS II 删除任务

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

任务的删除(删除任务请求方,被删除任务方)所谓删除任务,就是把任务置于睡眠状态。具体做法是,把被删除的任务

的任务控制块从任务控制块链表中删除,并归还给空任务控制块链表。(创建一个任务就像向空任务控制链表借东西。但是有借必有还,删除任务就是用完以后归还给空任务链表的过程),然后在任务就绪表中把该任务的就绪状态位置为0,于是该任务就不能再被调度器所调用了。简单的说,就是把他的身份证给吊销了。

#if OS_TASK_DEL_EN

INT8U OSTaskDel(INT8U prio); //要删除任务的优先级别这与任务的挂起相似,可以调用函数OSTaskDel()来删除任务自身或者除了空闲任务之外的其他任务。如果一个任务要删除自己,则应调用函数时函数参数prio为OS_PRIO_SELF。

核心讨论的问题

问题的提出:

有时,任务会占用一些动态分配的内存或是信号量之类的资源。这时,如果有其他任务把这个任务删除了,那么被删除任务所占用的一些资源就会因为没有被释放而丢失,这时任何系统都无法接受的。

这就像在C语言中用malloc申请的对空间,在释放之前不能让子函数没了,否则永远就找不到申请的这段空间了。

解决方案:

提出删除任务请求的任务只能负责提出删除任务的请求,而删除工作要有被删除任务自己来完成。这样,被删除的任务就可以根据自身的具体情况来决定何时删除任务自身,同时也会有机会再删除自身之前把占用的资源给释放掉。

显然如果想使提出删除任务请求的任务和被删除任务之间能够像上述方式来执行删除工作,则他们必须有某种通信方法。ucos利用被删除任务的任务控制块成员OSTCBDelReq作为请求删除方与被删除方的联络信号,同时提供了一个双方都能调用的函数-----请求删除任务函数OSTaskDelReq()。这样提出删除任务请求的任务和被删除任务的双方都能使用这个函数来访问OSTCBDelReq这个信号,从而可以根据这个信号状态来决定各自的行为

过程是这样的。就像两个人A和B。A对B调用函数OSTaskDelReq ()说我要删除你。然后将Flag(OSTCBDelReq)置给一个标志位。B通过函数OSTaskDelReq()看到Flag(OSTCBDelReq)置位,然后就启动自己删除自己的命令。

提出删除任务请求的任务在调用OSTaskDel()这个函数时,函数的参数应该为被删除任务的优先别prio;被删除任务在调用这个函数时,函数的参数应该为OS_PRIO_SELF。再一次强调了最终的删除操作是被删除函数自己删除自己

从程序的流程图可以看出,删除任务请求方要用被删除任务的优先级别prio 作为参数来调用这个函数。删除任务请求方调用这个函数的目的就是要查看被删除的任务控制块是否还在。如果还在,则令被删除任务的任务控制块成员OSTCBDelReq的值为OS_TASK_DEL_REQ且通知该任务“已经有任务要求你在合适的时候要删除自己”,如果不在,则认为被删除任务已经被删除了

一个应用实例

Task1要删除Task2

void Task1(void *pdata)

{

。。。。。。。。。。

while(OSTaskDelReq(44) != OS_TASK_NOT_EXIST)

{

OSTimeDly(1); //延时一个时钟节拍

}

。。。。。。。。。。。

}

即不断地调用函数(OSTaskDelReq()来查询优先级别为44的任务是否还存在,就调用延时函数OSTimeDly()等待,直到发现被删除任务已经不存在了(被删除了)才继续运行

void Task2(void *pdata)

{

......................

if(OSTaskDelReq(OS_PRIO_SELF) == OS_TASK_DEL_REQ)

{

//释放资源和动态内存代码

OSTaskDel(OS_PRIO_SELF);

}

else{

//其他应用代码

}

..........................

}

被删除方一定要用OS_PRIO_SELF作为参数来调用OSTaskDelReq()函数。当函数判断出参数是

OS_PRIO_SELF时,将会返回任务TCB的域OSTCBDelReq的值。如果该值为OS_TASK_DEL_REQ,就意味

着有其他任务发出了删除任务的请求,那么被删除任务就应该在适当的时候调用函数OSTaskDel(OS_PRIO_SELF);删除自己

相关文档
最新文档