os_q.ls1

来自「在51单片机上移植成功的UCOS-II操作系统源代码,包括源代码及相关注释」· LS1 代码 · 共 740 行 · 第 1/4 页

LS1
740
字号
                     425     ; */
                     426     ; 
                     427     ; INT8U OSQPostFront (OS_EVENT *pevent, void *msg) reentrant
                     428     ; {
                     429     ;     OS_Q   *pq;
                     430     ; 
                     431     ; 
                     432     ;     OS_ENTER_CRITICAL();
                     433     ;     if (pevent->OSEventType != OS_EVENT_TYPE_Q) {     /* Validate event block type       
                                           */
                     434     ;         OS_EXIT_CRITICAL();
                     435     ;         return (OS_ERR_EVENT_TYPE);
                     436     ;     }
                     437     ;     if (pevent->OSEventGrp) {                         /* See if any task pending on queue
                                           */
                     438     ;         OSEventTaskRdy(pevent, msg, OS_STAT_Q);       /* Ready highest priority task wait
                             ing on event  */
                     439     ;         OS_EXIT_CRITICAL();
                     440     ;         OSSched();                                    /* Find highest priority task ready
                              to run       */
                     441     ;         return (OS_NO_ERR);
                     442     ;     } else {
                     443     ;         pq = pevent->OSEventPtr;                      /* Point to queue control block    
                                           */
                     444     ;         if (pq->OSQEntries >= pq->OSQSize) {          /* Make sure queue is not full     
                                           */
                     445     ;             OS_EXIT_CRITICAL();
                     446     ;             return (OS_Q_FULL);
                     447     ;         } else {
                     448     ;             if (pq->OSQOut == pq->OSQStart) {         /* Wrap OUT ptr if we are at the 1s
                             t queue entry */
                     449     ;                 pq->OSQOut = pq->OSQEnd;
                     450     ;             }
                     451     ;             pq->OSQOut--;
                     452     ;             *pq->OSQOut = msg;                        /* Insert message into queue       
                                           */
                     453     ;             pq->OSQEntries++;                         /* Update the nbr of entries in the
                              queue        */
                     454     ;             OS_EXIT_CRITICAL();
                     455     ;         }
                     456     ;         return (OS_NO_ERR);
                     457     ;     }
                     458     ; }
                     459     ; /*$PAGE*/
                     460     ; /*
                     461     ; *****************************************************************************************
                             ****************
                     462     ; *                                        QUERY A MESSAGE QUEUE
                     463     ; *
                     464     ; * Description: This function obtains information about a message queue.
                     465     ; *
                     466     ; * Arguments  : pevent        is a pointer to the event control block associated with the 
                             desired mailbox
                     467     ; *
                     468     ; *              pdata         is a pointer to a structure that will contain information ab
                             out the message
A51 MACRO ASSEMBLER  OS_Q                                                                 09/09/2007 21:12:59 PAGE    10

                     469     ; *                            queue.
                     470     ; *
                     471     ; * Returns    : OS_NO_ERR          The call was successful and the message was sent
                     472     ; *              OS_ERR_EVENT_TYPE  If you are attempting to obtain data from a non queue.
                     473     ; *****************************************************************************************
                             ****************
                     474     ; */
                     475     ; 
                     476     ; INT8U OSQQuery (OS_EVENT *pevent, OS_Q_DATA *ppdata) reentrant
                     477     ; {
                     478     ;     OS_Q   *pq;
                     479     ;     INT8U   i;
                     480     ;     INT8U  *psrc;
                     481     ;     INT8U  *pdest;
                     482     ;     
                     483     ;     
                     484     ;     OS_ENTER_CRITICAL();
                     485     ;     if (pevent->OSEventType != OS_EVENT_TYPE_Q) {          /* Validate event block type  
                                           */
                     486     ;         OS_EXIT_CRITICAL();
                     487     ;         return (OS_ERR_EVENT_TYPE);
                     488     ;     }
                     489     ;     ppdata->OSEventGrp = pevent->OSEventGrp;                /* Copy message mailbox wait 
                             list           */
                     490     ;     psrc              = &pevent->OSEventTbl[0];
                     491     ;     pdest             = &ppdata->OSEventTbl[0];
                     492     ;     for (i = 0; i < OS_EVENT_TBL_SIZE; i++) {
                     493     ;         *pdest++ = *psrc++;   
                     494     ;     }
                     495     ;     pq = (OS_Q *)pevent->OSEventPtr;
                     496     ;     if (pq->OSQEntries > 0) {
                     497     ;         ppdata->OSMsg = pq->OSQOut;                         /* Get next message to return
                              if available  */
                     498     ;     } else {
                     499     ;         ppdata->OSMsg = (void *)0;
                     500     ;     }
                     501     ;     ppdata->OSNMsgs = pq->OSQEntries;
                     502     ;     ppdata->OSQSize = pq->OSQSize;
                     503     ;     OS_EXIT_CRITICAL();
                     504     ;     return (OS_NO_ERR);
                     505     ; }
                     506     ; #endif
                     507     ; *** sync lost ***
                     508     ; *** sync lost ***
                     509     ; *** sync lost ***
                     510             END
A51 MACRO ASSEMBLER  OS_Q                                                                 09/09/2007 21:12:59 PAGE    11

SYMBOL TABLE LISTING
------ ----- -------


N A M E             T Y P E  V A L U E   ATTRIBUTES

AC . . . . . . . .  B ADDR   00D0H.6 A   
ACC. . . . . . . .  D ADDR   00E0H   A   
B. . . . . . . . .  D ADDR   00F0H   A   
CY . . . . . . . .  B ADDR   00D0H.7 A   
DPH. . . . . . . .  D ADDR   0083H   A   
DPL. . . . . . . .  D ADDR   0082H   A   
EA . . . . . . . .  B ADDR   00A8H.7 A   
ES . . . . . . . .  B ADDR   00A8H.4 A   
ET0. . . . . . . .  B ADDR   00A8H.1 A   
ET1. . . . . . . .  B ADDR   00A8H.3 A   
EX0. . . . . . . .  B ADDR   00A8H.0 A   
EX1. . . . . . . .  B ADDR   00A8H.2 A   
F0 . . . . . . . .  B ADDR   00D0H.5 A   
IE . . . . . . . .  D ADDR   00A8H   A   
IE0. . . . . . . .  B ADDR   0088H.1 A   
IE1. . . . . . . .  B ADDR   0088H.3 A   
INT0 . . . . . . .  B ADDR   00B0H.2 A   
INT1 . . . . . . .  B ADDR   00B0H.3 A   
IP . . . . . . . .  D ADDR   00B8H   A   
IT0. . . . . . . .  B ADDR   0088H.0 A   
IT1. . . . . . . .  B ADDR   0088H.2 A   
OS_Q . . . . . . .  N NUMB   -----       
OV . . . . . . . .  B ADDR   00D0H.2 A   
P. . . . . . . . .  B ADDR   00D0H.0 A   
P0 . . . . . . . .  D ADDR   0080H   A   
P1 . . . . . . . .  D ADDR   0090H   A   
P2 . . . . . . . .  D ADDR   00A0H   A   
P3 . . . . . . . .  D ADDR   00B0H   A   
PCON . . . . . . .  D ADDR   0087H   A   
PS . . . . . . . .  B ADDR   00B8H.4 A   
PSW. . . . . . . .  D ADDR   00D0H   A   
PT0. . . . . . . .  B ADDR   00B8H.1 A   
PT1. . . . . . . .  B ADDR   00B8H.3 A   
PX0. . . . . . . .  B ADDR   00B8H.0 A   
PX1. . . . . . . .  B ADDR   00B8H.2 A   
RB8. . . . . . . .  B ADDR   0098H.2 A   
RD . . . . . . . .  B ADDR   00B0H.7 A   
REN. . . . . . . .  B ADDR   0098H.4 A   
RI . . . . . . . .  B ADDR   0098H.0 A   
RS0. . . . . . . .  B ADDR   00D0H.3 A   
RS1. . . . . . . .  B ADDR   00D0H.4 A   
RXD. . . . . . . .  B ADDR   00B0H.0 A   
SBUF . . . . . . .  D ADDR   0099H   A   
SCON . . . . . . .  D ADDR   0098H   A   
SM0. . . . . . . .  B ADDR   0098H.7 A   
SM1. . . . . . . .  B ADDR   0098H.6 A   
SM2. . . . . . . .  B ADDR   0098H.5 A   
SP . . . . . . . .  D ADDR   0081H   A   
T0 . . . . . . . .  B ADDR   00B0H.4 A   
T1 . . . . . . . .  B ADDR   00B0H.5 A   
TB8. . . . . . . .  B ADDR   0098H.3 A   
TCON . . . . . . .  D ADDR   0088H   A   
TF0. . . . . . . .  B ADDR   0088H.5 A   
TF1. . . . . . . .  B ADDR   0088H.7 A   
TH0. . . . . . . .  D ADDR   008CH   A   
TH1. . . . . . . .  D ADDR   008DH   A   
TI . . . . . . . .  B ADDR   0098H.1 A   
TL0. . . . . . . .  D ADDR   008AH   A   
TL1. . . . . . . .  D ADDR   008BH   A   
TMOD . . . . . . .  D ADDR   0089H   A   
A51 MACRO ASSEMBLER  OS_Q                                                                 09/09/2007 21:12:59 PAGE    12

TR0. . . . . . . .  B ADDR   0088H.4 A   
TR1. . . . . . . .  B ADDR   0088H.6 A   
TXD. . . . . . . .  B ADDR   00B0H.1 A   
WR . . . . . . . .  B ADDR   00B0H.6 A   


REGISTER BANK(S) USED: 0 

ASSEMBLY COMPLETE.  0 WARNING(S), 0 ERROR(S)

⌨️ 快捷键说明

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