曲径通幽论坛
标题:
OSTaskDelReq()
[打印本页]
作者:
beyes
时间:
2009-4-14 01:46
标题:
OSTaskDelReq()
一、发出删除任务请求的任务和打算被时删除的任务都必须调用 OSTaskDelReq() 函数
请求删除其他任务的任务,设为 Task-1;要被删除的任务,设为 Task-2
Task-1 确定要删除 Task-2,那么Tak-1 发出删除请求:OSTaskDelReq( TASK_TO_DEL_PRIO),其中 TASK_TO_DEL_PRIO 是 Task-2 的优先级号,假设优先级号在正常范围内,Task-2 确实已经建立。
那么,这样一来,OS_TASK_DEL_REQ 标志就会被存往 Task-2 的 TCB 中,代码见 OSTaskDelReq() 中的:
if
(ptcb != (OS_TCB *)0)
{
ptcb->OSTCBDelReq = OS_TASK_DEL_REQ;
/* 存删除请求标志*/
err = OS_NO_ERR;
}
当 OSTaskDelReq() 返回时,带回的返回值是 OS_NO_ERR。表明请求已经被接受,但 TASK-2 还没被删除,所以 TASK-1 选择等待。
--------------------------
当轮到 TASK-2 开始执行时,它也会调用 OSTaskDelReq( OS_PRIO_SELF ) 检查自身。这时,在OSTaskDelReq() 的 if( prio == OS_PRIO_SELF ) 程序块中,从自己的 TCB中得到了之前所存的标志:OS_TASK_DEL_REQ。这样,TASK-2 已经确认了自己要被别的任务删除了,所以接下来它就释放所占用的资源还有释放所有的动态内存。完后,调用 OSTaskDel( OS_PRIO_SELF )删除自身。
至此,假设 TASK-2 在删除自身后,并没有更高的优先级任务出现,依然是 TASK-1 在执行。记得 TASK-1在发送删除请求时,是在一直循环等待着的,它等待的是一个叫做 OS_TASK_NOT_EXIT的标志。所以,当再一次调用OSTaskDelReq() 时,由于OSTaskDelReq() 中的 if( ptcb != (OS_TCB*)0) 不成立( ptcb == (OS_TCB *)0 ),则理所当然的得到 OS_TASK_NOT_EXIT这个标志。至此,TASK-1 成功完成了删除 TASK-2 的任务。
另外,如果没有任何任务发出请求要删除 TASK-2,而 TASK-2 只是在检查自身是否要被删除时,它得不到 OS_TASK_DEL_REQ 这个标志,那么就只能继续执行自己的代码。
-----------------------------------------------
OSTASKDelReq() 的代码见下:
#if
OS_TASK_DEL_EN > 0
INT8U OSTaskDelReq (INT8U prio)
{
#if
OS_CRITICAL_METHOD == 3
OS_CPU_SR cpu_sr;
#endif
BOOLEAN stat;
INT8U err;
OS_TCB *ptcb;
#if
OS_ARG_CHK_EN > 0
if
(prio == OS_IDLE_PRIO) { /*不允许删除空闲任务*/
return (OS_TASK_DEL_IDLE);
}
if
(prio >= OS_LOWEST_PRIO && prio != OS_PRIO_SELF) {
/* 任务优先级合法?*/
return
(OS_PRIO_INVALID);
}
#endif
if
(prio == OS_PRIO_SELF) {
/* See if a task is requesting to ... */
OS_ENTER_CRITICAL();
/* ... this task to delete itself */
stat = OSTCBCur->OSTCBDelReq;
/* Return request status to caller */
OS_EXIT_CRITICAL();
return (stat);
}
OS_ENTER_CRITICAL();
ptcb = OSTCBPrioTbl[prio];
if
(ptcb != (OS_TCB *)0) {
/* Task to delete must exist */
ptcb->OSTCBDelReq = OS_TASK_DEL_REQ; /
* Set flag indicating task to be DEL. */
err = OS_NO_ERR;
}
else
{
err = OS_TASK_NOT_EXIST;
/* Task must be deleted */
}
OS_EXIT_CRITICAL();
return
(err);
}
#endif
欢迎光临 曲径通幽论坛 (http://www.groad.net/bbs/)
Powered by Discuz! X3.2