曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 7601|回复: 0
打印 上一主题 下一主题

OSTaskDelReq()

[复制链接]

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34387
跳转到指定楼层
楼主
发表于 2009-4-14 01:46:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一、发出删除任务请求的任务和打算被时删除的任务都必须调用 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
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2024-5-19 10:33 , Processed in 0.072873 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表