|
功能:任务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:) |
|