新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > uC/OS-II 学习笔记之:任务删除

uC/OS-II 学习笔记之:任务删除

作者:时间:2016-09-12来源:网络收藏

一、概念:任务的删除就是把任务由运行态或就绪态置于睡眠态,是任务创建的逆过程。

本文引用地址:http://www.eepw.com.cn/article/201609/303413.htm

二、操作:具体操作就是把将待删除的任务的任务控制块从任务控制链表中删除,并归还给空任务控制链表,

然后在任务就绪表中把该任务的就绪状态位置为0,这样任务就不会再被调度器调用了。

一般情况,为了安全起见,我们先在某个任务中提出删除任务的请求,然后再在将待删除任务中执行删除操作,

即由待删除任务自己删除自己,而提出删除任务请求的任务只负责提出请求。这样的好处是可以让待删除任务

在合适的时候删除自己,以利于在删除自身之前释放掉其占用的资源。

三、函数

(1)请求删除任务函数:OSTaskDelReq(prio)//prio为待删除任务的优先级别

(2)提出删除请求的任务在调用该函数时,具体使用如下:

//只有当待删除任务不存在了,就跳出循环

while (OSTaskDelReq(1) != OS_TASK_NOT_EXIST)

{

OSTimeDly(1);//延时一个时钟节拍

}

(3)待删除任务在调用该函数时,具体使用如下:

if (OSTaskDelReq(OS_PRIO_SELF) == OS_TASK_DEL_REQ)

{

OSTaskDel(OS_PRIO_SELF);//删除任务自身

}

四、典型应用

//调用删除任务函数的任务

//任务1,设优先级别为1

void TaskLed0(void *pdata)

{

while (1)

{

LED0 = !LED0;

OSTimeDlyHMSM(0, 0, 0, 400);

while (OSTaskDelReq(2) != OS_TASK_NOT_EXIST)

{

OSTimeDly(1);//延时一个时钟节拍

}

}

}

//被删除任务

//任务2,设优先级别为2

void TaskLed1(void *pdata)

{

while (1)

{

LED1 = !LED1;

OSTimeDlyHMSM(0, 0, 0, 400);

//判断是否有其它任务发出了删除自身的请求

if (OSTaskDelReq(OS_PRIO_SELF) == OS_TASK_DEL_REQ)

{

OSTaskDel(OS_PRIO_SELF);//删除任务自身

}

}

}

解析:这就是一个在任务1里提出删除任务2的请求,然后任务2删除自身的例子。

参: 任哲 《嵌入式实时操作系统-II原理及应用》

参: 卢有亮 《嵌入式实时操作系统原理与实践》



关键词: uC/OS

评论


相关推荐

技术专区

关闭