📄 os_msg.c
字号:
Tcb = &(OSTCBTbl[TaskId]);
}
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;
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 + -