OSTaskDel 的分析
来源:互联网 发布:教学大数据实验室 编辑:程序博客网 时间:2024/05/19 18:16
OSTaskDel 的分析
INT8U OSTaskDel (INT8U prio);
功能描述:
删除一个任务。任务可以删除其自身,通过传递他自己的
优先级号,如果不知道优先级号,则可以传递 OS_PRIO_SELF。
被删除任务将返回到静止状态,并且通过再次创建此任务可以使
其重新激活。
参数说明:
prio
任务的优先级号
返回值:
OS_NO_ERR – 如果调用成功
OS_TASK_DEL_IDLE – 如果试图删除一个 uC/OS-II 的空闲任务
OS_PRIO_INVALID – 如果指定的优先级大于最大允许的
优先级(i.e. >= OS_LOWEST_PRIO),或者没有指定OS_PRIO_SELF
OS_TASK_DEL_ERR – 如果要删除的任务不存在
OS_TASK_DEL_ISR – 如果试图从一个 ISR.中删除任务
源代码:
INT8U OSTaskDel (INT8U prio)
{
#if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
OS_CPU_SR cpu_sr;
#endif
#if OS_EVENT_EN > 0
OS_EVENT *pevent;
#endif
#if (OS_VERSION >= 251) && (OS_FLAG_EN > 0) && (OS_MAX_FLAGS > 0)
OS_FLAG_NODE *pnode;
#endif
OS_TCB *ptcb;
BOOLEAN self;
if (OSIntNesting > 0) { /* See if trying to delete from ISR */
return (OS_TASK_DEL_ISR);
}
#if OS_ARG_CHK_EN > 0
if (prio == OS_IDLE_PRIO) { /* Not allowed to delete idle task */
return (OS_TASK_DEL_IDLE);
}
if (prio >= OS_LOWEST_PRIO && prio != OS_PRIO_SELF) { /* Task priority valid ? */
return (OS_PRIO_INVALID);
}
#endif
OS_ENTER_CRITICAL();
if (prio == OS_PRIO_SELF) { /* See if requesting to delete self */
prio = OSTCBCur->OSTCBPrio; /* Set priority to delete to current */
}
ptcb = OSTCBPrioTbl[prio];
if (ptcb != (OS_TCB *)0) { /* Task to delete must exist */
if ((OSRdyTbl[ptcb->OSTCBY] &= ~ptcb->OSTCBBitX) == 0x00) { /* Make task not ready */
OSRdyGrp &= ~ptcb->OSTCBBitY;
}
#if OS_EVENT_EN > 0
pevent = ptcb->OSTCBEventPtr;
if (pevent != (OS_EVENT *)0) { /* If task is waiting on event */
if ((pevent->OSEventTbl[ptcb->OSTCBY] &= ~ptcb->OSTCBBitX) == 0) { /* ... remove task from */
pevent->OSEventGrp &= ~ptcb->OSTCBBitY; /* ... event ctrl block */
}
}
#endif
#if (OS_VERSION >= 251) && (OS_FLAG_EN > 0) && (OS_MAX_FLAGS > 0)
pnode = ptcb->OSTCBFlagNode;
if (pnode != (OS_FLAG_NODE *)0) { /* If task is waiting on event flag */
OS_FlagUnlink(pnode); /* Remove from wait list */
}
#endif
ptcb->OSTCBDly = 0; /* Prevent OSTimeTick() from updating */
ptcb->OSTCBStat = OS_STAT_RDY; /* Prevent task from being resumed */
if (OSLockNesting < 255) {
OSLockNesting++;
}
OS_EXIT_CRITICAL(); /* Enabling INT. ignores next instruc. */
OS_Dummy(); /* ... Dummy ensures that INTs will be */
OS_ENTER_CRITICAL(); /* ... disabled HERE! */
if (OSLockNesting > 0) {
OSLockNesting--;
}
OSTaskDelHook(ptcb); /* Call user defined hook */
OSTaskCtr--; /* One less task being managed */
OSTCBPrioTbl[prio] = (OS_TCB *)0; /* Clear old priority entry */
if (ptcb->OSTCBPrev == (OS_TCB *)0) { /* Remove from TCB chain */
ptcb->OSTCBNext->OSTCBPrev = (OS_TCB *)0;
OSTCBList = ptcb->OSTCBNext;
} else {
ptcb->OSTCBPrev->OSTCBNext = ptcb->OSTCBNext;
ptcb->OSTCBNext->OSTCBPrev = ptcb->OSTCBPrev;
}
ptcb->OSTCBNext = OSTCBFreeList; /* Return TCB to free TCB list */
OSTCBFreeList = ptcb;
OS_EXIT_CRITICAL();
OS_Sched(); /* Find new highest priority task */
return (OS_NO_ERR);
}
OS_EXIT_CRITICAL();
return (OS_TASK_DEL_ERR);
- OSTaskDel 的分析
- OSTaskDel 的分析
- 删除任务,OSTaskDel()
- ucos-ii 之OSTaskDel函数
- μC/OS之OSTaskDel()
- OSTaskDel之ucos系统学习
- μC/OS之OSTaskDel()
- ucos中OSTaskDel不能删除自己
- core 分析的分析
- 数据分析的重要性分析
- IDS的技术分析和需求分析
- 基本面分析与技术分析的关系
- spring源代码分析(1)--Resource的分析
- 领域分析&需求分析之间的区别
- nand_flash驱动的分析(框架分析)
- uboot的编译过程分析---Makefile分析
- 分析分析几个问答网站的特色
- 位置分析:商业分析的下一个热点
- 发放
- c#创建水晶报表
- 光标回车搜索
- JSTL(JSP Standard Tag Library ,JSP标准标签库)
- Flex 时间控件(一)
- OSTaskDel 的分析
- EBS 常用表
- Linux-ulimit-系统资源限制
- cookie session
- 样式(css)限制字符串长度,自动截取
- Android调用系统自带软件
- Flex 时间控件(二)
- 隐藏 显示控件
- java web中的MVC