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

📄 os_q.lst

📁 一个关于UCOS的KEIL工程
💻 LST
📖 第 1 页 / 共 4 页
字号:
 366   2              OSTCBCur->OSTCBMsg      = (void *)0;     /* Extract message from TCB (Put there by QPost)      */
 367   2              OSTCBCur->OSTCBStat     = OS_STAT_RDY;
 368   2              OSTCBCur->OSTCBEventPtr = (OS_EVENT *)0; /* No longer waiting for event                        */
 369   2              OS_EXIT_CRITICAL();
 370   2              *err                    = OS_NO_ERR;
 371   2              return (msg);                            /* Return message received                            */
 372   2          }
 373   1          OS_EventTO(pevent);                          /* Timed out                                          */
 374   1          OS_EXIT_CRITICAL();
 375   1          *err = OS_TIMEOUT;                           /* Indicate a timeout occured                         */
 376   1          return ((void *)0);                          /* No message received                                */
 377   1      }
 378          /*$PAGE*/
 379          /*
 380          *********************************************************************************************************
 381          *                                        POST MESSAGE TO A QUEUE
 382          *
 383          * Description: This function sends a message to a queue
 384          *
 385          * Arguments  : pevent        is a pointer to the event control block associated with the desired queue
 386          *
 387          *              msg           is a pointer to the message to send.  You MUST NOT send a NULL pointer.
 388          *
 389          * Returns    : OS_NO_ERR             The call was successful and the message was sent
 390          *              OS_Q_FULL             If the queue cannot accept any more messages because it is full.
 391          *              OS_ERR_EVENT_TYPE     If you didn't pass a pointer to a queue.
 392          *              OS_ERR_PEVENT_NULL    If 'pevent' is a NULL pointer
 393          *              OS_ERR_POST_NULL_PTR  If you are attempting to post a NULL pointer
 394          *********************************************************************************************************
 395          */
 396          
 397          #if OS_Q_POST_EN > 0
 398          INT8U  OSQPost (OS_EVENT *pevent, void *msg) KCREENTRANT
 399          {
 400   1      #if OS_CRITICAL_METHOD == 3                      /* Allocate storage for CPU status register           */
                  OS_CPU_SR  cpu_sr;
              #endif
 403   1          OS_Q      *pq;
 404   1      
 405   1      
 406   1      #if OS_ARG_CHK_EN > 0
 407   1          if (pevent == (OS_EVENT *)0) {                    /* Validate 'pevent'                             */
 408   2              return (OS_ERR_PEVENT_NULL);
 409   2          }
 410   1          if (msg == (void *)0) {                           /* Make sure we are not posting a NULL pointer   */
 411   2              return (OS_ERR_POST_NULL_PTR);
 412   2          }
 413   1          if (pevent->OSEventType != OS_EVENT_TYPE_Q) {     /* Validate event block type                     */
 414   2              return (OS_ERR_EVENT_TYPE);
 415   2          }
 416   1      #endif
 417   1          OS_ENTER_CRITICAL();
 418   1          if (pevent->OSEventGrp != 0x00) {                 /* See if any task pending on queue              */
 419   2              OS_EventTaskRdy(pevent, msg, OS_STAT_Q);      /* Ready highest priority task waiting on event  */
 420   2              OS_EXIT_CRITICAL();
 421   2              OS_Sched();                                   /* Find highest priority task ready to run       */
 422   2              return (OS_NO_ERR);
 423   2          }
 424   1          pq = (OS_Q *)pevent->OSEventPtr;                  /* Point to queue control block                  */
 425   1          if (pq->OSQEntries >= pq->OSQSize) {              /* Make sure queue is not full                   */
 426   2              OS_EXIT_CRITICAL();
 427   2              return (OS_Q_FULL);
C51 COMPILER V6.23a  OS_Q                                                                  12/09/2004 16:50:26 PAGE 8   

 428   2          }
 429   1          *pq->OSQIn++ = msg;                               /* Insert message into queue                     */
 430   1          pq->OSQEntries++;                                 /* Update the nbr of entries in the queue        */
 431   1          if (pq->OSQIn == pq->OSQEnd) {                    /* Wrap IN ptr if we are at end of queue         */
 432   2              pq->OSQIn = pq->OSQStart;
 433   2          }
 434   1          OS_EXIT_CRITICAL();
 435   1          return (OS_NO_ERR);
 436   1      }
 437          #endif
 438          /*$PAGE*/
 439          /*
 440          *********************************************************************************************************
 441          *                                   POST MESSAGE TO THE FRONT OF A QUEUE
 442          *
 443          * Description: This function sends a message to a queue but unlike OSQPost(), the message is posted at
 444          *              the front instead of the end of the queue.  Using OSQPostFront() allows you to send
 445          *              'priority' messages.
 446          *
 447          * Arguments  : pevent        is a pointer to the event control block associated with the desired queue
 448          *
 449          *              msg           is a pointer to the message to send.  You MUST NOT send a NULL pointer.
 450          *
 451          * Returns    : OS_NO_ERR             The call was successful and the message was sent
 452          *              OS_Q_FULL             If the queue cannot accept any more messages because it is full.
 453          *              OS_ERR_EVENT_TYPE     If you didn't pass a pointer to a queue.
 454          *              OS_ERR_PEVENT_NULL    If 'pevent' is a NULL pointer
 455          *              OS_ERR_POST_NULL_PTR  If you are attempting to post to a non queue.
 456          *********************************************************************************************************
 457          */
 458          
 459          #if OS_Q_POST_FRONT_EN > 0
 460          INT8U  OSQPostFront (OS_EVENT *pevent, void *msg) KCREENTRANT
 461          {
 462   1      #if OS_CRITICAL_METHOD == 3                      /* Allocate storage for CPU status register           */
                  OS_CPU_SR  cpu_sr;
              #endif
 465   1          OS_Q      *pq;
 466   1      
 467   1      
 468   1      #if OS_ARG_CHK_EN > 0
 469   1          if (pevent == (OS_EVENT *)0) {                    /* Validate 'pevent'                             */
 470   2              return (OS_ERR_PEVENT_NULL);
 471   2          }
 472   1          if (msg == (void *)0) {                           /* Make sure we are not posting a NULL pointer   */
 473   2              return (OS_ERR_POST_NULL_PTR);
 474   2          }
 475   1          if (pevent->OSEventType != OS_EVENT_TYPE_Q) {     /* Validate event block type                     */
 476   2              return (OS_ERR_EVENT_TYPE);
 477   2          }
 478   1      #endif
 479   1          OS_ENTER_CRITICAL();
 480   1          if (pevent->OSEventGrp != 0x00) {                 /* See if any task pending on queue              */
 481   2              OS_EventTaskRdy(pevent, msg, OS_STAT_Q);      /* Ready highest priority task waiting on event  */
 482   2              OS_EXIT_CRITICAL();
 483   2              OS_Sched();                                   /* Find highest priority task ready to run       */
 484   2              return (OS_NO_ERR);
 485   2          }
 486   1          pq = (OS_Q *)pevent->OSEventPtr;                  /* Point to queue control block                  */
 487   1          if (pq->OSQEntries >= pq->OSQSize) {              /* Make sure queue is not full                   */
 488   2              OS_EXIT_CRITICAL();
 489   2              return (OS_Q_FULL);
C51 COMPILER V6.23a  OS_Q                                                                  12/09/2004 16:50:26 PAGE 9   

 490   2          }
 491   1          if (pq->OSQOut == pq->OSQStart) {                 /* Wrap OUT ptr if we are at the 1st queue entry */
 492   2              pq->OSQOut = pq->OSQEnd;
 493   2          }
 494   1          pq->OSQOut--;
 495   1          *pq->OSQOut = msg;                                /* Insert message into queue                     */
 496   1          pq->OSQEntries++;                                 /* Update the nbr of entries in the queue        */
 497   1          OS_EXIT_CRITICAL();
 498   1          return (OS_NO_ERR);
 499   1      }
 500          #endif
 501          /*$PAGE*/
 502          /*
 503          *********************************************************************************************************
 504          *                                        POST MESSAGE TO A QUEUE
 505          *
 506          * Description: This function sends a message to a queue.  This call has been added to reduce code size
 507          *              since it can replace both OSQPost() and OSQPostFront().  Also, this function adds the
 508          *              capability to broadcast a message to ALL tasks waiting on the message queue.
 509          *
 510          * Arguments  : pevent        is a pointer to the event control block associated with the desired queue
 511          *
 512          *              msg           is a pointer to the message to send.  You MUST NOT send a NULL pointer.
 513          *
 514          *              opt           determines the type of POST performed:
 515          *                            OS_POST_OPT_NONE         POST to a single waiting task
 516          *                                                     (Identical to OSQPost())
 517          *                            OS_POST_OPT_BROADCAST    POST to ALL tasks that are waiting on the queue
 518          *                            OS_POST_OPT_FRONT        POST as LIFO (Simulates OSQPostFront())
 519          *
 520          *                            Below is a list of ALL the possible combination of these flags:
 521          *
 522          *                                 1) OS_POST_OPT_NONE
 523          *                                    identical to OSQPost()
 524          *
 525          *                                 2) OS_POST_OPT_FRONT
 526          *                                    identical to OSQPostFront()
 527          *
 528          *                                 3) OS_POST_OPT_BROADCAST
 529          *                                    identical to OSQPost() but will broadcast 'msg' to ALL waiting tasks
 530          *
 531          *                                 4) OS_POST_OPT_FRONT + OS_POST_OPT_BROADCAST  is identical to
 532          *                                    OSQPostFront() except that will broadcast 'msg' to ALL waiting tasks
 533          *
 534          * Returns    : OS_NO_ERR             The call was successful and the message was sent
 535          *              OS_Q_FULL             If the queue cannot accept any more messages because it is full.
 536          *              OS_ERR_EVENT_TYPE     If you didn't pass a pointer to a queue.
 537          *              OS_ERR_PEVENT_NULL    If 'pevent' is a NULL pointer
 538          *              OS_ERR_POST_NULL_PTR  If you are attempting to post a NULL pointer
 539          *
 540          * Warning    : Interrupts can be disabled for a long time if you do a 'broadcast'.  In fact, the
 541          *              interrupt disable time is proportional to the number of tasks waiting on the queue.
 542          *********************************************************************************************************
 543          */
 544          
 545          #if OS_Q_POST_OPT_EN > 0
 546          INT8U  OSQPostOpt (OS_EVENT *pevent, void *msg, INT8U opt) KCREENTRANT
 547          {
 548   1      #if OS_CRITICAL_METHOD == 3                      /* Allocate storage for CPU status register           */
                  OS_CPU_SR  cpu_sr;
              #endif
 551   1          OS_Q      *pq;
C51 COMPILER V6.23a  OS_Q                                                                  12/09/2004 16:50:26 PAGE 10  

 552   1      

⌨️ 快捷键说明

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