uCOS-Ⅲ学习笔记: 任务删除
任务删除原理
简介
把任务所在的各个可以调用的列表都删除,使任务不能在被调用,进而进入休眠状态
设置挂起删除有关函数以及变量
- 任务宏定义:无其他宏定义,仅仅一个删除函数
- 编写调度函数
OSTaskDel
(
OS_TCB *tcb
OS_ERR *err
)
//(任务删除函数)
- 创建临界段调用参数
CPU_SR_ALLOC();
- 判断不能为空闲任务TCB
/* 不允许删除空闲任务 */
if (p_tcb == &OSIdleTaskTCB)
{
*p_err = OS_ERR_TASK_DEL_IDLE;
return;
}
- 判断传入TCB==0?(等于0,则令TCB=OSTCBCurPtr)
/* 删除自己 */
if (p_tcb == (OS_TCB *)0)
{
CPU_CRITICAL_ENTER();
p_tcb = OSTCBCurPtr;
CPU_CRITICAL_EXIT();
}
- 进入临界段
- 判断传入TCB的状态(switch判断)根据任务状态,把任务移除出对应的列表,延时、移除时基,就绪、移出就绪等等,等待、移出等待列表
/* 根据任务的状态来决定删除的动作 */
switch (p_tcb->TaskState)
{
case OS_TASK_STATE_RDY:
OS_RdyListRemove(p_tcb);
break;
case OS_TASK_STATE_SUSPENDED:
break;
/* 任务只是在延时,并没有在任何等待列表*/
case OS_TASK_STATE_DLY:
case OS_TASK_STATE_DLY_SUSPENDED:
OS_TickListRemove(p_tcb);
break;
case OS_TASK_STATE_PEND:
case OS_TASK_STATE_PEND_SUSPENDED:
case OS_TASK_STATE_PEND_TIMEOUT:
case OS_TASK_STATE_PEND_TIMEOUT_SUSPENDED:
OS_TickListRemove(p_tcb);
*p_err = OS_ERR_STATE_INVALID;
return;
}
- 初始化已删除任务值为默认值
OS_TaskInitTCB(p_tcb);
- 修改任务状态为删除态
/* 修改任务的状态为删除态,即处于休眠 */
p_tcb->TaskState = (OS_STATE)OS_TASK_STATE_DEL;
- 退出临界段
- 任务切换(任务状态改变后都要进行任务切换)
调用流程
- 调用 - 在任务中直接根据需求使用
OSTaskDle(&Task1_TCB,&err);