国轩高科三厂怎么样:消息邮箱(一)——创建消息邮箱,OSMboxCreate()分析

来源:百度文库 编辑:偶看新闻 时间:2024/05/03 07:45:56
消息邮箱(一)——创建消息邮箱,OSMboxCreate()分析2010-08-27 21:46

         任务与任务之间要传递一个数据,那么为了适应不同数据的需要最好在存储器中建立一个数据缓冲区。把要传递的数据放到这个缓冲区中,就可以实现任务间数据通信。然后把数据缓冲区的指针赋给一个事件控制块的成员OSEventPrt,同时使事件控制块的成员OSEventType要进行设置成消息邮箱类型。那么这个事件控制块就是消息邮箱。

       很明显:消息邮箱是在两个需要通信的任务之间通过传递数据缓冲区指针的方法来进行通信的。

OS_EVENT   *OSMboxCreate (void *msg)
  函数功能:建立一个邮箱。
  msg:用来初始化建立的消息邮箱,如果该指针不为空,则建立的消息邮箱将含有消息。
  返回值:指向分配给所建立的消息邮箱的事件控制块的指针。如果没有可用的事件控制块,则返回空指针。

/*          CREATE A MESSAGE MAILBOX(参考信号量管理部分的OSSemCreate()的函数浅析 且一下红色部分为两者间不同部分)
*
* Description: This function creates a message mailbox if free event control blocks are available.
*
* Arguments : msg    is a pointer to a message that you wish to deposit in the mailbox. If
*                            you set this value to the NULL pointer (i.e. (void *)0) then the mailbox
*                            will be considered empty.
                             当邮箱使用目的是通知一个事件的发生,发送一个消息,那么就用NULL;

                             当邮箱使用目的是共享某些资源,那么就初始化时就使用非NULL的指针。

*
* Returns    : != (OS_EVENT *)0 is a pointer to the event control clock (OS_EVENT) associated with the
*                                created mailbox
*              == (OS_EVENT *)0 if no event control blocks were available

*/

OS_EVENT *OSMboxCreate (void *msg)
{
#if OS_CRITICAL_METHOD == 3   /* Allocate storage for CPU status register */
    OS_CPU_SR cpu_sr;
#endif   
    OS_EVENT *pevent;


    if (OSIntNesting > 0) {                      /* See if called from ISR ...                         */
        return ((OS_EVENT *)0);                  /* ... can't CREATE from an ISR                       */
    }
   

   OS_ENTER_CRITICAL();
     pevent = OSEventFreeList;                    /* Get next free event control block                  */
    if (OSEventFreeList != (OS_EVENT *)0) {      /* See if pool of free ECB pool was empty             */
        OSEventFreeList = (OS_EVENT *)OSEventFreeList->OSEventPtr;
    }
  

OS_EXIT_CRITICAL();
    if (pevent != (OS_EVENT *)0) {
        pevent->OSEventType = OS_EVENT_TYPE_MBOX;
        pevent->OSEventCnt = 0;
        pevent->OSEventPtr = msg;               /* Deposit message in event control block             */
        OS_EventWaitListInit(pevent);
    }
    return (pevent);                             /* Return pointer to event control block              */
}