?? os_msg.c
字號:
/*********************************************************************************************************
** Small RTOS
** The Real-Time Kernel
** (c) Copyright 2002-2003, chenmingji
** All Rights Reserved
** V1.50.0
**
**--------------文件信息--------------------------------------------------------------------------------
**文 件 名: OS_msg.c
**創(chuàng) 建 人: 陳明計(jì)
**最后修改日期: 2005年6月10日
**描 述: Small RTOS消息處理代碼(任務(wù)之間直接發(fā)送消息) (此消息也可稱其為消息郵箱)
**
**--------------歷史版本信息----------------------------------------------------------------------------
** 創(chuàng)建人: 陳明計(jì)
** 版 本: V1.00
** 日 期: 2005年6月10日
** 描 述: 基本完成全新的Small RTOS核
**
**------------------------------------------------------------------------------------------------------
** 修改人:
** 版 本:
** 日 期:
** 描 述:
**
**--------------當(dāng)前版本修訂------------------------------------------------------------------------------
** 修改人:
** 日 期:
** 描 述:
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#define IN_OS_MSG
#define IN_OS
#include "includes.h"
#if EN_OS_MSG > 0
/*********************************************************************************************************
** 函數(shù)名稱: OSMsgAccept
** 功能描述: 無等待獲取消息
** 輸 入: TaskId:用于返回發(fā)送消息的任務(wù)的任務(wù)ID
** err:錯誤狀態(tài)
** 輸 出: 指向消息的無類型指針
** 作 者: 陳明計(jì)
** 日 期: 2005年6月10日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#if EN_OS_MSG_ACCEPT > 0
void * OSMsgAccept(TASK_ID *TaskId, uint8 *err)
{
void *Rt;
OS_TCB *Tcb;
OS_CPU_SR cpu_sr = 0;
OS_ENTER_CRITICAL();
if ((OSTCBCur->OSTCBInfo & OS_INFO_MSG) != 0) /* 如果有消息 */
{
Tcb = OSTCBCur->MsgHard;
Rt = Tcb->Msg; /* 返回消息 */
*TaskId = Tcb->OSTCBId; /* 返回發(fā)送消息的任務(wù) */
/* 從隊(duì)列中刪除發(fā)送消息的任務(wù) */
OSTCBCur->MsgHard = Tcb->MsgNext;
Tcb->MsgNext = NULL;
Tcb->MsgPrev = NULL;
if (OSTCBCur->MsgHard == NULL)
{
OSTCBCur->MsgEnd = NULL;
}
*err = OS_NO_ERR;
Tcb->OSTCBInfo |= OS_INFO_MSG_SENGED; /* 指明發(fā)送消息的任務(wù)獲已經(jīng)發(fā)送了消息 */
/* 如果發(fā)送消息的任務(wù)在等待消息發(fā)送完畢,恢復(fù)它 */
if ((Tcb->OSTCBStat & OS_STAT_MSG_SENGED) != 0)
{
Tcb->OSTCBStat = 0;
_OS_TaskResume(Tcb);
OSSched();
}
}
else
{
*err = OS_MSG_EMPTY;
Rt = NULL;
}
if (OSTCBCur->MsgHard == NULL)
{
OSTCBCur->OSTCBInfo &= ~OS_INFO_MSG;
}
OS_EXIT_CRITICAL();
return Rt;
}
#endif
/*********************************************************************************************************
** 函數(shù)名稱: OSMsgPend
** 功能描述: 等待消息
** 輸 入: Tick:超時(shí)時(shí)間
** TaskId:用于返回發(fā)送消息的任務(wù)的任務(wù)ID
** err:錯誤狀態(tài)
** 輸 出: 指向消息的無類型指針
** 作 者: 陳明計(jì)
** 日 期: 2005年6月10日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#if EN_OS_MSG_PENT > 0
void * OSMsgPend(uint8 Tick, TASK_ID *TaskId, uint8 *err)
{
void *Rt;
OS_TCB *Tcb;
OS_CPU_SR cpu_sr = 0;
OS_ENTER_CRITICAL();
if ((OSTCBCur->OSTCBInfo & OS_INFO_MSG) == 0) /* 如果沒有消息 */
{
OSTCBCur->OSTCBStat |= OS_INFO_MSG;
if (Tick > 0)
{
OS_TimeDly(Tick); /* 超時(shí)設(shè)置 */
}
else
{
_OS_TaskSuspend(OSTCBCur); /* 從優(yōu)先級鏈表中刪除 */
}
OSSched();
}
/* 以下部分注釋參考OSMsgAccept */
if ((OSTCBCur->OSTCBInfo & OS_INFO_MSG) != 0) /* 如果有消息 */
{
Tcb = OSTCBCur->MsgHard; /* 指向發(fā)送消息的任務(wù) */
Rt = Tcb->Msg; /* 返回消息隊(duì)列中的一個(gè)消息 */
*TaskId = Tcb->OSTCBId; /* 返回發(fā)送消息的任務(wù) */
OSTCBCur->MsgHard = Tcb->MsgNext; /* 刪除消息隊(duì)列中發(fā)送該消息的任務(wù) */
Tcb->MsgNext = NULL; /* 功能完成 釋放 */
Tcb->MsgPrev = NULL; /* 清空前驅(qū) 保證系統(tǒng)可靠性 */
if (OSTCBCur->MsgHard == NULL) /* 如果消息隊(duì)列中已經(jīng)沒有了消息 */
{
OSTCBCur->MsgEnd = NULL; /* 清空消息隊(duì)列尾 保證系統(tǒng)可靠性 */
}
*err = OS_NO_ERR; /* 返回值 系統(tǒng)沒有錯誤 */
Tcb->OSTCBInfo |= OS_INFO_MSG_SENGED; /* 發(fā)送消息的任務(wù)發(fā)送消息完畢 */
if ((Tcb->OSTCBStat & OS_STAT_MSG_SENGED) != 0) /* 如果發(fā)送消息的任務(wù)處于 等待消息發(fā)送完畢狀態(tài) 則恢復(fù)它 */
{
Tcb->OSTCBStat = 0; /* 將任務(wù)狀態(tài)調(diào)整為就緒 */
_OS_TaskResume(Tcb); /* 將任務(wù)加入優(yōu)先級鏈表 */
OSSched(); /* 內(nèi)核進(jìn)行任務(wù)調(diào)度 */
}
}
else
{
*err = OS_TIMEOUT; /* 超時(shí) */
Rt = NULL;
}
if (OSTCBCur->MsgHard == NULL) /* 如果消息接收完畢 */
{
OSTCBCur->OSTCBInfo &= ~OS_INFO_MSG;/* 任務(wù)得到消息 */
}
OS_EXIT_CRITICAL();
return Rt;
}
#endif
/*********************************************************************************************************
** 函數(shù)名稱: OSMsgPost
** 功能描述: FIFO方式發(fā)送消息
** 輸 入: TaskId:消息的目的任務(wù)ID
** Msg:消息
** 輸 出: OS_NO_ERR:成功
** OS_TASKID_INVALID:目標(biāo)任務(wù)不存在
** OS_MSG_SEND_ERR:消息發(fā)送錯誤
** 作 者: 陳明計(jì)
** 日 期: 2005年6月10日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#if EN_OS_MSG_POST > 0
uint8 OSMsgPost(TASK_ID TaskId, void *Msg)
{
OS_TCB *Tcb;
uint8 Rt;
OS_CPU_SR cpu_sr = 0;
/* 目的必須有效 */
Rt = OS_TASKID_INVALID;
if (TaskId < OS_MAX_TASKS)
if (TaskId != OSTCBCur->OSTCBId) /* 不能發(fā)給自身 */
{
Rt = OS_MSG_SEND_ERR;
if ((OSTCBCur->OSTCBInfo & OS_INFO_MSG_SENGED) != 0) /* 上次發(fā)送消息完畢 */
{
Rt = OS_TASKID_INVALID;
OS_ENTER_CRITICAL();
Tcb = &(OSTCBTbl[TaskId]);
if (Tcb->OSTCBStat != OS_STAT_DEATH) /* 目標(biāo)確實(shí)存在 */
{
/* 發(fā)送消息 */
OSTCBCur->OSTCBInfo &= ~(OS_INFO_MSG_SENGED | OS_INFO_MSG_BACK);
OSTCBCur->Msg = Msg;
/* 把任務(wù)加入鏈表 */
OSTCBCur->MsgNext = NULL;
OSTCBCur->MsgPrev = Tcb->MsgEnd;
if (Tcb->MsgEnd != NULL)
{
Tcb->MsgEnd->MsgNext = OSTCBCur;
}
if (Tcb->MsgHard == NULL)
{
Tcb->MsgHard = OSTCBCur;
}
Tcb->MsgEnd = OSTCBCur;
Rt = OS_NO_ERR;
Tcb->OSTCBInfo |= OS_INFO_MSG;
if ((Tcb->OSTCBStat & OS_STAT_MSG) != 0) /* 目標(biāo)任務(wù)在等待消息 */
{
Tcb->OSTCBStat = 0;
_OS_TaskResume(Tcb);
OSSched();
}
}
OS_EXIT_CRITICAL();
}
}
return Rt;
}
#endif
/*********************************************************************************************************
** 函數(shù)名稱: OSMsgPostFront
** 功能描述: LIFO方式發(fā)送消息
** 輸 入: TaskId:消息的目的任務(wù)ID
** Msg:消息
** 輸 出: OS_NO_ERR:成功
** OS_TASKID_INVALID:目標(biāo)任務(wù)不存在
** OS_MSG_SEND_ERR:消息發(fā)送錯誤
** 作 者: 陳明計(jì)
** 日 期: 2005年6月10日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#if EN_OS_MSG_POST_FRONT > 0
uint8 OSMsgPostFront(TASK_ID TaskId, void * Msg)
{
OS_TCB *Tcb;
uint8 Rt;
OS_CPU_SR cpu_sr = 0;
/* 注釋參考OSMsgPost */
Rt = OS_TASKID_INVALID;
if (TaskId < OS_MAX_TASKS)
if (TaskId != OSTCBCur->OSTCBId)
{
Rt = OS_MSG_SEND_ERR;
if ((OSTCBCur->OSTCBInfo & OS_INFO_MSG_SENGED) != 0)
{
Rt = OS_TASKID_INVALID;
OS_ENTER_CRITICAL();
Tcb = &(OSTCBTbl[TaskId]);
if (Tcb->OSTCBStat != OS_STAT_DEATH)
{
OSTCBCur->OSTCBInfo &= ~(OS_INFO_MSG_SENGED | OS_INFO_MSG_BACK);
OSTCBCur->Msg = Msg;
OSTCBCur->MsgPrev = NULL;
OSTCBCur->MsgNext = Tcb->MsgHard;
if (Tcb->MsgHard != NULL)
{
Tcb->MsgHard->MsgPrev = OSTCBCur;
}
Tcb->MsgHard = OSTCBCur;
Rt = OS_NO_ERR;
Tcb->OSTCBInfo |= OS_INFO_MSG;
if ((Tcb->OSTCBStat & OS_STAT_MSG) != 0)
{
Tcb->OSTCBStat = 0;
_OS_TaskResume(Tcb);
OSSched();
}
}
OS_EXIT_CRITICAL();
}
}
return Rt;
}
#endif
/*********************************************************************************************************
** 函數(shù)名稱: OSMsgNMsgs
** 功能描述: 取得指定任務(wù)的消息數(shù)
** 輸 入: TaskId:任務(wù)ID
** 輸 出: 消息數(shù)目
** 作 者: 陳明計(jì)
** 日 期: 2005年6月10日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#if EN_OS_MSG_NMsgs > 0
uint32 OSMsgNMsgs(TASK_ID TaskId)
{
OS_TCB *Tcb;
uint32 Rt;
OS_CPU_SR cpu_sr = 0;
Rt = 0;
Tcb = NULL;
if (TaskId == OS_ID_SELF)
{
Tcb = OSTCBCur;
}
if (TaskId < OS_MAX_TASKS)
{
Tcb = &(OSTCBTbl[TaskId]);
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -