ucosII消息队列创建函数

/*****************************************************************************
函数名:*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);
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值