os_mbox.ls1

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

LS1
498
字号
                     198     ;         return ((void *)0);
                     199     ;     }
                     200     ;     msg = pevent->OSEventPtr;
                     201     ;     if (msg != (void *)0) {                           /* See if there is already a messag
                             e             */
                     202     ;         pevent->OSEventPtr = (void *)0;               /* Clear the mailbox               
                                           */
                     203     ;         OS_EXIT_CRITICAL();
                     204     ;         *err = OS_NO_ERR;
                     205     ;     } else if (OSIntNesting > 0) {                    /* See if called from ISR ...      
                                           */
                     206     ;         OS_EXIT_CRITICAL();                           /* ... can't PEND from an ISR      
                                           */
                     207     ;         *err = OS_ERR_PEND_ISR;
                     208     ;     } else {
                     209     ;         OSTCBCur->OSTCBStat |= OS_STAT_MBOX;          /* Message not available, task will
                              pend         */
                     210     ;         OSTCBCur->OSTCBDly   = timeout;               /* Load timeout in TCB             
                                           */
                     211     ;         OSEventTaskWait(pevent);                      /* Suspend task until event or time
                             out occurs    */
                     212     ;         OS_EXIT_CRITICAL();
A51 MACRO ASSEMBLER  OS_MBOX                                                              09/09/2007 21:12:36 PAGE     5

                     213     ;         OSSched();                                    /* Find next highest priority task 
                             ready to run  */
                     214     ;         OS_ENTER_CRITICAL();
                     215     ;         if ((msg = OSTCBCur->OSTCBMsg) != (void *)0) {     /* See if we were given the me
                             ssage         */
                     216     ;             OSTCBCur->OSTCBMsg      = (void *)0;           /* Yes, clear message received
                                           */
                     217     ;             OSTCBCur->OSTCBStat     = OS_STAT_RDY;
                     218     ;             OSTCBCur->OSTCBEventPtr = (OS_EVENT *)0;       /* No longer waiting for event
                                           */
                     219     ;             OS_EXIT_CRITICAL();
                     220     ;             *err                    = OS_NO_ERR;
                     221     ;         } else if (OSTCBCur->OSTCBStat & OS_STAT_MBOX) {   /* If status is not OS_STAT_RD
                             Y, timed out  */
                     222     ;             OSEventTO(pevent);                             /* Make task ready            
                                           */
                     223     ;             OS_EXIT_CRITICAL();
                     224     ;             msg                     = (void *)0;           /* Set message contents to NUL
                             L             */
                     225     ;             *err                    = OS_TIMEOUT;          /* Indicate that a timeout occ
                             ured          */
                     226     ;         } else {
                     227     ;             msg                     = pevent->OSEventPtr;  /* Message received           
                                           */
                     228     ;             pevent->OSEventPtr      = (void *)0;           /* Clear the mailbox          
                                           */
                     229     ;             OSTCBCur->OSTCBEventPtr = (OS_EVENT *)0;
                     230     ;             OS_EXIT_CRITICAL();
                     231     ;             *err                    = OS_NO_ERR;
                     232     ;         }
                     233     ;     }
                     234     ;     return (msg);                                          /* Return the message received
                              (or NULL)    */
                     235     ; }
                     236     ; /*$PAGE*/
                     237     ; /*
                     238     ; *****************************************************************************************
                             ****************
                     239     ; *                                       POST MESSAGE TO A MAILBOX
                     240     ; *
                     241     ; * Description: This function sends a message to a mailbox
                     242     ; *
                     243     ; * Arguments  : pevent        is a pointer to the event control block associated with the 
                             desired mailbox
                     244     ; *
                     245     ; *              msg           is a pointer to the message to send.  You MUST NOT send a NU
                             LL pointer.  
                     246     ; *
                     247     ; * Returns    : OS_NO_ERR          The call was successful and the message was sent
                     248     ; *              OS_MBOX_FULL       If the mailbox already contains a message.  You can can
                              only send one
                     249     ; *                                 message at a time and thus, the message MUST be consume
                             d before you are
                     250     ; *                                 allowed to send another one.
                     251     ; *              OS_ERR_EVENT_TYPE  If you are attempting to post to a non mailbox.
                     252     ; *****************************************************************************************
                             ****************
                     253     ; */
                     254     ; 
                     255     ; INT8U OSMboxPost (OS_EVENT *pevent, void *msg) reentrant
                     256     ; {
                     257     ;     OS_ENTER_CRITICAL();
                     258     ;     if (pevent->OSEventType != OS_EVENT_TYPE_MBOX) {  /* Validate event block type       
                                           */
                     259     ;         OS_EXIT_CRITICAL();
                     260     ;         return (OS_ERR_EVENT_TYPE);
A51 MACRO ASSEMBLER  OS_MBOX                                                              09/09/2007 21:12:36 PAGE     6

                     261     ;     }
                     262     ;     if (pevent->OSEventGrp) {                         /* See if any task pending on mailb
                             ox            */
                     263     ;         OSEventTaskRdy(pevent, msg, OS_STAT_MBOX);    /* Ready highest priority task wait
                             ing on event  */
                     264     ;         OS_EXIT_CRITICAL();
                     265     ;         OSSched();                                    /* Find highest priority task ready
                              to run       */
                     266     ;         return (OS_NO_ERR);
                     267     ;     } else {
                     268     ;         if (pevent->OSEventPtr != (void *)0) {        /* Make sure mailbox doesn't alread
                             y have a msg  */
                     269     ;             OS_EXIT_CRITICAL();
                     270     ;             return (OS_MBOX_FULL);
                     271     ;         } else {
                     272     ;             pevent->OSEventPtr = msg;                 /* Place message in mailbox        
                                           */
                     273     ;             OS_EXIT_CRITICAL();
                     274     ;             return (OS_NO_ERR);
                     275     ;         }
                     276     ;     }
                     277     ; }
                     278     ; /*$PAGE*/
                     279     ; /*
                     280     ; *****************************************************************************************
                             ****************
                     281     ; *                                        QUERY A MESSAGE MAILBOX
                     282     ; *
                     283     ; * Description: This function obtains information about a message mailbox.
                     284     ; *
                     285     ; * Arguments  : pevent        is a pointer to the event control block associated with the 
                             desired mailbox
                     286     ; *
                     287     ; *              pdata         is a pointer to a structure that will contain information ab
                             out the message
                     288     ; *                            mailbox.
                     289     ; *
                     290     ; * Returns    : OS_NO_ERR          The call was successful and the message was sent
                     291     ; *              OS_ERR_EVENT_TYPE  If you are attempting to obtain data from a non mailbox
                             .
                     292     ; *****************************************************************************************
                             ****************
                     293     ; */
                     294     ; 
                     295     ; INT8U OSMboxQuery (OS_EVENT *pevent, OS_MBOX_DATA *ppdata) reentrant
                     296     ; {
                     297     ;     INT8U  i;
                     298     ;     INT8U *psrc;
                     299     ;     INT8U *pdest;
                     300     ;     
                     301     ;     
                     302     ;     OS_ENTER_CRITICAL();
                     303     ;     if (pevent->OSEventType != OS_EVENT_TYPE_MBOX) {       /* Validate event block type  
                                           */
                     304     ;         OS_EXIT_CRITICAL();
                     305     ;         return (OS_ERR_EVENT_TYPE);
                     306     ;     }
                     307     ;     ppdata->OSEventGrp = pevent->OSEventGrp;                /* Copy message mailbox wait 
                             list           */
                     308     ;     psrc              = &pevent->OSEventTbl[0];
                     309     ;     pdest             = &ppdata->OSEventTbl[0];
                     310     ;     for (i = 0; i < OS_EVENT_TBL_SIZE; i++) {
                     311     ;         *pdest++ = *psrc++;   
                     312     ;     }
                     313     ;     ppdata->OSMsg = pevent->OSEventPtr;                     /* Get message from mailbox  
                                            */
A51 MACRO ASSEMBLER  OS_MBOX                                                              09/09/2007 21:12:36 PAGE     7

                     314     ;     OS_EXIT_CRITICAL();
                     315     ;     return (OS_NO_ERR);
                     316     ; }
                     317     ; #endif
                     318     ; *** sync lost ***
                     319     ; *** sync lost ***
                     320     ; *** sync lost ***
                     321             END
A51 MACRO ASSEMBLER  OS_MBOX                                                              09/09/2007 21:12:36 PAGE     8

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_MBOX. . . . . .  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_MBOX                                                              09/09/2007 21:12:36 PAGE     9

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 + -
显示快捷键?