uCOS-Ⅲ学习笔记: 任务删除

简介

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

设置挂起删除有关函数以及变量

  1. 任务宏定义:无其他宏定义,仅仅一个删除函数
  2. 编写调度函数
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;      
  • 退出临界段
  • 任务切换(任务状态改变后都要进行任务切换)

调用流程

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

猜你喜欢

转载自blog.csdn.net/qq_45396672/article/details/110099310
今日推荐