📄 os_task.c
字号:
}
else
{
_OS_TaskResume(Tcb);
OSSched();
Rt = OS_NO_ERR;
}
}
}
}
OS_EXIT_CRITICAL_TWO;
return Rt;
}
/*********************************************************************************************************
** 函数名称: OSTaskDel
** 功能描述: 删除任务
** 输 入: TaskID:任务ID
** 输 出: OS_NO_ERR:成功
** OS_TASKID_INVALID:错误的任务ID
** 作 者: 陈明计
** 日 期: 2005年6月10日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 OSTaskDel(TASK_ID TaskID)
{
OS_TCB *Tcb;
uint8 Rt;
if (OSIntNesting > 0)
{
return (OS_TASK_DEL_ISR);
}
Tcb = NULL;
if (TaskID == OS_ID_SELF)
{
Tcb = OSTCBCur;
}
if (TaskID < OS_MAX_TASKS)
{
Tcb = &(OSTCBTbl[TaskID]);
}
Rt = OS_TASKID_INVALID;
if (Tcb != NULL)
{
OS_ENTER_CRITICAL();
//Rt = OS_TASKID_INVALID;
if (Tcb->OSTCBStat != OS_STAT_DEATH)
{
#if EN_OS_MSG > 0
/* 在消息链表中删除此任务 */
OSMsgDel(TaskID);
OSMsgFlush(TaskID);
#endif
if ((Tcb->OSTCBStat & OS_STAT_DLY) != 0)
{
OS_TimeTickDel(Tcb);
}
#if OS_MAX_EVENTS > 0
/* 在等待事件链表中删除此任务 */
if (Tcb->EventPrev != NULL)
{
Tcb->EventPrev->EventNext = Tcb->EventNext;
}
if (Tcb->EventNext != NULL)
{
Tcb->EventNext->EventPrev = Tcb->EventPrev;
}
Tcb->EventPrev = NULL;
Tcb->EventNext = NULL;
#endif
/* 在任务链表中删除此任务 */
if (Tcb->TcbPrev != NULL)
{
Tcb->TcbPrev->TcbNext = Tcb->TcbNext;
}
if (Tcb->TcbNext != NULL)
{
Tcb->TcbNext->TcbPrev = Tcb->TcbPrev;
}
/* 加到空闲任务控制块链表中 */
Tcb->TcbPrev = NULL;
Tcb->TcbNext = NULL;
Tcb->OSTCBStat = OS_STAT_DEATH;
OSSched();
Rt = OS_NO_ERR;
}
OS_EXIT_CRITICAL();
}
return Rt;
}
/*********************************************************************************************************
** 函数名称: OSTaskResume
** 功能描述: 恢复任务
** 输 入: TaskID : 任务ID
** 输 出: OS_NO_ERR:成功
** OS_TASKID_INVALID:目标任务不存在
** 作 者: 陈明计
** 日 期: 2005年6月10日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 OSTaskResume(TASK_ID TaskID)
{
uint8 Rt;
OS_ENTER_CRITICAL();
Rt = OS_TaskResume(TaskID);
OSSched(); //开始任务切换
OS_EXIT_CRITICAL();
return Rt;
}
/*********************************************************************************************************
** 函数名称: OSTaskSuspend
** 功能描述: 使指定任务休眠
** 输 入: TaskID : 任务ID
** 输 出: OS_NO_ERR:成功
** OS_TASKID_INVALID:错误的任务ID
** 作 者: 陈明计
** 日 期: 2005年6月10日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 OSTaskSuspend(TASK_ID TaskID)
{
OS_TCB *Tcb;
uint8 Rt;
/* 获取任务TCB */
Tcb = NULL;
if (TaskID == OS_ID_SELF)
{
Tcb = OSTCBCur;
}
if (TaskID < OS_MAX_TASKS)
{
Tcb = &(OSTCBTbl[TaskID]);
}
Rt = OS_TASKID_INVALID;
if (Tcb != NULL) /* 任务TCB有效 */
{
OS_ENTER_CRITICAL();
if (Tcb->OSTCBStat != OS_STAT_DEATH) /* 任务存在 */
{
if ((Tcb->OSTCBStat & OS_STAT_SUSPEND) == 0)
{
Tcb->OSTCBStat |= OS_STAT_SUSPEND;
_OS_TaskSuspend(Tcb);
OSSched();
}
Rt = OS_NO_ERR;
}
OS_EXIT_CRITICAL();
}
return Rt;
}
/*********************************************************************************************************
** 函数名称: OSTaskChangePrio
** 功能描述: 改变任务优先级
** 输 入: TaskID : 任务ID
** 输 出: OS_NO_ERR:成功
** OS_TASKID_INVALID:错误的任务ID
** OS_PRIO_INVALID:错误的任务优先级
** 作 者: 陈明计
** 日 期: 2005年6月10日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 OSTaskChangePrio(TASK_ID TaskID, uint8 NewPrio)
{
OS_TCB *Tcb;
uint8 Rt;
if (NewPrio < OS_LOWEST_PRIO) /* 新优先级有效 */
{
/* 获取任务TCB */
Tcb = NULL;
if (TaskID == OS_ID_SELF)
{
Tcb = OSTCBCur;
}
if (TaskID < OS_MAX_TASKS)
{
Tcb = &(OSTCBTbl[TaskID]);
}
Rt = OS_TASKID_INVALID;
if (Tcb != NULL) /* TCB有效 */
{
OS_ENTER_CRITICAL();
if (Tcb->OSTCBStat != OS_STAT_DEATH) /* 任务存在 */
if (Tcb->OSTCBPrio != NewPrio)
{
Tcb->OSTCBPrio = NewPrio;
if (Tcb->OSTCBStat == 0) /* 任务处于就绪状态 */
{
_OS_TaskSuspend(Tcb);
_OS_TaskResume(Tcb);
OSSched();
}
Rt = OS_NO_ERR;
}
OS_EXIT_CRITICAL();
}
}
else
{
Rt = OS_PRIO_INVALID;
}
return Rt;
}
/*********************************************************************************************************
** End Of File
********************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -