- 简述:
- 一个任务被删除后就进入休眠态,要想继续运行必须重新创建
- 被删除任务的TCB从任务控制块链表中删除,并归还给空任务控制块链表
- 在就绪列表中把该任务的就绪状态置为0,该任务就不能被调度器所调用
- 例程
- 任务删除OSTaskDel();
/********************************************************* * 函数名: void OS_TaskDel(OS_TCB *p_tcb, OS_ERR *p_err); * 描述 :任务删除 * 输入 :无 * 输出 :无 * 返回 :无 * 调用 :内部调用 **********************************************************/ #if OS_CFG_TASK_DEL_EN > 0u void OS_TaskDel(OS_TCB *p_tcb, OS_ERR *p_err) { CPU_SR_ALLOC(); //不允许删除空闲任务 if(p_tcb == &OSIdleTaskTCB) { *p_err = OS_ERR_TASK_DEL_IDLE; return; } //删除自己 if(p_tcb == (OS_TCB *)0) { CPU_CRITICAL_ENTER(); p_tcb = OSTCBCurPtr; CPU_CRITICAL_EXIT(); } OS_CRITICAL_ENTER(); //根据任务的状态来决定删除的动作 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); default: OS_CRITICAL_EXIT(); *p_err = OS_ERR_STATE_INVALID; return; } //初始化TCB为默认值 OS_TaskInitTCB(p_tcb); //修改任务的状态为删除状态,即处于休眠 p_tcb->TaskState = (OS_STATE)OS_TASK_STATE_DEL; OS_CRITICAL_EXIT_NO_SCHED(); //任务切换,寻找最高优先级的任务 OSSched(); *p_err = OS_ERR_NONE; } #endif
- 任务删除OSTaskDel();
- 总结
- 提出删除任务请求
- 由删除任务自己完成相应操作
【21】从0到1教你写uC/OS-III————>任务删除
最新推荐文章于 2023-10-03 21:23:50 发布