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

📄 os_msg.c

📁 SmallRTOSAVR.rar
💻 C
📖 第 1 页 / 共 2 页
字号:
/*********************************************************************************************************
**                                        Small RTOS
**                                   The Real-Time Kernel
**                           (c) Copyright 2002-2003, chenmingji
**                                     All Rights Reserved
**                                         V1.50.0
**
**--------------文件信息--------------------------------------------------------------------------------
**文   件   名: OS_msg.c
**创   建   人: 陈明计
**最后修改日期: 2005年6月10日
**描        述: Small RTOS消息处理代码(任务之间直接发送消息)
**
**--------------历史版本信息----------------------------------------------------------------------------
** 创建人: 陈明计
** 版  本: V1.00
** 日 期: 2005年6月10日
** 描 述: 基本完成全新的Small RTOS核
**
**------------------------------------------------------------------------------------------------------
** 修改人:
** 版  本:  
** 日 期:    
** 描 述:
**
**--------------当前版本修订------------------------------------------------------------------------------
** 修改人: 焦进星
** 日 期: 2007年12月30日
** 描 述: 移植到AVR系列芯片,适用于atmega16/32等
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/

#define  IN_OS_MSG
#define  IN_OS
#include "..\APP\config.h"

#if EN_OS_MSG > 0

/*********************************************************************************************************
** 函数名称: OSMsgAccept
** 功能描述: 无等待获取消息
** 输 入: TaskId:用于返回发送消息的任务的任务ID
**         err:错误状态
** 输 出: 指向消息的无类型指针
** 作 者: 陈明计
** 日 期: 2005年6月10日
**-------------------------------------------------------------------------------------------------------
** 修改人: 
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#if EN_OS_MSG_ACCEPT > 0
        void * OSMsgAccept(TASK_ID *TaskId, uint8 *err)
{
    void *Rt;
    OS_TCB *Tcb;
    
    OS_ENTER_CRITICAL();
    if ((OSTCBCur->OSTCBInfo & OS_INFO_MSG) != 0)   /* 如果有消息           */
    {
        Tcb = OSTCBCur->MsgHard;
        Rt = Tcb->Msg;                              /* 返回消息             */
        *TaskId = Tcb->OSTCBId;                     /* 返回发送消息的任务   */
        /* 从队列中删除发送消息的任务   */
        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;       /* 指明发送消息的任务获已经发送了消息   */
        /* 如果发送消息的任务在等待消息发送完毕,恢复它 */
        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

/*********************************************************************************************************
** 函数名称: OSMsgPend
** 功能描述: 等待消息
** 输 入: Tick:超时时间
**         TaskId:用于返回发送消息的任务的任务ID
**         err:错误状态
** 输 出: 指向消息的无类型指针
** 作 者: 陈明计
** 日 期: 2005年6月10日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#if EN_OS_MSG_PENT > 0
        void * OSMsgPend(uint8 Tick, TASK_ID *TaskId, uint8 *err)
{
    void *Rt;
    OS_TCB *Tcb;

    OS_ENTER_CRITICAL();
    if ((OSTCBCur->OSTCBInfo & OS_INFO_MSG) == 0)   /* 如果没有消息         */
    {
        OSTCBCur->OSTCBStat |= OS_INFO_MSG;
        if (Tick > 0)
        {
            OS_TimeDly(Tick);                               /* 超时设置      */
        }
        else
        {
            _OS_TaskSuspend(OSTCBCur);                      /* 从优先级链表中删除 */
        }
        OSSched();
    }
    /* 以下部分注释参考OSMsgAccept */
    if ((OSTCBCur->OSTCBInfo & OS_INFO_MSG) != 0)
    {
        Tcb = OSTCBCur->MsgHard;
        Rt = Tcb->Msg;
        *TaskId = Tcb->OSTCBId;
        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;
        if ((Tcb->OSTCBStat & OS_STAT_MSG_SENGED) != 0)
        {
            Tcb->OSTCBStat = 0;
            _OS_TaskResume(Tcb);
            OSSched();
        }
    }
    else
    {
        *err = OS_TIMEOUT;
        Rt = NULL;
    }
    if (OSTCBCur->MsgHard == NULL)
    {
        OSTCBCur->OSTCBInfo &= ~OS_INFO_MSG;
    }
    OS_EXIT_CRITICAL();
    return Rt;
}
#endif

/*********************************************************************************************************
** 函数名称: OSMsgPost
** 功能描述: FIFO方式发送消息
** 输 入: TaskId:消息的目的任务ID
**         Msg:消息
** 输 出: OS_NO_ERR:成功
**         OS_TASKID_INVALID:目标任务不存在
**         OS_MSG_SEND_ERR:消息发送错误
** 作 者: 陈明计
** 日 期: 2005年6月10日
**-------------------------------------------------------------------------------------------------------
** 修改人: 
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#if EN_OS_MSG_POST > 0
        uint8 OSMsgPost(TASK_ID TaskId, void *Msg)
{
    OS_TCB *Tcb;
    uint8 Rt;

    /* 目的必须有效 */
    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->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)    /* 目标任务在等待消息 */
                {
                    Tcb->OSTCBStat = 0;
                    _OS_TaskResume(Tcb);
                    OSSched();
                }
            }
            OS_EXIT_CRITICAL();
        }
    }
    return Rt;
}
#endif

/*********************************************************************************************************
** 函数名称: OSMsgPostFront
** 功能描述: LIFO方式发送消息
** 输 入: TaskId:消息的目的任务ID
**         Msg:消息
** 输 出: OS_NO_ERR:成功
**         OS_TASKID_INVALID:目标任务不存在
**         OS_MSG_SEND_ERR:消息发送错误
** 作 者: 陈明计
** 日 期: 2005年6月10日
**-------------------------------------------------------------------------------------------------------
** 修改人: 
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#if EN_OS_MSG_POST_FRONT > 0
        uint8 OSMsgPostFront(TASK_ID TaskId, void * Msg)
{
    OS_TCB *Tcb;
    uint8 Rt;
    
    /* 注释参考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

/*********************************************************************************************************
** 函数名称: OSMsgNMsgs
** 功能描述: 取得指定任务的消息数
** 输 入: TaskId:任务ID
** 输 出: 消息数目
** 作 者: 陈明计
** 日 期: 2005年6月10日
**-------------------------------------------------------------------------------------------------------
** 修改人: 
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#if EN_OS_MSG_NMsgs > 0
        uint32 OSMsgNMsgs(TASK_ID TaskId)
{
    OS_TCB *Tcb;
    uint32 Rt;
    
    Rt = 0;
    Tcb = NULL;
    if (TaskId == OS_ID_SELF)
    {
        Tcb = OSTCBCur;
    }
    if (TaskId < OS_MAX_TASKS)
    {
        Tcb = &(OSTCBTbl[TaskId]);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -