?? os_msg.c
字號:
}
if (Tcb != NULL)
{
OS_ENTER_CRITICAL();
while (Tcb != NULL)
{
Tcb = Tcb->MsgNext;
Rt++;
}
OS_EXIT_CRITICAL();
}
return Rt;
}
#endif
/*********************************************************************************************************
** 函數名稱: OSMsgFlush
** 功能描述: 清空指定任務的消息
** 輸 入: TaskId:任務ID
** 輸 出: 無
** 作 者: 陳明計
** 日 期: 2005年6月10日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#if EN_OS_MSG > 0
void OSMsgFlush (TASK_ID TaskId)
{
OS_TCB *Tcb1,*Tcb2;
Tcb1 = NULL;
Tcb2 = NULL;
if (TaskId == OS_ID_SELF)
{
Tcb2 = OSTCBCur;
}
if (TaskId < OS_MAX_TASKS)
{
Tcb2 = &(OSTCBTbl[TaskId]);
}
if (Tcb2 != NULL) /* 任務有效 */
{
OS_ENTER_CRITICAL();
Tcb1 = Tcb2->MsgHard;
Tcb2->MsgHard = NULL;
Tcb2->MsgEnd = NULL;
while (Tcb1 != NULL)
{
/* 從鏈表中刪除 */
Tcb2 = Tcb1;
Tcb1 = Tcb1->MsgNext;
Tcb2->MsgNext = NULL;
Tcb2->MsgPrev = NULL;
Tcb2->OSTCBInfo |= OS_INFO_MSG_SENGED;
/* 虛擬接收消息 */
if ((Tcb2->OSTCBStat & OS_STAT_MSG_SENGED) != 0)
{
Tcb2->OSTCBStat = 0;
_OS_TaskResume(Tcb2);
}
}
}
OSSched();
OS_EXIT_CRITICAL();
}
#endif
/*********************************************************************************************************
** 函數名稱: OSMsgDel
** 功能描述: 刪除指定消息
** 輸 入: TaskId:發送消息的任務ID
** 輸 出: OS_NO_ERR:成功
** OS_TASKID_INVALID:目標任務不存在
** 作 者: 陳明計
** 日 期: 2005年6月10日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#if EN_OS_MSG > 0
uint8 OSMsgDel (TASK_ID TaskId)
{
OS_TCB *Tcb;
uint8 Rt;
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();
/* 從鏈表中刪除 */
Tcb->OSTCBInfo |= OS_INFO_MSG_SENGED;
if (Tcb->MsgNext != NULL)
{
Tcb->MsgNext->MsgPrev = Tcb->MsgPrev;
}
if (Tcb->MsgPrev != NULL)
{
Tcb->MsgPrev->MsgNext = Tcb->MsgNext;
}
Tcb->MsgNext = NULL;
Tcb->MsgPrev = NULL;
Rt = OS_NO_ERR;
OSSched(); /* 任務切換 */
OS_EXIT_CRITICAL();
}
return Rt;
}
#endif
/*********************************************************************************************************
** 函數名稱: OSMsgSended
** 功能描述: 等待消息發送完畢
** 輸 入: Tick:超時時間
** 輸 出: OS_NO_ERR:成功
** OS_ERR_PEND_ISR:在IRS中等待事件
** OS_TIMEOUT:超時
** 作 者: 陳明計
** 日 期: 2005年6月10日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#if EN_OS_MSG_SENDED > 0
uint8 OSMsgSended (uint16 Tick)
{
uint8 Rt;
if (OSIntNesting != 0)
{
return OS_ERR_PEND_ISR;
}
OS_ENTER_CRITICAL();
if ((OSTCBCur->OSTCBInfo & OS_INFO_MSG_SENGED) == 0) /* 消息沒有發送完畢 */
{
OSTCBCur->OSTCBStat |= OS_STAT_MSG_SENGED;
if (Tick > 0)
{
OS_TimeDly(Tick); /* 超時設置 */
}
else
{
_OS_TaskSuspend(OSTCBCur); /* 從優先級鏈表中刪除 */
}
OSSched();
}
if ((OSTCBCur->OSTCBInfo & OS_INFO_MSG_SENGED) != 0) /* 消息發送完畢 */
{
OSTCBCur->OSTCBInfo |= OS_INFO_MSG_SENGED;
Rt = OS_NO_ERR;
}
else
{
Rt = OS_TIMEOUT;
}
OS_EXIT_CRITICAL();
return Rt;
}
#endif
/*********************************************************************************************************
** 函數名稱: OSMsgBackAccept
** 功能描述: 無等待獲得消息反饋
** 輸 入: err:返回狀態
** OS_NO_ERR:成功
** OS_MSG_EMPTY:無消息
** 輸 出: 獲得的消息
** 作 者: 陳明計
** 日 期: 2005年6月10日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#if EN_OS_MSG_BACK_ACCEPT > 0
void * OSMsgBackAccept (uint8 *err)
{
void *Rt;
OS_ENTER_CRITICAL();
if ((OSTCBCur->OSTCBInfo & OS_INFO_MSG_BACK) != 0)
{
OSTCBCur->OSTCBInfo |= ~OS_INFO_MSG_BACK;
*err = OS_NO_ERR;
Rt = OSTCBCur->Msg;
}
else
{
*err = OS_MSG_EMPTY;
Rt = NULL;
}
OS_EXIT_CRITICAL();
return Rt;
}
#endif
/*********************************************************************************************************
** 函數名稱: OSMsgBackPend
** 功能描述: 獲得消息反饋
** 輸 入: Tick:超時時間
** err:返回狀態
** OS_NO_ERR:成功
** OS_ERR_PEND_ISR:在IRS中等待事件
** OS_TIMEOUT:超時
** 輸 出: 獲得的消息
** 作 者: 陳明計
** 日 期: 2005年6月10日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#if EN_OS_MSG_BACK_OPEND > 0
void * OSMsgBackPend (uint16 Tick, uint8 *err)
{
void *Rt;
if (OSIntNesting != 0)
{
*err = OS_ERR_PEND_ISR;
return NULL;
}
Rt = NULL;
OS_ENTER_CRITICAL();
if ((OSTCBCur->OSTCBInfo & OS_INFO_MSG_BACK) == 0)
{
OSTCBCur->OSTCBStat |= OS_STAT_MSG_BACK;
if (Tick > 0)
{
OS_TimeDly(Tick); /* 超時設置 */
}
else
{
_OS_TaskSuspend(OSTCBCur); /* 從優先級鏈表中刪除 */
}
OSSched();
}
if ((OSTCBCur->OSTCBInfo & OS_INFO_MSG_BACK) != 0)
{
OSTCBCur->OSTCBInfo &= ~OS_INFO_MSG_BACK;
*err = OS_NO_ERR;
Rt = OSTCBCur->Msg;
}
else
{
*err = OS_TIMEOUT;
Rt = NULL;
}
OS_EXIT_CRITICAL();
return Rt;
}
#endif
/*********************************************************************************************************
** 函數名稱: OSMsgBackPost
** 功能描述: 反饋消息
** 輸 入: TaskId:目的任務ID
** Msg:消息
** 輸 出: OS_NO_ERR:成功
** OS_TASKID_INVALID:目標任務不存在
** 作 者: 陳明計
** 日 期: 2005年6月10日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#if EN_OS_MSG_BACK_POST > 0
uint8 OSMsgBackPost (TASK_ID TaskId, void *Msg)
{
OS_TCB *Tcb;
uint8 Rt;
Rt = OS_TASKID_INVALID;
if (TaskId < OS_MAX_TASKS) /* 目標任務有效 */
if (TaskId != OSTCBCur->OSTCBId) /* 不是當前任務 */
{
Tcb = &(OSTCBTbl[TaskId]);
OS_ENTER_CRITICAL();
if (Tcb->OSTCBStat != OS_STAT_DEATH) /* 目標任務有效 */
if ((Tcb->OSTCBInfo & OS_INFO_MSG_SENGED) != 0) /* 消息已經發送完畢 */
{
/* 反饋消息 */
Tcb->OSTCBInfo |= OS_INFO_MSG_BACK;
Tcb->Msg = Msg;
Rt = OS_NO_ERR;
if ((Tcb->OSTCBStat & OS_STAT_MSG_BACK) != 0) /* 目標任務正在等待消息反饋 */
{
Tcb->OSTCBStat = 0;
_OS_TaskResume(Tcb);
OSSched();
}
}
OS_EXIT_CRITICAL();
}
return Rt;
}
#endif
#endif
/*********************************************************************************************************
** End Of File
********************************************************************************************************/
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -