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

📄 os_mutex.lst

📁 stm32+ucos-ii
💻 LST
📖 第 1 页 / 共 5 页
字号:
    438          {
   \                     OSMutexPend:
   \   00000000   2DE9F24F           PUSH     {R1,R4-R11,LR}
   \   00000004   82B0               SUB      SP,SP,#+8
   \   00000006   0400               MOVS     R4,R0
   \   00000008   1500               MOVS     R5,R2
    439              INT8U      pcp;                                        /* Priority Ceiling Priority (PCP)          */
    440              INT8U      mprio;                                      /* Mutex owner priority                     */
    441              BOOLEAN    rdy;                                        /* Flag indicating task was ready           */
    442              OS_TCB    *ptcb;
    443              OS_EVENT  *pevent2;
    444              INT8U      y;
    445          #if OS_CRITICAL_METHOD == 3u                               /* Allocate storage for CPU status register */
    446              OS_CPU_SR  cpu_sr = 0u;
   \   0000000A   5FF0000B           MOVS     R11,#+0
    447          #endif
    448          
    449          
    450          
    451          #ifdef OS_SAFETY_CRITICAL
    452              if (perr == (INT8U *)0) {
    453                  OS_SAFETY_CRITICAL_EXCEPTION();
    454                  return;
    455              }
    456          #endif
    457          
    458          #if OS_ARG_CHK_EN > 0u
    459              if (pevent == (OS_EVENT *)0) {                         /* Validate 'pevent'                        */
    460                  *perr = OS_ERR_PEVENT_NULL;
    461                  return;
    462              }
    463          #endif
    464              if (pevent->OSEventType != OS_EVENT_TYPE_MUTEX) {      /* Validate event block type                */
   \   0000000E   2078               LDRB     R0,[R4, #+0]
   \   00000010   0428               CMP      R0,#+4
   \   00000012   02D0               BEQ.N    ??OSMutexPend_0
    465                  *perr = OS_ERR_EVENT_TYPE;
   \   00000014   0120               MOVS     R0,#+1
   \   00000016   2870               STRB     R0,[R5, #+0]
    466                  return;
   \   00000018   49E1               B.N      ??OSMutexPend_1
    467              }
    468              if (OSIntNesting > 0u) {                               /* See if called from ISR ...               */
   \                     ??OSMutexPend_0:
   \   0000001A   ........           LDR.W    R0,??DataTable7
   \   0000001E   0078               LDRB     R0,[R0, #+0]
   \   00000020   0028               CMP      R0,#+0
   \   00000022   02D0               BEQ.N    ??OSMutexPend_2
    469                  *perr = OS_ERR_PEND_ISR;                           /* ... can't PEND from an ISR               */
   \   00000024   0220               MOVS     R0,#+2
   \   00000026   2870               STRB     R0,[R5, #+0]
    470                  return;
   \   00000028   41E1               B.N      ??OSMutexPend_1
    471              }
    472              if (OSLockNesting > 0u) {                              /* See if called with scheduler locked ...  */
   \                     ??OSMutexPend_2:
   \   0000002A   ........           LDR.W    R0,??DataTable7_4
   \   0000002E   0078               LDRB     R0,[R0, #+0]
   \   00000030   0028               CMP      R0,#+0
   \   00000032   02D0               BEQ.N    ??OSMutexPend_3
    473                  *perr = OS_ERR_PEND_LOCKED;                        /* ... can't PEND when locked               */
   \   00000034   0D20               MOVS     R0,#+13
   \   00000036   2870               STRB     R0,[R5, #+0]
    474                  return;
   \   00000038   39E1               B.N      ??OSMutexPend_1
    475              }
    476          /*$PAGE*/
    477              OS_ENTER_CRITICAL();
   \                     ??OSMutexPend_3:
   \   0000003A   ........           BL       OS_CPU_SR_Save
   \   0000003E   8346               MOV      R11,R0
    478              pcp = (INT8U)(pevent->OSEventCnt >> 8u);               /* Get PCP from mutex                       */
   \   00000040   2089               LDRH     R0,[R4, #+8]
   \   00000042   80B2               UXTH     R0,R0            ;; ZeroExt  R0,R0,#+16,#+16
   \   00000044   000A               LSRS     R0,R0,#+8
   \   00000046   0600               MOVS     R6,R0
    479                                                                     /* Is Mutex available?                      */
    480              if ((INT8U)(pevent->OSEventCnt & OS_MUTEX_KEEP_LOWER_8) == OS_MUTEX_AVAILABLE) {
   \   00000048   2089               LDRH     R0,[R4, #+8]
   \   0000004A   C0B2               UXTB     R0,R0            ;; ZeroExt  R0,R0,#+24,#+24
   \   0000004C   FF28               CMP      R0,#+255
   \   0000004E   26D1               BNE.N    ??OSMutexPend_4
    481                  pevent->OSEventCnt &= OS_MUTEX_KEEP_UPPER_8;       /* Yes, Acquire the resource                */
   \   00000050   2089               LDRH     R0,[R4, #+8]
   \   00000052   10F47F40           ANDS     R0,R0,#0xFF00
   \   00000056   2081               STRH     R0,[R4, #+8]
    482                  pevent->OSEventCnt |= OSTCBCur->OSTCBPrio;         /*      Save priority of owning task        */
   \   00000058   2089               LDRH     R0,[R4, #+8]
   \   0000005A   ........           LDR.W    R1,??DataTable7_1
   \   0000005E   0968               LDR      R1,[R1, #+0]
   \   00000060   91F83610           LDRB     R1,[R1, #+54]
   \   00000064   0843               ORRS     R0,R1,R0
   \   00000066   2081               STRH     R0,[R4, #+8]
    483                  pevent->OSEventPtr  = (void *)OSTCBCur;            /*      Point to owning task's OS_TCB       */
   \   00000068   ........           LDR.W    R0,??DataTable7_1
   \   0000006C   0068               LDR      R0,[R0, #+0]
   \   0000006E   6060               STR      R0,[R4, #+4]
    484                  if ((pcp != OS_PRIO_MUTEX_CEIL_DIS) &&
    485                      (OSTCBCur->OSTCBPrio <= pcp)) {                /*      PCP 'must' have a SMALLER prio ...  */
   \   00000070   F6B2               UXTB     R6,R6            ;; ZeroExt  R6,R6,#+24,#+24
   \   00000072   FF2E               CMP      R6,#+255
   \   00000074   0DD0               BEQ.N    ??OSMutexPend_5
   \   00000076   ........           LDR.W    R0,??DataTable7_1
   \   0000007A   0068               LDR      R0,[R0, #+0]
   \   0000007C   90F83600           LDRB     R0,[R0, #+54]
   \   00000080   F6B2               UXTB     R6,R6            ;; ZeroExt  R6,R6,#+24,#+24
   \   00000082   8642               CMP      R6,R0
   \   00000084   05D3               BCC.N    ??OSMutexPend_5
    486                       OS_EXIT_CRITICAL();                           /*      ... than current task!              */
   \   00000086   5846               MOV      R0,R11
   \   00000088   ........           BL       OS_CPU_SR_Restore
    487                      *perr = OS_ERR_PCP_LOWER;
   \   0000008C   7820               MOVS     R0,#+120
   \   0000008E   2870               STRB     R0,[R5, #+0]
   \   00000090   04E0               B.N      ??OSMutexPend_6
    488                  } else {
    489                       OS_EXIT_CRITICAL();
   \                     ??OSMutexPend_5:
   \   00000092   5846               MOV      R0,R11
   \   00000094   ........           BL       OS_CPU_SR_Restore
    490                      *perr = OS_ERR_NONE;
   \   00000098   0020               MOVS     R0,#+0
   \   0000009A   2870               STRB     R0,[R5, #+0]
    491                  }
    492                  return;
   \                     ??OSMutexPend_6:
   \   0000009C   07E1               B.N      ??OSMutexPend_1
    493              }
    494              if (pcp != OS_PRIO_MUTEX_CEIL_DIS) {
   \                     ??OSMutexPend_4:
   \   0000009E   F6B2               UXTB     R6,R6            ;; ZeroExt  R6,R6,#+24,#+24
   \   000000A0   FF2E               CMP      R6,#+255
   \   000000A2   00F0BB80           BEQ.W    ??OSMutexPend_7
    495                  mprio = (INT8U)(pevent->OSEventCnt & OS_MUTEX_KEEP_LOWER_8); /*  Get priority of mutex owner   */
   \   000000A6   2089               LDRH     R0,[R4, #+8]
   \   000000A8   8DF80000           STRB     R0,[SP, #+0]
    496                  ptcb  = (OS_TCB *)(pevent->OSEventPtr);                   /*     Point to TCB of mutex owner   */
   \   000000AC   6068               LDR      R0,[R4, #+4]
   \   000000AE   8046               MOV      R8,R0
    497                  if (ptcb->OSTCBPrio > pcp) {                              /*     Need to promote prio of owner?*/
   \   000000B0   98F83600           LDRB     R0,[R8, #+54]
   \   000000B4   F6B2               UXTB     R6,R6            ;; ZeroExt  R6,R6,#+24,#+24
   \   000000B6   8642               CMP      R6,R0
   \   000000B8   80F0B080           BCS.W    ??OSMutexPend_7
    498                      if (mprio > OSTCBCur->OSTCBPrio) {
   \   000000BC   ........           LDR.W    R0,??DataTable7_1
   \   000000C0   0068               LDR      R0,[R0, #+0]
   \   000000C2   90F83600           LDRB     R0,[R0, #+54]
   \   000000C6   9DF80010           LDRB     R1,[SP, #+0]
   \   000000CA   8842               CMP      R0,R1
   \   000000CC   80F0A680           BCS.W    ??OSMutexPend_7
    499                          y = ptcb->OSTCBY;
   \   000000D0   98F83800           LDRB     R0,[R8, #+56]
   \   000000D4   8246               MOV      R10,R0
    500                          if ((OSRdyTbl[y] & ptcb->OSTCBBitX) != 0u) {      /*     See if mutex owner is ready   */
   \   000000D6   5FFA8AFA           UXTB     R10,R10          ;; ZeroExt  R10,R10,#+24,#+24
   \   000000DA   ........           LDR.W    R0,??DataTable7_5
   \   000000DE   1AF80000           LDRB     R0,[R10, R0]
   \   000000E2   98F83910           LDRB     R1,[R8, #+57]
   \   000000E6   0840               ANDS     R0,R1,R0
   \   000000E8   C0B2               UXTB     R0,R0            ;; ZeroExt  R0,R0,#+24,#+24
   \   000000EA   0028               CMP      R0,#+0
   \   000000EC   22D0               BEQ.N    ??OSMutexPend_8
    501                              OSRdyTbl[y] &= (OS_PRIO)~ptcb->OSTCBBitX;     /*     Yes, Remove owner from Rdy ...*/
   \   000000EE   5FFA8AFA           UXTB     R10,R10          ;; ZeroExt  R10,R10,#+24,#+24
   \   000000F2   ........           LDR.W    R0,??DataTable7_5
   \   000000F6   1AF80000           LDRB     R0,[R10, R0]
   \   000000FA   98F83910           LDRB     R1,[R8, #+57]
   \   000000FE   8843               BICS     R0,R0,R1
   \   00000100   5FFA8AFA           UXTB     R10,R10          ;; ZeroExt  R10,R10,#+24,#+24
   \   00000104   ........           LDR.W    R1,??DataTable7_5
   \   00000108   0AF80100           STRB     R0,[R10, R1]
    502                              if (OSRdyTbl[y] == 0u) {                      /*          ... list at current prio */
   \   0000010C   5FFA8AFA           UXTB     R10,R10          ;; ZeroExt  R10,R10,#+24,#+24
   \   00000110   ........           LDR.W    R0,??DataTable7_5
   \   00000114   1AF80000           LDRB     R0,[R10, R0]
   \   00000118   0028               CMP      R0,#+0
   \   0000011A   08D1               BNE.N    ??OSMutexPend_9
    503                                  OSRdyGrp &= (OS_PRIO)~ptcb->OSTCBBitY;
   \   0000011C   ........           LDR.W    R0,??DataTable7_6
   \   00000120   0078               LDRB     R0,[R0, #+0]
   \   00000122   98F83A10           LDRB     R1,[R8, #+58]
   \   00000126   8843               BICS     R0,R0,R1
   \   00000128   ........           LDR.W    R1,??DataTable7_6
   \   0000012C   0870               STRB     R0,[R1, #+0]
    504                              }
    505                              rdy = OS_TRUE;
   \                     ??OSMutexPend_9:
   \   0000012E   0120               MOVS     R0,#+1
   \   00000130   0700               MOVS     R7,R0
   \   00000132   25E0               B.N      ??OSMutexPend_10
    506                          } else {
    507                              pevent2 = ptcb->OSTCBEventPtr;
   \                     ??OSMutexPend_8:
   \   00000134   D8F81C00           LDR      R0,[R8, #+28]
   \   00000138   8146               MOV      R9,R0
    508                              if (pevent2 != (OS_EVENT *)0) {               /* Remove from event wait list       */
   \   0000013A   B9F1000F           CMP      R9,#+0
   \   0000013E   1DD0               BEQ.N    ??OSMutexPend_11
    509                                  y = ptcb->OSTCBY;
   \ 

⌨️ 快捷键说明

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