⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 os_msg.c

📁 SmallRTOSAVR.rar
💻 C
📖 第 1 页 / 共 2 页
字号:
    }
    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 + -