?? 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 + -