ucosII消息队列创建函数

来源:互联网 发布:软件新技术有哪些 编辑:程序博客网 时间:2024/05/01 14:17

/*****************************************************************************
函数名:*OSQCreate
函数的参数:void **start 消息队列的首地址
            INT16U size  消息队列的长度
函数的返回值:指向消息队列的指针
函数实现的过程:
              一,从空的事件链表中取一个事件
           pevent = OSEventFreeList
     if(pevnet !=(OS_Event *)0) OSEventFreeList = OSEventFreeList->OSEventPtr;
     二、从空的消息链表中取一个消息
           pq = OSQFreeList;
                    if (pq != (OS_Q *)0) {  OSQFreeList  = OSQFreeList->OSQPtr; 对事件和队列赋值}
     三、初始化任务控制块:
           OS_EventWaitListInit(pevent);
     清空任务等待列表
     pevent->OSEventGrp = 0;
                    ptbl  = &pevent->OSEventTbl[0];
                    for (i = 0; i < OS_EVENT_TBL_SIZE; i++)  *ptbl++ = 0;
******************************************************************************/

OS_EVENT  *OSQCreate (void **start, INT16U size)
{
    OS_EVENT  *pevent;
    OS_Q      *pq;
#if OS_CRITICAL_METHOD == 3                      /* Allocate storage for CPU status register           */
    OS_CPU_SR  cpu_sr = 0;
#endif

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

    OS_ENTER_CRITICAL();

    pevent = OSEventFreeList;                   
    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) {               /* See if we have an event control block  */
       
  OS_ENTER_CRITICAL();
       
  pq = OSQFreeList;                        /* Get a free queue control block  */
       
  if (pq != (OS_Q *)0) {                   /* Were we able to get a queue control block ?        */
          
   OSQFreeList            = OSQFreeList->OSQPtr; /* Yes, Adjust free list pointer to next free*/
           
   OS_EXIT_CRITICAL();
           
   pq->OSQStart           = start;               /*      Initialize the queue                 */
           
   pq->OSQEnd             = &start[size];
           
   pq->OSQIn              = start;

            pq->OSQOut             = start;

            pq->OSQSize            = size;

            pq->OSQEntries         = 0;

            pevent->OSEventType    = OS_EVENT_TYPE_Q;
   
            pevent->OSEventCnt     = 0;
   
            pevent->OSEventPtr     = pq;

#if OS_EVENT_NAME_SIZE > 1
            pevent->OSEventName[0] = '?';                  /* Unknown name                             */
            pevent->OSEventName[1] = OS_ASCII_NUL;
#endif
            OS_EventWaitListInit(pevent);                 /*      Initalize the wait list              */
        }
  else {
            pevent->OSEventPtr = (void *)OSEventFreeList; /* No,  Return event control block on error  */
            OSEventFreeList    = pevent;
            OS_EXIT_CRITICAL();
            pevent = (OS_EVENT *)0;
        }
    }
    return (pevent);
}

原创粉丝点击