|
在ucos启动的时候,先创建一个任务1,然后在任务里面再创建两个任务2和3。
任务1运行到指定条件,会分别请求删除2和3,在任务2和3里面,判断是否有任务请求删除自己,如果有就删除自己。
具体代码如下:
/////////////////////main.c
#include
void main(int argc, char *argv[])
{
OSInit();
OSTaskCreate(App_one,NULL,(OS_STK *)&AppStk_one[TASK_STK_SIZE-1],(INT8U)0);
OSStart(); /* Start multitasking */
}
/////////////////////app.c
//TASK_STK_SIZE值为128
OS_STK AppStk_one[TASK_STK_SIZE];
OS_STK AppStk_two[TASK_STK_SIZE];
OS_STK AppStk_three[TASK_STK_SIZE];
void App_one(void *p_arg)
{
INT32 counter = 0;
p_arg = p_arg;
OSTaskCreate(App_two,NULL,(OS_STK *)&AppStk_two[TASK_STK_SIZE-1],(INT8U)1);
OSTaskCreate(App_three,NULL,(OS_STK *)&AppStk_three[TASK_STK_SIZE-1],(INT8U)2);
while (TRUE)
{
OS_Printf("[%05d] Hello One!\n", counter++);
if(counter==10)
{
OSTaskDelReq(1);
}
if(counter==20)
{
OSTaskDelReq(2);
}
OSTimeDlyHMSM(0, 0, 1, 0);
}
}
void App_two(void *p_arg)
{
INT32 counter = 0;
p_arg = p_arg;
while (TRUE)
{
OS_Printf("[%05d] Hello Two!\n", counter++);
if(OS_TASK_DEL_REQ ==OSTaskDelReq(OS_PRIO_SELF))
{
OSTaskDel(OS_PRIO_SELF);
}
OSTimeDlyHMSM(0, 0, 1, 0);
}
}
void App_three(void *p_arg)
{
INT32 counter = 0;
p_arg = p_arg;
while (TRUE)
{
OS_Printf("[%05d] Hello Three!\n", counter++);
if(OS_TASK_DEL_REQ ==OSTaskDelReq(OS_PRIO_SELF))
{
OSTaskDel(OS_PRIO_SELF);
}
OSTimeDlyHMSM(0, 0, 1, 0);
}
}
在VC6下运行的结果如图所示:
结果分析:
当App_One函数里的counter的值自增为10的时候,请求App_two删除自己,当轮到App_two运行时,判断到有任务请求删除自己,就调用
OSTaskDel(OS_PRIO_SELF);函数删除自己,此时系统就此停住。
其实我在调试的时候,不管是以请求的方式,还是直接调用OSTaskDel来删除任务,只要传入的参数为OS_PRIO_SELF,都会出现同样的结果。如果是OSTaskDel(1)这样的方法,系统就会正常运行。
请问有人遇到过同样的问题吗,具体是什么原因造成这样的结果呢,谢谢!
|
|