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

📄 os_q.lst

📁 ucOS移植到STC89C58RD上面的源代码
💻 LST
📖 第 1 页 / 共 4 页
字号:
                      OSTCBCur->OSTCBEventPtr = (OS_EVENT *)0; /* No longer waiting for event                        */
                      OS_EXIT_CRITICAL();
                      *err                    = OS_NO_ERR;
                      return (msg);                            /* Return message received                            */
                  }
                  OS_EventTO(pevent);                          /* Timed out                                          */
                  OS_EXIT_CRITICAL();
                  *err = OS_TIMEOUT;                           /* Indicate a timeout occured                         */
                  return ((void *)0);                          /* No message received                                */
              }
              /*$PAGE*/
              /*
              *********************************************************************************************************
              *                                        POST MESSAGE TO A QUEUE
              *
              * Description: This function sends a message to a queue
              *
              * Arguments  : pevent        is a pointer to the event control block associated with the desired queue
              *
              *              msg           is a pointer to the message to send.  You MUST NOT send a NULL pointer.
              *
              * Returns    : OS_NO_ERR             The call was successful and the message was sent
              *              OS_Q_FULL             If the queue cannot accept any more messages because it is full.
              *              OS_ERR_EVENT_TYPE     If you didn't pass a pointer to a queue.
              *              OS_ERR_PEVENT_NULL    If 'pevent' is a NULL pointer
              *              OS_ERR_POST_NULL_PTR  If you are attempting to post a NULL pointer
              *********************************************************************************************************
              */
              
              #if OS_Q_POST_EN > 0
              INT8U  OSQPost (OS_EVENT *pevent, void *msg) reentrant
              {
              #if OS_CRITICAL_METHOD == 3                      /* Allocate storage for CPU status register           */
                  OS_CPU_SR  cpu_sr;
              #endif    
                  OS_Q      *pq;
              
              
              #if OS_ARG_CHK_EN > 0
                  if (pevent == (OS_EVENT *)0) {                    /* Validate 'pevent'                             */
                      return (OS_ERR_PEVENT_NULL);
                  }
                  if (msg == (void *)0) {                           /* Make sure we are not posting a NULL pointer   */
                      return (OS_ERR_POST_NULL_PTR);
                  }
                  if (pevent->OSEventType != OS_EVENT_TYPE_Q) {     /* Validate event block type                     */
                      return (OS_ERR_EVENT_TYPE);
                  }
              #endif
                  OS_ENTER_CRITICAL();
                  if (pevent->OSEventGrp != 0x00) {                 /* See if any task pending on queue              */
                      OS_EventTaskRdy(pevent, msg, OS_STAT_Q);      /* Ready highest priority task waiting on event  */
                      OS_EXIT_CRITICAL();
                      OS_Sched();                                   /* Find highest priority task ready to run       */
                      return (OS_NO_ERR);
                  }
                  pq = (OS_Q *)pevent->OSEventPtr;                  /* Point to queue control block                  */
                  if (pq->OSQEntries >= pq->OSQSize) {              /* Make sure queue is not full                   */
C51 COMPILER V7.50   OS_Q                                                                  12/14/2005 10:56:01 PAGE 8   

                      OS_EXIT_CRITICAL();
                      return (OS_Q_FULL);
                  }
                  *pq->OSQIn++ = msg;                               /* Insert message into queue                     */
                  pq->OSQEntries++;                                 /* Update the nbr of entries in the queue        */
                  if (pq->OSQIn == pq->OSQEnd) {                    /* Wrap IN ptr if we are at end of queue         */
                      pq->OSQIn = pq->OSQStart;
                  }
                  OS_EXIT_CRITICAL();
                  return (OS_NO_ERR);
              }
              #endif
              /*$PAGE*/
              /*
              *********************************************************************************************************
              *                                   POST MESSAGE TO THE FRONT OF A QUEUE
              *
              * Description: This function sends a message to a queue but unlike OSQPost(), the message is posted at
              *              the front instead of the end of the queue.  Using OSQPostFront() allows you to send
              *              'priority' messages.
              *
              * Arguments  : pevent        is a pointer to the event control block associated with the desired queue
              *
              *              msg           is a pointer to the message to send.  You MUST NOT send a NULL pointer.
              *
              * Returns    : OS_NO_ERR             The call was successful and the message was sent
              *              OS_Q_FULL             If the queue cannot accept any more messages because it is full.
              *              OS_ERR_EVENT_TYPE     If you didn't pass a pointer to a queue.
              *              OS_ERR_PEVENT_NULL    If 'pevent' is a NULL pointer
              *              OS_ERR_POST_NULL_PTR  If you are attempting to post to a non queue.
              *********************************************************************************************************
              */
              
              #if OS_Q_POST_FRONT_EN > 0
              INT8U  OSQPostFront (OS_EVENT *pevent, void *msg) reentrant
              {
              #if OS_CRITICAL_METHOD == 3                      /* Allocate storage for CPU status register           */
                  OS_CPU_SR  cpu_sr;
              #endif    
                  OS_Q      *pq;
              
              
              #if OS_ARG_CHK_EN > 0
                  if (pevent == (OS_EVENT *)0) {                    /* Validate 'pevent'                             */
                      return (OS_ERR_PEVENT_NULL);
                  }
                  if (msg == (void *)0) {                           /* Make sure we are not posting a NULL pointer   */
                      return (OS_ERR_POST_NULL_PTR);
                  }
                  if (pevent->OSEventType != OS_EVENT_TYPE_Q) {     /* Validate event block type                     */
                      return (OS_ERR_EVENT_TYPE);
                  }
              #endif
                  OS_ENTER_CRITICAL();
                  if (pevent->OSEventGrp != 0x00) {                 /* See if any task pending on queue              */
                      OS_EventTaskRdy(pevent, msg, OS_STAT_Q);      /* Ready highest priority task waiting on event  */
                      OS_EXIT_CRITICAL();
                      OS_Sched();                                   /* Find highest priority task ready to run       */
                      return (OS_NO_ERR);
                  }
                  pq = (OS_Q *)pevent->OSEventPtr;                  /* Point to queue control block                  */
                  if (pq->OSQEntries >= pq->OSQSize) {              /* Make sure queue is not full                   */
C51 COMPILER V7.50   OS_Q                                                                  12/14/2005 10:56:01 PAGE 9   

                      OS_EXIT_CRITICAL();
                      return (OS_Q_FULL);
                  }
                  if (pq->OSQOut == pq->OSQStart) {                 /* Wrap OUT ptr if we are at the 1st queue entry */
                      pq->OSQOut = pq->OSQEnd;
                  }
                  pq->OSQOut--;
                  *pq->OSQOut = msg;                                /* Insert message into queue                     */
                  pq->OSQEntries++;                                 /* Update the nbr of entries in the queue        */
                  OS_EXIT_CRITICAL();
                  return (OS_NO_ERR);
              }
              #endif
              /*$PAGE*/
              /*
              *********************************************************************************************************
              *                                        POST MESSAGE TO A QUEUE
              *
              * Description: This function sends a message to a queue.  This call has been added to reduce code size
              *              since it can replace both OSQPost() and OSQPostFront().  Also, this function adds the 
              *              capability to broadcast a message to ALL tasks waiting on the message queue.
              *
              * Arguments  : pevent        is a pointer to the event control block associated with the desired queue
              *
              *              msg           is a pointer to the message to send.  You MUST NOT send a NULL pointer.
              *
              *              opt           determines the type of POST performed:
              *                            OS_POST_OPT_NONE         POST to a single waiting task 
              *                                                     (Identical to OSQPost())
              *                            OS_POST_OPT_BROADCAST    POST to ALL tasks that are waiting on the queue
              *                            OS_POST_OPT_FRONT        POST as LIFO (Simulates OSQPostFront())
              *
              *                            Below is a list of ALL the possible combination of these flags:
              *
              *                                 1) OS_POST_OPT_NONE
              *                                    identical to OSQPost()
              *
              *                                 2) OS_POST_OPT_FRONT  
              *                                    identical to OSQPostFront()
              *
              *                                 3) OS_POST_OPT_BROADCAST
              *                                    identical to OSQPost() but will broadcast 'msg' to ALL waiting tasks
              *
              *                                 4) OS_POST_OPT_FRONT + OS_POST_OPT_BROADCAST  is identical to
              *                                    OSQPostFront() except that will broadcast 'msg' to ALL waiting tasks
              *
              * Returns    : OS_NO_ERR             The call was successful and the message was sent
              *              OS_Q_FULL             If the queue cannot accept any more messages because it is full.
              *              OS_ERR_EVENT_TYPE     If you didn't pass a pointer to a queue.
              *              OS_ERR_PEVENT_NULL    If 'pevent' is a NULL pointer
              *              OS_ERR_POST_NULL_PTR  If you are attempting to post a NULL pointer
              *
              * Warning    : Interrupts can be disabled for a long time if you do a 'broadcast'.  In fact, the 
              *              interrupt disable time is proportional to the number of tasks waiting on the queue.
              *********************************************************************************************************
              */
              
              #if OS_Q_POST_OPT_EN > 0
              INT8U  OSQPostOpt (OS_EVENT *pevent, void *msg, INT8U opt) reentrant
              {
              #if OS_CRITICAL_METHOD == 3                      /* Allocate storage for CPU status register           */
                  OS_CPU_SR  cpu_sr;
C51 COMPILER V7.50   OS_Q                                                                  12/14/2005 10:56:01 PAGE 10  

              #endif    
                  OS_Q      *pq;
              
              
              #if OS_ARG_CHK_EN > 0
                  if (pevent == (OS_EVENT *)0) {                    /* Validate 'pevent'                             */
                      return (OS_ERR_PEVENT_NULL);

⌨️ 快捷键说明

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