曲径通幽论坛

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

实例:任务的请求删除和被删除

[复制链接]

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34387
跳转到指定楼层
楼主
发表于 2009-4-14 01:56:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
功能:任务A请求删除任务B,任务B然后删除自己
目的:熟悉OSTaskDelReq() 和 OSTasKDel() 函数的原理及使用
仍然利用“在任务中创建一个新任务”这里的代码,下面是附加代码:
1、在 DispCharM 中
INT8U time = 0;                                          /*全局变量*/

.....

void  DispCharM (void *pdata)                     /* 在 DispCharM 中请求删除 DispCharY */

{

  ........

  char* DelYTask = "MTask: YTask,you must delete youslef!";      /*提示信息*/

time += 1;
  PC_DispChar( x, y, *(char *)pdata, DISP_FGND_WHITE);

  if( time > 10 ){          /*运行10次然后发出删除 DispCharY 的请求*/

   if( OSTaskDelReq(1) != OS_TASK_NOT_EXIST ){        /*如果任务还没被删除则循环等待*/
    PC_DispStr( 10, 8, DelYTask, DISP_FGND_YELLOW + DISP_BGND_BLUE);
    OSTimeDly(1);            /*每次等待一个时钟周期,如果系统负荷较重,可以等待2个时钟周期*/
   }
  }

........

}
2、在 DispCharY 中
void DispCharY(void *pdata)

 .... .... ....
 char* s1 = "DispCharY: I have to delete myself now!";
 char* s2 = "DispCharY: I have been deleted myself!";        /*定义两条提示信息*/
if( OSTaskDelReq(OS_PRIO_SELF) == OS_TASK_DEL_REQ ){   /*哦,发现有别人请求删除我*/
   PC_DispStr(10,10,s1,DISP_FGND_WHITE + DISP_BGND_BLACK);
   PC_DispStr(10,12,s2,DISP_FGND_WHITE + DISP_BGND_BLACK);  /*显示提示信息*/
   OSTaskDel( OS_PRIO_SELF );           /*删除自己*/
 .... .... ....

  }
注意:这里只是简单的进行删除 DispCharY 自己;如果DispCharY 占用信号量以及相关的系统资源,那必须先释放这些资源后才可以将自身删除掉。
小结:OSTaskDelReq() 是需要在请求删除和被删除任务中同时使用的。在请求删除别人的任务中,一般的需要等待所请求删除的任务删除完成后方可继续往下运行。因为请求删除别人的目的正好是需要别人所占据的那些资源。
图示

如上图示,在DispCharY 任务被删除后,只有 DispCharM 在运行,即只显示M字母。假如再对M自身进行删除,那么将只剩下空闲任务和统计任务在运行。(youself写错了,应该是yourself:)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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