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

📄 os_mbox.lst

📁 ucos2.52在msp430上移植
💻 LST
📖 第 1 页 / 共 5 页
字号:
    238          void  *OSMboxPend (OS_EVENT *pevent, INT16U timeout, INT8U *err)
    239          {
   \   011A  0A12              PUSH    R10     
   \   011C  0B12              PUSH    R11     
   \   011E  0A4C              MOV     R12,R10 
   \   0120  1B410600          MOV     6(SP),R11       
    240          #if OS_CRITICAL_METHOD == 3                      /* Allocate storage for CPU status register           */
    241              OS_CPU_SR  cpu_sr;
    242          #endif    
    243              void      *msg;
    244          
    245          
    246              if (OSIntNesting > 0) {                           /* See if called from ISR ...                    */
   \   0124  C2930000          CMP.B   #0,&OSIntNesting        
   \   0128  0424              JEQ     (?0090) 
    247                  *err = OS_ERR_PEND_ISR;                       /* ... can't PEND from an ISR                    */
   \   012A  EB430000          MOV.B   #2,0(R11)       
    248                  return ((void *)0);
   \   012E  0C43              MOV     #0,R12  
    249              }
   \   0130  453C              JMP     (?0099) 
   \   0132            ?0090:
    250          #if OS_ARG_CHK_EN > 0
    251              if (pevent == (OS_EVENT *)0) {                    /* Validate 'pevent'                             */
   \   0132  0A93              CMP     #0,R10  
   \   0134  0420              JNE     (?0092) 
    252                  *err = OS_ERR_PEVENT_NULL;
   \   0136  EB420000          MOV.B   #4,0(R11)       
    253                  return ((void *)0);
   \   013A  0C43              MOV     #0,R12  
    254              }
   \   013C  3F3C              JMP     (?0099) 
   \   013E            ?0092:
    255              if (pevent->OSEventType != OS_EVENT_TYPE_MBOX) {  /* Validate event block type                     */
   \   013E  5C43              MOV.B   #1,R12  
   \   0140  6C9A              CMP.B   @R10,R12        
   \   0142  0424              JEQ     (?0094) 
    256                  *err = OS_ERR_EVENT_TYPE;
   \   0144  DB430000          MOV.B   #1,0(R11)       
    257                  return ((void *)0);
   \   0148  0C43              MOV     #0,R12  
    258              }
   \   014A  383C              JMP     (?0099) 
   \   014C            ?0094:
    259          #endif
    260              OS_ENTER_CRITICAL();
   \   014C  32C2              DINT            
    261              msg = pevent->OSEventPtr;
   \   014E  1C4A0400          MOV     4(R10),R12      
    262              if (msg != (void *)0) {                           /* See if there is already a message             */
   \   0152  0C93              CMP     #0,R12  
   \   0154  0624              JEQ     (?0096) 
    263                  pevent->OSEventPtr = (void *)0;               /* Clear the mailbox                             */
   \   0156  8A430400          MOV     #0,4(R10)       
    264                  OS_EXIT_CRITICAL();
   \   015A  32D2              EINT            
    265                  *err = OS_NO_ERR;
   \   015C  CB430000          MOV.B   #0,0(R11)       
    266                  return (msg);                                 /* Return the message received (or NULL)         */
    267              }
   \   0160  2D3C              JMP     (?0099) 
   \   0162            ?0096:
    268              OSTCBCur->OSTCBStat |= OS_STAT_MBOX;              /* Message not available, task will pend         */
   \   0162  1C420000          MOV     &OSTCBCur,R12   
   \   0166  ECD31C00          BIS.B   #2,28(R12)      
    269              OSTCBCur->OSTCBDly   = timeout;                   /* Load timeout in TCB                           */
   \   016A  1C420000          MOV     &OSTCBCur,R12   
   \   016E  8C4E1A00          MOV     R14,26(R12)     
    270              OS_EventTaskWait(pevent);                         /* Suspend task until event or timeout occurs    */
   \   0172  0C4A              MOV     R10,R12 
   \   0174  B0120000          CALL    #OS_EventTaskWait       
    271              OS_EXIT_CRITICAL();
   \   0178  32D2              EINT            
    272              OS_Sched();                                       /* Find next highest priority task ready to run  */
   \   017A  B0120000          CALL    #OS_Sched       
    273              OS_ENTER_CRITICAL();
   \   017E  32C2              DINT            
    274              msg = OSTCBCur->OSTCBMsg;
   \   0180  1D420000          MOV     &OSTCBCur,R13   
   \   0184  1C4D1400          MOV     20(R13),R12     
    275              if (msg != (void *)0) {                           /* See if we were given the message              */
   \   0188  0C93              CMP     #0,R12  
   \   018A  1024              JEQ     (?0098) 
    276                  OSTCBCur->OSTCBMsg      = (void *)0;          /* Yes, clear message received                   */
   \   018C  1D420000          MOV     &OSTCBCur,R13   
   \   0190  8D431400          MOV     #0,20(R13)      
    277                  OSTCBCur->OSTCBStat     = OS_STAT_RDY;
   \   0194  1D420000          MOV     &OSTCBCur,R13   
   \   0198  CD431C00          MOV.B   #0,28(R13)      
    278                  OSTCBCur->OSTCBEventPtr = (OS_EVENT *)0;      /* No longer waiting for event                   */
   \   019C  1D420000          MOV     &OSTCBCur,R13   
   \   01A0  8D431200          MOV     #0,18(R13)      
    279                  OS_EXIT_CRITICAL();
   \   01A4  32D2              EINT            
    280                  *err                    = OS_NO_ERR;
   \   01A6  CB430000          MOV.B   #0,0(R11)       
    281                  return (msg);                                 /* Return the message received                   */
    282              }
   \   01AA  083C              JMP     (?0099) 
   \   01AC            ?0098:
    283              OS_EventTO(pevent);                               /* Timed out, Make task ready                    */
   \   01AC  0C4A              MOV     R10,R12 
   \   01AE  B0120000          CALL    #OS_EventTO     
    284              OS_EXIT_CRITICAL();
   \   01B2  32D2              EINT            
    285              *err = OS_TIMEOUT;                                /* Indicate that a timeout occured               */
   \   01B4  FB400A00          MOV.B   #10,0(R11)      
   \   01B8  0000
    286              return ((void *)0);                               /* Return a NULL message                         */
   \   01BA  0C43              MOV     #0,R12  
    287          }
   \   01BC            ?0099:
   \   01BC  3B41              POP     R11     
   \   01BE  3A41              POP     R10     
   \   01C0  3041              RET             
   \   01C2            OSMboxPost:
    288          /*$PAGE*/
    289          /*
    290          *********************************************************************************************************
    291          *                                       POST MESSAGE TO A MAILBOX
    292          *
    293          * Description: This function sends a message to a mailbox
    294          *
    295          * Arguments  : pevent        is a pointer to the event control block associated with the desired mailbox
    296          *
    297          *              msg           is a pointer to the message to send.  You MUST NOT send a NULL pointer.
    298          *
    299          * Returns    : OS_NO_ERR            The call was successful and the message was sent
    300          *              OS_MBOX_FULL         If the mailbox already contains a message.  You can can only send one
    301          *                                   message at a time and thus, the message MUST be consumed before you
    302          *                                   are allowed to send another one.
    303          *              OS_ERR_EVENT_TYPE    If you are attempting to post to a non mailbox.
    304          *              OS_ERR_PEVENT_NULL   If 'pevent' is a NULL pointer
    305          *              OS_ERR_POST_NULL_PTR If you are attempting to post a NULL pointer
    306          *********************************************************************************************************
    307          */
    308          
    309          #if OS_MBOX_POST_EN > 0
    310          INT8U  OSMboxPost (OS_EVENT *pevent, void *msg)
    311          {
    312          #if OS_CRITICAL_METHOD == 3                      /* Allocate storage for CPU status register           */
    313              OS_CPU_SR  cpu_sr;
    314          #endif    
    315              
    316              
    317          #if OS_ARG_CHK_EN > 0
    318              if (pevent == (OS_EVENT *)0) {                    /* Validate 'pevent'                             */
   \   01C2  0C93              CMP     #0,R12  
   \   01C4  0220              JNE     (?0101) 
    319                  return (OS_ERR_PEVENT_NULL);
   \   01C6  6C42              MOV.B   #4,R12  
    320              }
   \   01C8  3041              RET             
   \   01CA            ?0101:
    321              if (msg == (void *)0) {                           /* Make sure we are not posting a NULL pointer   */
   \   01CA  0E93              CMP     #0,R14  
   \   01CC  0320              JNE     (?0103) 
    322                  return (OS_ERR_POST_NULL_PTR);
   \   01CE  7C400300          MOV.B   #3,R12  
    323              }
   \   01D2  3041              RET             
   \   01D4            ?0103:
    324              if (pevent->OSEventType != OS_EVENT_TYPE_MBOX) {  /* Validate event block type                     */
   \   01D4  5D43              MOV.B   #1,R13  
   \   01D6  6D9C              CMP.B   @R12,R13        
   \   01D8  0224              JEQ     (?0105) 
    325                  return (OS_ERR_EVENT_TYPE);
   \   01DA  5C43              MOV.B   #1,R12  
    326              }
   \   01DC  3041              RET             
   \   01DE            ?0105:
    327          #endif
    328              OS_ENTER_CRITICAL();
   \   01DE  32C2              DINT            
    329              if (pevent->OSEventGrp != 0x00) {                 /* See if any task pending on mailbox            */
   \   01E0  CC930100          CMP.B   #0,1(R12)       
   \   01E4  0924              JEQ     (?0107) 
    330                  OS_EventTaskRdy(pevent, msg, OS_STAT_MBOX);   /* Ready highest priority task waiting on event  */
   \   01E6  6312              PUSH.B  #2      
   \   01E8  B0120000          CALL    #OS_EventTaskRdy        
   \   01EC  2153              ADD     #2,SP   
    331                  OS_EXIT_CRITICAL();
   \   01EE  32D2              EINT            
    332                  OS_Sched();                                   /* Find highest priority task ready to run       */
   \   01F0  B0120000          CALL    #OS_Sched       
    333                  return (OS_NO_ERR);
   \   01F4  4C43              MOV.B   #0,R12  
    334              }
   \   01F6  3041              RET             
   \   01F8            ?0107:
    335              if (pevent->OSEventPtr != (void *)0) {            /* Make sure mailbox doesn't already have a msg  */
   \   01F8  8C930400          CMP     #0,4(R12)       
   \   01FC  0424              JEQ     (?0109) 
    336                  OS_EXIT_CRITICAL();
   \   01FE  32D2              EINT            
    337                  return (OS_MBOX_FULL);
   \   0200  7C401400          MOV.B   #20,R12 
    338              }
   \   0204  3041              RET             
   \   0206            ?0109:
    339              pevent->OSEventPtr = msg;                         /* Place message in mailbox                      */
   \   0206  8C4E0400          MOV     R14,4(R12)      
    340              OS_EXIT_CRITICAL();
   \   020A  32D2              EINT            
    341              return (OS_NO_ERR);
   \   020C  4C43              MOV.B   #0,R12  
    342          }
   \   020E  3041              RET             
   \   0210            OSMboxPostOpt:
    343          #endif
    344          
    345          /*$PAGE*/

⌨️ 快捷键说明

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