删除任务所有相关量,进入休眠

[TOC]

一、简介

把任务所在的各个可以调用的列表都删除,使任务不能在被调用,进而进入休眠状态

二、设置删除有关函数以及变量

  1. 任务宏定义:无其他宏定义,仅仅一个删除函数
  2. 编写调度函数
1
2
3
4
5
6
OSTaskDel
(
OS_TCB *tcb
OS_ERR *err
)
//(任务删除函数)
  • 创建临界段调用参数
1
CPU_SR_ALLOC();
  • 判断不能为空闲任务TCB
1
2
3
4
5
6
/* 不允许删除空闲任务 */
if (p_tcb == &OSIdleTaskTCB)
{
*p_err = OS_ERR_TASK_DEL_IDLE;
return;
}
  • 判断传入TCB==0?(等于0,则令TCB=OSTCBCurPtr)
1
2
3
4
5
6
7
/* 删除自己 */
if (p_tcb == (OS_TCB *)0)
{
CPU_CRITICAL_ENTER();
p_tcb = OSTCBCurPtr;
CPU_CRITICAL_EXIT();
}
  • 进入临界段
  • 判断传入TCB的状态(switch判断)根据任务状态,把任务移除出对应的列表,延时、移除时基,就绪、移出就绪等等,等待、移出等待列表
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/* 根据任务的状态来决定删除的动作 */
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;
}
  • 初始化已删除任务值为默认值
1
OS_TaskInitTCB(p_tcb);
  • 修改任务状态为删除态
1
2
/* 修改任务的状态为删除态,即处于休眠 */
p_tcb->TaskState = (OS_STATE)OS_TASK_STATE_DEL;
  • 退出临界段
  • 任务切换(任务状态改变后都要进行任务切换)

    三、调用流程

  1. 调用 - 在任务中直接根据需求使用
1
OSTaskDle(&Task1_TCB,&err);