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

📄 os_mbox.c

📁 ucos_ii在S3C2410上的移植
💻 C
📖 第 1 页 / 共 2 页
字号:
        return ((void *)0);
    }
    if (pevent->OSEventType != OS_EVENT_TYPE_MBOX) 
    {                                                                  /* 无效的事件块类型             */
        *err = OS_ERR_EVENT_TYPE;
        return ((void *)0);
    }
#endif
    OS_ENTER_CRITICAL();
    msg = pevent->OSEventPtr;
    if (msg != (void *)0)                            /* 看是否有已存在的消息             */
    {                           
        pevent->OSEventPtr = (void *)0;               /* 清除邮箱                             */
        OS_EXIT_CRITICAL();
        *err = OS_NO_ERR;
        return (msg);                                 /* 返回接收的消息 (或空指针)         */
    }
    OSTCBCur->OSTCBStat |= OS_STAT_MBOX;              /* 没有消息,任务将等待         */
    OSTCBCur->OSTCBDly   = timeout;                   /* 在TCB中加载延时数                          */
    OS_EventTaskWait(pevent);                         /* 挂起任务直到事件发生或延时到    */
    OS_EXIT_CRITICAL();
    OS_Sched();                                       /* 寻找最高优先级任务就绪运行  */
    OS_ENTER_CRITICAL();
    msg = OSTCBCur->OSTCBMsg;
    if (msg != (void *)0)                             /* 看是否有消息?              */
    {                           
        OSTCBCur->OSTCBMsg      = (void *)0;          /* 有,清除已接收的消息                  */
        OSTCBCur->OSTCBStat     = OS_STAT_RDY;
        OSTCBCur->OSTCBEventPtr = (OS_EVENT *)0;      /* 拆除TCB与ECB的链接,不在等待事件发生  */
        OS_EXIT_CRITICAL();
        *err                    = OS_NO_ERR;
        return (msg);                                 /* 返回接收的消息                   */
    }
    OS_EventTO(pevent);                               /* 延时到,就绪任务                    */
    OS_EXIT_CRITICAL();
    *err = OS_TIMEOUT;                                /* 显示延时发生               */
    return ((void *)0);                               /* 返回空消息                         */
}
/*$PAGE*/
/*
*********************************************************************************************************
*                                       发送消息到邮箱
*
* 函数描述: 该函数发送一个消息到邮箱
*
* 输入参数 : pevent        指向带有期望邮箱的ECB的指针
*
*            msg           指向发送消息的指针.  不要发送空指针
*
* 返回值  :  OS_NO_ERR              调用成功,消息被发送
*            OS_MBOX_FULL           邮箱中已包含信息。一次仅能发送一条消息,因此,在发送消息前必须清空邮箱。
*            OS_ERR_EVENT_TYPE      发送到非邮箱型中
*            OS_ERR_PEVENT_NULL     'pevent' 是一个空指针
*            OS_ERR_POST_NULL_PTR   发送一个空指针
*********************************************************************************************************
*/

#if OS_MBOX_POST_EN > 0
INT8U  OSMboxPost (OS_EVENT *pevent, void *msg)
{
#if OS_CRITICAL_METHOD == 3                                  /* 为CPU状态寄存器分配存储变量          */
    OS_CPU_SR  cpu_sr;
#endif    
    
    
#if OS_ARG_CHK_EN > 0
    if (pevent == (OS_EVENT *)0) 
    {                                                                            /* 无效的 'pevent'   */
        return (OS_ERR_PEVENT_NULL);
    }
    if (msg == (void *)0) 
    {                                                                          /* 没有发送一个空指针   */
        return (OS_ERR_POST_NULL_PTR);
    }
    if (pevent->OSEventType != OS_EVENT_TYPE_MBOX) 
    {                                                                            /* 无效的事件块类型   */
        return (OS_ERR_EVENT_TYPE);
    }
#endif
    OS_ENTER_CRITICAL();
    if (pevent->OSEventGrp != 0x00)                             /* 看是否任务正在等待消息邮箱           */
    {                                                 
        OS_EventTaskRdy(pevent, msg, OS_STAT_MBOX);    /* 就绪等待事件的最高优先级的任务,在TCB中放消息  */
        OS_EXIT_CRITICAL();
        OS_Sched();                                                             /* 寻找HPT就绪运行      */
        return (OS_NO_ERR);
    }
    if (pevent->OSEventPtr != (void *)0) 
    {                                                   /* 检查邮箱中是否有消息?  */
        OS_EXIT_CRITICAL();
        return (OS_MBOX_FULL);
    }
    pevent->OSEventPtr = msg;                         /* 在邮箱里放消息                     */
    OS_EXIT_CRITICAL();
    return (OS_NO_ERR);
}
#endif

/*$PAGE*/
/*
*********************************************************************************************************
*                                       发送消息到邮箱
*
* 函数描述: 该函数发送一个消息到邮箱
*
* 输入参数  : pevent        指向带有期望邮箱的ECB的指针
*
*              msg           指向发送消息的指针.  不要发送空指针
*
*              opt           发送的类型:
*                            OS_POST_OPT_NONE         发送给单独的等待任务 
*                                                     (与 OSMboxPost()功能一致)
*                            OS_POST_OPT_BROADCAST    发送给所有正等待消息邮箱的任务
*
* 返回值    : OS_NO_ERR             调用成功,消息被发送
*             OS_MBOX_FULL          邮箱中已包含信息。一次仅能发送一条消息,因此,在发送消息前必须清空邮箱。
*             OS_ERR_EVENT_TYPE     发送到非邮箱型中.
*             OS_ERR_PEVENT_NULL   'pevent' 是一个空指针
*             OS_ERR_POST_NULL_PTR  发送一个空指针
*
* 警告    : 如果广播发送,中断将禁止较长时间。事实上,中断禁止时间正比于等待消息邮箱的任务的数量。
*********************************************************************************************************
*/

#if OS_MBOX_POST_OPT_EN > 0
INT8U  OSMboxPostOpt (OS_EVENT *pevent, void *msg, INT8U opt)
{
#if OS_CRITICAL_METHOD == 3                      /* 为CPU状态寄存器分配存储变量           */
    OS_CPU_SR  cpu_sr;
#endif    
    
    
#if OS_ARG_CHK_EN > 0
    if (pevent == (OS_EVENT *)0) 
    {                                                      /* 无效的 'pevent'                           */
        return (OS_ERR_PEVENT_NULL);
    }
    if (msg == (void *)0) 
    {                                                                         /* 没有发送一个空指针   */
        return (OS_ERR_POST_NULL_PTR);
    }
    if (pevent->OSEventType != OS_EVENT_TYPE_MBOX) 
    {                                                             /* 无效的事件块类型                     */
        return (OS_ERR_EVENT_TYPE);
    }
#endif
    OS_ENTER_CRITICAL();
    if (pevent->OSEventGrp != 0x00)                         /* 看是否任务正在等待消息邮箱           */
    {                                                       
        if ((opt & OS_POST_OPT_BROADCAST) != 0x00)          /* 需要广播发送吗? */
        {                                                   
            while (pevent->OSEventGrp != 0x00)              /* 是,广播发送给所有等待邮箱的任务     */
            {                                                           
                OS_EventTaskRdy(pevent, msg, OS_STAT_MBOX);    
            }                                          /* 就绪所有等待事件的任务,在它们相应的TCB中放消息  */
        } 
        else 
        {
            OS_EventTaskRdy(pevent, msg, OS_STAT_MBOX); /*不,就绪等待事件的HPT的任务,在其TCB中放消息  */
        }
        OS_EXIT_CRITICAL();
        OS_Sched();                                        /* 寻找最高优先级就绪运行  */
        return (OS_NO_ERR);
    }
    if (pevent->OSEventPtr != (void *)0) 
    {                                                      /* 邮箱中是否有消息?  */
        OS_EXIT_CRITICAL();
        return (OS_MBOX_FULL);
    }
    pevent->OSEventPtr = msg;                         /* 在邮箱里放消息                    */
    OS_EXIT_CRITICAL();
    return (OS_NO_ERR);
}
#endif

/*$PAGE*/
/*
*********************************************************************************************************
*                                        查询一个消息邮箱
*
* 函数描述:   该函数得到消息邮箱的信息
*
* 输入参数  : pevent        指向带有期望邮箱的ECB的指针
*
*             pdata         指向包含消息邮箱的数据结构的指针
*
* 返回值    : OS_NO_ERR           调用成功,消息被发送
*             OS_ERR_EVENT_TYPE   从一个非消息邮箱中获取信息
*             OS_ERR_PEVENT_NULL  'pevent' 是一个空指针
*********************************************************************************************************
*/

#if OS_MBOX_QUERY_EN > 0
INT8U  OSMboxQuery (OS_EVENT *pevent, OS_MBOX_DATA *pdata)
{
#if OS_CRITICAL_METHOD == 3                                   /* 为CPU状态寄存器分配存储变量           */
    OS_CPU_SR  cpu_sr;
#endif    
    INT8U     *psrc;
    INT8U     *pdest;


#if OS_ARG_CHK_EN > 0
    if (pevent == (OS_EVENT *)0) 
    {                                                         /* 无效的 'pevent'                        */
        return (OS_ERR_PEVENT_NULL);
    }
    if (pevent->OSEventType != OS_EVENT_TYPE_MBOX) 
    {                                                                   /* 无效的事件块类型             */
        return (OS_ERR_EVENT_TYPE);
    }
#endif
    OS_ENTER_CRITICAL();
    pdata->OSEventGrp = pevent->OSEventGrp;                           /* 复制消息邮箱等待列表           */
    psrc              = &pevent->OSEventTbl[0];
    pdest             = &pdata->OSEventTbl[0];

#if OS_EVENT_TBL_SIZE > 0
    *pdest++          = *psrc++;
#endif

#if OS_EVENT_TBL_SIZE > 1
    *pdest++          = *psrc++;
#endif

#if OS_EVENT_TBL_SIZE > 2
    *pdest++          = *psrc++;
#endif

#if OS_EVENT_TBL_SIZE > 3
    *pdest++          = *psrc++;
#endif

#if OS_EVENT_TBL_SIZE > 4
    *pdest++          = *psrc++;
#endif

#if OS_EVENT_TBL_SIZE > 5
    *pdest++          = *psrc++;
#endif

#if OS_EVENT_TBL_SIZE > 6
    *pdest++          = *psrc++;
#endif

#if OS_EVENT_TBL_SIZE > 7
    *pdest            = *psrc;
#endif
    pdata->OSMsg = pevent->OSEventPtr;                     /* 从邮箱中得到消息                 */
    OS_EXIT_CRITICAL();
    return (OS_NO_ERR);
}
#endif                                                     /* OS_MBOX_QUERY_EN                         */
#endif                                                     /* OS_MBOX_EN                               */

⌨️ 快捷键说明

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