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

📄 os_mutex.lst

📁 IAR project for MSP430 and uC/OS. All configured to start filling with tasks.
💻 LST
📖 第 1 页 / 共 5 页
字号:
   \   026C  7FE3              XOR.B   #-1,R15 
   \   026E  C2FF0000          AND.B   R15,&OSRdyGrp   
   \   0272            ?0110:
    349                      }
    350                      rdy = TRUE;
   \   0272  5F43              MOV.B   #1,R15  
    351                  } else {
   \   0274  013C              JMP     (?0111) 
   \   0276            ?0108:
    352                      rdy = FALSE;                                          /* No                                */
   \   0276  4F43              MOV.B   #0,R15  
   \   0278            ?0111:
    353                  }
    354                  ptcb->OSTCBPrio         = pip;                     /* Change owner task prio to PIP            */
   \   0278  CD4C1D00          MOV.B   R12,29(R13)     
    355                  ptcb->OSTCBY            = ptcb->OSTCBPrio >> 3;
   \   027C  584D1D00          MOV.B   29(R13),R8      
   \   0280  12C3              CLRC            
   \   0282  4810              RRC.B   R8      
   \   0284  4811              RRA.B   R8      
   \   0286  4811              RRA.B   R8      
   \   0288  CD481F00          MOV.B   R8,31(R13)      
    356                  ptcb->OSTCBBitY         = OSMapTbl[ptcb->OSTCBY];
   \   028C  584D1F00          MOV.B   31(R13),R8      
   \   0290  DD480000          MOV.B   OSMapTbl(R8),33(R13)    
   \   0294  2100
    357                  ptcb->OSTCBX            = ptcb->OSTCBPrio & 0x07;
   \   0296  584D1D00          MOV.B   29(R13),R8      
   \   029A  78F00700          AND.B   #7,R8   
   \   029E  CD481E00          MOV.B   R8,30(R13)      
    358                  ptcb->OSTCBBitX         = OSMapTbl[ptcb->OSTCBX];
   \   02A2  584D1E00          MOV.B   30(R13),R8      
   \   02A6  DD480000          MOV.B   OSMapTbl(R8),32(R13)    
   \   02AA  2000
    359                  if (rdy == TRUE) {                                 /* If task was ready at owner's priority ...*/
   \   02AC  5F93              CMP.B   #1,R15  
   \   02AE  0820              JNE     (?0113) 
    360                      OSRdyGrp               |= ptcb->OSTCBBitY;     /* ... make it ready at new priority.       */
   \   02B0  D2DD2100          BIS.B   33(R13),&OSRdyGrp       
   \   02B4  0000
    361                      OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
   \   02B6  5F4D1F00          MOV.B   31(R13),R15     
   \   02BA  DFDD2000          BIS.B   32(R13),OSRdyTbl(R15)   
   \   02BE  0000
   \   02C0            ?0113:
    362                  }
    363                  OSTCBPrioTbl[pip]       = (OS_TCB *)ptcb;
   \   02C0  0C5C              ADD     R12,R12 
   \   02C2  8C4D0000          MOV     R13,OSTCBPrioTbl(R12)   
   \   02C6            ?0104:
    364              }
    365              OSTCBCur->OSTCBStat |= OS_STAT_MUTEX;             /* Mutex not available, pend current task        */
   \   02C6  1C420000          MOV     &OSTCBCur,R12   
   \   02CA  FCD01000          BIS.B   #16,28(R12)     
   \   02CE  1C00
    366              OSTCBCur->OSTCBDly   = timeout;                   /* Store timeout in current task's TCB           */
   \   02D0  1C420000          MOV     &OSTCBCur,R12   
   \   02D4  8C4E1A00          MOV     R14,26(R12)     
    367              OS_EventTaskWait(pevent);                         /* Suspend task until event or timeout occurs    */
   \   02D8  0C4A              MOV     R10,R12 
   \   02DA  B0120000          CALL    #OS_EventTaskWait       
    368              OS_EXIT_CRITICAL();
   \   02DE  32D2              EINT            
    369              OS_Sched();                                        /* Find next highest priority task ready         */
   \   02E0  B0120000          CALL    #OS_Sched       
    370              OS_ENTER_CRITICAL();
   \   02E4  32C2              DINT            
    371              if (OSTCBCur->OSTCBStat & OS_STAT_MUTEX) {        /* Must have timed out if still waiting for event*/
   \   02E6  1C420000          MOV     &OSTCBCur,R12   
   \   02EA  FCB01000          BIT.B   #16,28(R12)     
   \   02EE  1C00
   \   02F0  0824              JEQ     (?0115) 
    372                  OS_EventTO(pevent);
   \   02F2  0C4A              MOV     R10,R12 
   \   02F4  B0120000          CALL    #OS_EventTO     
    373                  OS_EXIT_CRITICAL();
   \   02F8  32D2              EINT            
    374                  *err = OS_TIMEOUT;                            /* Indicate that we didn't get mutex within TO   */
   \   02FA  FB400A00          MOV.B   #10,0(R11)      
   \   02FE  0000
    375                  return;
    376              }
   \   0300  073C              JMP     (?0116) 
   \   0302            ?0115:
    377              OSTCBCur->OSTCBEventPtr = (OS_EVENT *)0;
   \   0302  1C420000          MOV     &OSTCBCur,R12   
   \   0306  8C431200          MOV     #0,18(R12)      
    378              OS_EXIT_CRITICAL();
   \   030A  32D2              EINT            
    379              *err = OS_NO_ERR;
   \   030C  CB430000          MOV.B   #0,0(R11)       
    380          }
   \   0310            ?0116:
   \   0310  3841              POP     R8      
   \   0312  3B41              POP     R11     
   \   0314  3A41              POP     R10     
   \   0316  3041              RET             
   \   0318            OSMutexPost:
    381          /*$PAGE*/
    382          /*
    383          *********************************************************************************************************
    384          *                                  POST TO A MUTUAL EXCLUSION SEMAPHORE
    385          *
    386          * Description: This function signals a mutual exclusion semaphore
    387          *
    388          * Arguments  : pevent              is a pointer to the event control block associated with the desired
    389          *                                  mutex.
    390          *
    391          * Returns    : OS_NO_ERR               The call was successful and the mutex was signaled.
    392          *              OS_ERR_EVENT_TYPE       If you didn't pass a pointer to a mutex
    393          *              OS_ERR_PEVENT_NULL      'pevent' is a NULL pointer
    394          *              OS_ERR_POST_ISR         Attempted to post from an ISR (not valid for MUTEXes)
    395          *              OS_ERR_NOT_MUTEX_OWNER  The task that did the post is NOT the owner of the MUTEX.
    396          *********************************************************************************************************
    397          */
    398          
    399          INT8U  OSMutexPost (OS_EVENT *pevent)
    400          {
   \   0318  0A12              PUSH    R10     
   \   031A  0A4C              MOV     R12,R10 
    401          #if OS_CRITICAL_METHOD == 3                           /* Allocate storage for CPU status register      */
    402              OS_CPU_SR  cpu_sr;
    403          #endif    
    404              INT8U      pip;                                   /* Priority inheritance priority                 */
    405              INT8U      prio;
    406          
    407          
    408              if (OSIntNesting > 0) {                           /* See if called from ISR ...                    */
   \   031C  C2930000          CMP.B   #0,&OSIntNesting        
   \   0320  0324              JEQ     (?0118) 
    409                  return (OS_ERR_POST_ISR);                     /* ... can't POST mutex from an ISR              */
   \   0322  7C400500          MOV.B   #5,R12  
    410              }
   \   0326  933C              JMP     (?0133) 
   \   0328            ?0118:
    411          #if OS_ARG_CHK_EN > 0
    412              if (pevent == (OS_EVENT *)0) {                    /* Validate 'pevent'                             */
   \   0328  0A93              CMP     #0,R10  
   \   032A  6C42              MOV.B   #4,R12  
   \   032C  9024              JEQ     (?0133) 
    413                  return (OS_ERR_PEVENT_NULL);
    414              }
    415              if (pevent->OSEventType != OS_EVENT_TYPE_MUTEX) { /* Validate event block type                     */
   \   032E  6C9A              CMP.B   @R10,R12        
   \   0330  0224              JEQ     (?0122) 
    416                  return (OS_ERR_EVENT_TYPE);
   \   0332  5C43              MOV.B   #1,R12  
    417              }                                                 
   \   0334  8C3C              JMP     (?0133) 
   \   0336            ?0122:
    418          #endif
    419              OS_ENTER_CRITICAL();
   \   0336  32C2              DINT            
    420              pip  = (INT8U)(pevent->OSEventCnt >> 8);          /* Get priority inheritance priority of mutex    */
   \   0338  1D4A0200          MOV     2(R10),R13      
   \   033C  8D10              SWPB    R13     
   \   033E  7DF3              AND.B   #-1,R13 
    421              prio = (INT8U)(pevent->OSEventCnt & OS_MUTEX_KEEP_LOWER_8);  /* Get owner's original priority      */
   \   0340  1C4A0200          MOV     2(R10),R12      
   \   0344  7CF3              AND.B   #255,R12        
    422              if (OSTCBCur->OSTCBPrio != pip && 
    423                  OSTCBCur->OSTCBPrio != prio) {                /* See if posting task owns the MUTEX            */
   \   0346  1E420000          MOV     &OSTCBCur,R14   
   \   034A  5D9E1D00          CMP.B   29(R14),R13     
   \   034E  0924              JEQ     (?0124) 
   \   0350  1E420000          MOV     &OSTCBCur,R14   
   \   0354  5C9E1D00          CMP.B   29(R14),R12     
   \   0358  0424              JEQ     (?0124) 
    424                  OS_EXIT_CRITICAL();
   \   035A  32D2              EINT            
    425                  return (OS_ERR_NOT_MUTEX_OWNER);
   \   035C  7C407800          MOV.B   #120,R12        
    426              }
   \   0360  763C              JMP     (?0133) 
   \   0362            ?0124:
    427              if (OSTCBCur->OSTCBPrio == pip) {                 /* Did we have to raise current task's priority? */
   \   0362  1E420000          MOV     &OSTCBCur,R14   
   \   0366  5D9E1D00          CMP.B   29(R14),R13     
   \   036A  4D20              JNE     (?0128) 
    428                                                                /* Yes, Return to original priority              */
    429                                                                /*      Remove owner from ready list at 'pip'    */
    430                  if ((OSRdyTbl[OSTCBCur->OSTCBY] &= ~OSTCBCur->OSTCBBitX) == 0) {
   \   036C  1E420000          MOV     &OSTCBCur,R14   
   \   0370  5E4E1F00          MOV.B   31(R14),R14     
   \   0374  1F420000          MOV     &OSTCBCur,R15   
   \   0378  5F4F2000          MOV.B   32(R15),R15     
   \   037C  7FE3              XOR.B   #-1,R15 
   \   037E  CEFF0000          AND.B   R15,OSRdyTbl(R14)       
   \   0382  CE930000          CMP.B   #0,OSRdyTbl(R14)        
   \   0386  0720              JNE     (?0130) 
    431                      OSRdyGrp &= ~OSTCBCur->OSTCBBitY;
   \   0388  1E420000          MOV     &OSTCBCur,R14   
   \   038C  5E4E2100          MOV.B   33(R14),R14     
   \   0390  7EE3              XOR.B   #-1,R14 
   \   0392  C2FE0000          AND.B   R14,&OSRdyGrp   
   \   0396            ?0130:
    432                  }
    433                  OSTCBCur->OSTCBPrio         = prio;
   \   0396  1E420000          MOV     &OSTCBCur,R14   
   \   039A  CE4C1D00          MOV.B   R12,29(R14)     
    434                  OSTCBCur->OSTCBY            = prio >> 3;
   \   039E  0E4C              MOV     R12,R14 
   \   03A0  12C3              CLRC            
   \   03A2  4E10              RRC.B   R14     
   \   03A4  4E11              RRA.B   R14     
   \   03A6  4E11              RRA.B   R14     
   \   03A8  1F420000          MOV     &OSTCBCur,R15   
   \   03AC  CF4E1F00          MOV.B   R14,31(R15)     
    435                  OSTCBCur->OSTCBBitY         = OSMapTbl[OSTCBCur->OSTCBY];
   \   03B0  1E420000          MOV     &OSTCBCur,R14   
   \   03B4  5E4E1F00          MOV.B   31(R14),R14     
   \   03B8  1F420000          MOV     &OSTCBCur,R15   
   \   03BC  DF4E0000          MOV.B   OSMapTbl(R14),33(R15)   
   \   03C0  2100
    436                  OSTCBCur->OSTCBX            = prio & 0x07;
   \   03C2  0E4C              MOV     R12,R14 
   \   03C4  7EF00700          AND.B   #7,R14  
   \   03C8  1F420000          MOV     &OSTCBCur,R15   
   \   03CC  CF4E1E00          MOV.B   R14,30(R15)     
    437                  OSTCBCur->OSTCBBitX         = OSMapTbl[OSTCBCur->OSTCBX];
   \   03D0  1E420000          MOV     &OSTCBCur,R14   

⌨️ 快捷键说明

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