ucos II任务管理之三:删除任务
2015-07-12 13:47
381 查看
ucos ii 强制删除任务和请求删除任务有何区别?
强制删除任务就是未告知被删除任务的情况下将删除,这种情况下,倘若被删除任务之前有做malloc、写文件等操作时可能导致不可预知的错误;而请求删除任务则可让待删除任务可以从容进行收尾工作后删除自己。ucos II任务管理之三:删除任务
有了前面的经历之后,mcu21决定全面地学习了任务的管理。这样在项目编程中才能做到“信手拈来”。
在ucos II 里,创建一个任务之后,可以对任务执行以下几种操作
1. 删除任务 OSTaskDel()
2. 挂起任务 OSTaskSuspend()
3. 恢复任务 OSTaskResume()
4. 改变任务的优先级 OSTaskChangePrio()
5. 提取任务信息 OSTaskQuery()
今天来学习下删除任务。
删除任务,是说任务将返回并处于休眠状态,任务的代码不再被μC/OS-Ⅱ调用。
删除任务不是删除任务的代码。
乍看起来,删除任务和挂起任务是有些相似的。其实有着本质的区别,根本来说,我觉得最大的不同就是删除任务有对任务控制块的操作。我们知道在任务创建的时候,需要给每一个任务分配一个任务控制块,这个任务控制块存储着关于这个任务重要的信息。对任务间切换起着至关重要的作用。
挂起任务根本来说不会动任务控制块,但删除任务就会把任务控制块从OSTCBList链表中移到OSTCBFreeList。
下面详细理解下任务删除的实现过程。
INT8U OSTaskDel (INT8U prio) |
{ |
OS_TCB *ptcb; |
OS_EVENT *pevent; |
if (prio == OS_IDLE_PRIO) { (1) |
return (OS_TASK_DEL_IDLE); |
} |
if (prio >= OS_LOWEST_PRIO && prio != OS_PRIO_SELF) { (2) |
return (OS_PRIO_INVALID); |
} |
OS_ENTER_CRITICAL(); |
if (OSIntNesting > 0) { (3) |
OS_EXIT_CRITICAL(); |
return (OS_TASK_DEL_ISR); |
} |
if (prio == OS_PRIO_SELF) { (4) |
Prio = OSTCBCur->OSTCBPrio; |
} |
if ((ptcb = OSTCBPrioTbl[prio]) != (OS_TCB *)0) { (5) |
if ((OSRdyTbl[ptcb->OSTCBY] &= ~ptcb->OSTCBBitX) == 0) { (6) |
OSRdyGrp &= ~ptcb->OSTCBBitY; |
} |
if ((pevent = ptcb->OSTCBEventPtr) != (OS_EVENT *)0) { (7) |
if ((pevent->OSEventTbl[ptcb->OSTCBY] &= ~ptcb->OSTCBBitX) == 0) { |
pevent->OSEventGrp &= ~ptcb->OSTCBBitY; |
} |
} |
Ptcb->OSTCBDly = 0; (8) |
Ptcb->OSTCBStat = OS_STAT_RDY; (9) |
OSLockNesting++; (10) |
OS_EXIT_CRITICAL(); (11) |
OSDummy(); (12) |
OS_ENTER_CRITICAL(); |
OSLockNesting--; (13) |
OSTaskDelHook(ptcb); (14) |
OSTaskCtr--; |
OSTCBPrioTbl[prio] = (OS_TCB *)0; (15) |
if (ptcb->OSTCBPrev == (OS_TCB *)0) { (16) |
ptcb->OSTCBNext->OSTCBPrev = (OS_TCB *)0; |
OSTCBList = ptcb->OSTCBNext; |
} else { |
ptcb->OSTCBPrev->OSTCBNext = ptcb->OSTCBNext; |
ptcb->OSTCBNext->OSTCBPrev = ptcb->OSTCBPrev; |
} |
ptcb->OSTCBNext = OSTCBFreeList; (17) |
OSTCBFreeList = ptcb; |
OS_EXIT_CRITICAL(); |
OSSched(); (18) |
return (OS_NO_ERR); |
} else { |
OS_EXIT_CRITICAL(); |
return (OS_TASK_DEL_ERR); |
} |
} |
整个过程大致如下:
1. 把要删除的任务移除就绪表
2. 把要删除的任务移除等待表
3. 避免其它任务或ISR调用OSTaskResume()
4. 阻止任务调度,以防止任务删除过程中切换到其它的任务
以上都是前戏,接下来才是高潮了,你懂的。
5. 减少μCOS-Ⅱ的任务计数器。简单地将指向被删除的任务的OS_TCB的指针指向NULL,从而达到将OS_TCB从优先级表中移除的目的。
6. 将被删除的任务的OS_TCB从OS_TCB双向链表中移除
版权声明:本文为博主原创文章,未经博主允许不得转载。
相关文章推荐
- 通信网络卫星国际会议
- 循环首次适应算法
- jquery.autocomplete.js 文本框自动填充 类似百度搜索引擎效果
- netstat和telnet命令在Windows7中的用法(转载)
- 【NHibernate】配置- sql打印
- [Android] 修改设备访问权限
- 异步任务
- NGUI ——UILabel复制粘贴
- MySQL集群节点、节点组、数据副本、以及分区
- 单词统计
- jquery 判断是否是android或者iOS系统
- 单词统计
- jquery MP3播放器
- 11.Java5的线程锁技术
- [黑马程序员]——Java接口Interface
- 为什么r.java文件中没有button的id
- How use Instruments and display the console in Command Lines applications
- 关于 rman duplicate from active database 搭建dataguard--系列一
- ContextMenu(上下文菜单)
- android显示Sdcardde的大图片