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

📄 os_mutex.lst

📁 ARM仿真案例
💻 LST
📖 第 1 页 / 共 5 页
字号:
    321          {
   \                     OSMutexPend:
   \   00000000   F2B5               PUSH     {R1,R4-R7,LR}
   \   00000002   81B0               SUB      SP,SP,#+4
   \   00000004   0400               MOVS     R4,R0
   \   00000006   1500               MOVS     R5,R2
    322          #if OS_CRITICAL_METHOD == 3                                /* Allocate storage for CPU status register */
    323              OS_CPU_SR  cpu_sr;
    324          #endif    
    325              INT8U      pip;                                        /* Priority Inheritance Priority (PIP)      */
    326              INT8U      mprio;                                      /* Mutex owner priority                     */
    327              BOOLEAN    rdy;                                        /* Flag indicating task was ready           */
    328              OS_TCB    *ptcb;
    329              OS_EVENT  *pevent2;
    330              INT8U      y;
    331          
    332          
    333              if (OSIntNesting > 0) {                                /* See if called from ISR ...               */
   \   00000008   ....               LDR      R0,??DataTable13  ;; OSIntNesting
   \   0000000A   0078               LDRB     R0,[R0, #+0]
   \   0000000C   0028               CMP      R0,#+0
   \   0000000E   01D0               BEQ      ??OSMutexPend_0
    334                  *err = OS_ERR_PEND_ISR;                            /* ... can't PEND from an ISR               */
   \   00000010   0220               MOVS     R0,#+2
   \   00000012   E4E0               B.N      ??OSMutexPend_1
    335                  return;
    336              }
    337          #if OS_ARG_CHK_EN > 0
    338              if (pevent == (OS_EVENT *)0) {                         /* Validate 'pevent'                        */
   \                     ??OSMutexPend_0:
   \   00000014   002C               CMP      R4,#+0
   \   00000016   01D1               BNE      ??OSMutexPend_2
    339                  *err = OS_ERR_PEVENT_NULL;
   \   00000018   0420               MOVS     R0,#+4
   \   0000001A   E0E0               B.N      ??OSMutexPend_1
    340                  return;
    341              }
    342          #endif
    343              if (pevent->OSEventType != OS_EVENT_TYPE_MUTEX) {      /* Validate event block type                */
   \                     ??OSMutexPend_2:
   \   0000001C   2078               LDRB     R0,[R4, #+0]
   \   0000001E   0428               CMP      R0,#+4
   \   00000020   01D0               BEQ      ??OSMutexPend_3
    344                  *err = OS_ERR_EVENT_TYPE;
   \   00000022   0120               MOVS     R0,#+1
   \   00000024   DBE0               B.N      ??OSMutexPend_1
    345                  return;
    346              }
    347              OS_ENTER_CRITICAL();								   /* Is Mutex available?                      */
   \                     ??OSMutexPend_3:
   \   00000026   ........           _BLF     OS_CPU_SR_Save,??OS_CPU_SR_Save??rT
   \   0000002A   0600               MOVS     R6,R0
    348              if ((INT8U)(pevent->OSEventCnt & OS_MUTEX_KEEP_LOWER_8) == OS_MUTEX_AVAILABLE) {
   \   0000002C   6088               LDRH     R0,[R4, #+2]
   \   0000002E   0006               LSLS     R0,R0,#+24
   \   00000030   000E               LSRS     R0,R0,#+24
   \   00000032   FF28               CMP      R0,#+255
   \   00000034   6088               LDRH     R0,[R4, #+2]
   \   00000036   12D1               BNE      ??OSMutexPend_4
    349                  pevent->OSEventCnt &= OS_MUTEX_KEEP_UPPER_8;       /* Yes, Acquire the resource                */
   \   00000038   FF21               MOVS     R1,#+255
   \   0000003A   0902               LSLS     R1,R1,#+8        ;; #+65280
   \   0000003C   0140               ANDS     R1,R1,R0
   \   0000003E   6180               STRH     R1,[R4, #+2]
    350                  pevent->OSEventCnt |= OSTCBCur->OSTCBPrio;         /*      Save priority of owning task        */
   \   00000040   0800               MOVS     R0,R1
   \   00000042   ....               LDR      R1,??DataTable49  ;; OSTCBCur
   \   00000044   0968               LDR      R1,[R1, #+0]
   \   00000046   2D31               ADDS     R1,R1,#+45
   \   00000048   0978               LDRB     R1,[R1, #+0]
   \   0000004A   0143               ORRS     R1,R1,R0
   \   0000004C   6180               STRH     R1,[R4, #+2]
    351                  pevent->OSEventPtr  = (void *)OSTCBCur;            /*      Point to owning task's OS_TCB       */
   \   0000004E   ....               LDR      R0,??DataTable49  ;; OSTCBCur
   \   00000050   0068               LDR      R0,[R0, #+0]
   \   00000052   6060               STR      R0,[R4, #+4]
    352                  OS_EXIT_CRITICAL();
   \   00000054   3000               MOVS     R0,R6
   \   00000056   ........           _BLF     OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rT
    353                  *err  = OS_NO_ERR;
   \   0000005A   0020               MOVS     R0,#+0
   \   0000005C   BFE0               B.N      ??OSMutexPend_1
    354                  return;
    355              }
    356              pip   = (INT8U)(pevent->OSEventCnt >> 8);                     /* No, Get PIP from mutex            */
   \                     ??OSMutexPend_4:
   \   0000005E   000A               LSRS     R0,R0,#+8
    357              mprio = (INT8U)(pevent->OSEventCnt & OS_MUTEX_KEEP_LOWER_8);  /*     Get priority of mutex owner   */
   \   00000060   6288               LDRH     R2,[R4, #+2]
   \   00000062   1206               LSLS     R2,R2,#+24
   \   00000064   120E               LSRS     R2,R2,#+24
    358              ptcb  = (OS_TCB *)(pevent->OSEventPtr);                       /*     Point to TCB of mutex owner   */
   \   00000066   6168               LDR      R1,[R4, #+4]
    359              if (ptcb->OSTCBPrio != pip && mprio > OSTCBCur->OSTCBPrio) {  /*     Need to promote prio of owner?*/
   \   00000068   2D23               MOVS     R3,#+45
   \   0000006A   CB5C               LDRB     R3,[R1, R3]
   \   0000006C   8342               CMP      R3,R0
   \   0000006E   ....               BNE      .+5
   \   00000070   85E0               B        ??OSMutexPend_5
   \   00000072   ....               LDR      R3,??DataTable49  ;; OSTCBCur
   \   00000074   1B68               LDR      R3,[R3, #+0]
   \   00000076   2D33               ADDS     R3,R3,#+45
   \   00000078   1B78               LDRB     R3,[R3, #+0]
   \   0000007A   9342               CMP      R3,R2
   \   0000007C   ....               BCC      .+5
   \   0000007E   7EE0               B        ??OSMutexPend_5
    360                  y = ptcb->OSTCBY;                          
   \   00000080   2F22               MOVS     R2,#+47
   \   00000082   8A5C               LDRB     R2,[R1, R2]
   \   00000084   0092               STR      R2,[SP, #+0]
    361                  if ((OSRdyTbl[y] & ptcb->OSTCBBitX) != 0x00) {            /*     See if mutex owner is ready   */
   \   00000086   ....               LDR      R3,??DataTable58  ;; OSRdyTbl
   \   00000088   9A5C               LDRB     R2,[R3, R2]
   \   0000008A   3023               MOVS     R3,#+48
   \   0000008C   CB5C               LDRB     R3,[R1, R3]
   \   0000008E   1A42               TST      R2,R3
   \   00000090   1BD0               BEQ      ??OSMutexPend_6
    362                      OSRdyTbl[y] &= ~ptcb->OSTCBBitX;                      /*     Yes, Remove owner from Rdy ...*/
   \   00000092   009B               LDR      R3,[SP, #+0]
   \   00000094   1B06               LSLS     R3,R3,#+24
   \   00000096   1B0E               LSRS     R3,R3,#+24
   \   00000098   ....               LDR      R7,??DataTable58  ;; OSRdyTbl
   \   0000009A   9C46               MOV      R12,R3
   \   0000009C   ....               LDR      R2,??DataTable58  ;; OSRdyTbl
   \   0000009E   D25C               LDRB     R2,[R2, R3]
   \   000000A0   3023               MOVS     R3,#+48
   \   000000A2   CB5C               LDRB     R3,[R1, R3]
   \   000000A4   9A43               BICS     R2,R2,R3
   \   000000A6   6346               MOV      R3,R12
   \   000000A8   FA54               STRB     R2,[R7, R3]
    363                      if (OSRdyTbl[y] == 0x00) {                            /*          ... list at current prio */
   \   000000AA   009A               LDR      R2,[SP, #+0]
   \   000000AC   1206               LSLS     R2,R2,#+24
   \   000000AE   120E               LSRS     R2,R2,#+24
   \   000000B0   ....               LDR      R3,??DataTable58  ;; OSRdyTbl
   \   000000B2   9A5C               LDRB     R2,[R3, R2]
   \   000000B4   002A               CMP      R2,#+0
   \   000000B6   06D1               BNE      ??OSMutexPend_7
    364                          OSRdyGrp &= ~ptcb->OSTCBBitY;
   \   000000B8   ....               LDR      R2,??DataTable55  ;; OSRdyGrp
   \   000000BA   ....               LDR      R3,??DataTable55  ;; OSRdyGrp
   \   000000BC   1B78               LDRB     R3,[R3, #+0]
   \   000000BE   3127               MOVS     R7,#+49
   \   000000C0   CF5D               LDRB     R7,[R1, R7]
   \   000000C2   BB43               BICS     R3,R3,R7
   \   000000C4   1370               STRB     R3,[R2, #+0]
    365                      }
    366                      rdy = TRUE;
   \                     ??OSMutexPend_7:
   \   000000C6   0122               MOVS     R2,#+1
   \   000000C8   1BE0               B        ??OSMutexPend_8
    367                  } else {
    368                      pevent2 = ptcb->OSTCBEventPtr;
   \                     ??OSMutexPend_6:
   \   000000CA   CA69               LDR      R2,[R1, #+28]
    369                      if (pevent2 != (OS_EVENT *)0) {                       /* Remove from event wait list       */
   \   000000CC   002A               CMP      R2,#+0
   \   000000CE   17D0               BEQ      ??OSMutexPend_9
    370                          if ((pevent2->OSEventTbl[ptcb->OSTCBY] &= ~ptcb->OSTCBBitX) == 0) {
   \   000000D0   2F23               MOVS     R3,#+47
   \   000000D2   CB5C               LDRB     R3,[R1, R3]
   \   000000D4   D318               ADDS     R3,R2,R3
   \   000000D6   9C46               MOV      R12,R3
   \   000000D8   2F23               MOVS     R3,#+47
   \   000000DA   CB5C               LDRB     R3,[R1, R3]
   \   000000DC   D318               ADDS     R3,R2,R3
   \   000000DE   1F7A               LDRB     R7,[R3, #+8]
   \   000000E0   3023               MOVS     R3,#+48
   \   000000E2   CB5C               LDRB     R3,[R1, R3]
   \   000000E4   9F43               BICS     R7,R7,R3
   \   000000E6   6346               MOV      R3,R12
   \   000000E8   1F72               STRB     R7,[R3, #+8]
   \   000000EA   2F23               MOVS     R3,#+47
   \   000000EC   CB5C               LDRB     R3,[R1, R3]
   \   000000EE   D318               ADDS     R3,R2,R3
   \   000000F0   1B7A               LDRB     R3,[R3, #+8]
   \   000000F2   002B               CMP      R3,#+0
   \   000000F4   04D1               BNE      ??OSMutexPend_9
    371                              pevent2->OSEventGrp &= ~ptcb->OSTCBBitY;
   \   000000F6   5378               LDRB     R3,[R2, #+1]
   \   000000F8   3127               MOVS     R7,#+49
   \   000000FA   CF5D               LDRB     R7,[R1, R7]
   \   000000FC   BB43               BICS     R3,R3,R7
   \   000000FE   5370               STRB     R3,[R2, #+1]
    372                          }
    373                      }
    374                      rdy = FALSE;                                   /* No                                       */
   \                     ??OSMutexPend_9:
   \   00000100   0022               MOVS     R2,#+0
    375                  }
    376                  ptcb->OSTCBPrio = pip;                             /* Change owner task prio to PIP            */
   \                     ??OSMutexPend_8:
   \   00000102   2D23               MOVS     R3,#+45
   \   00000104   C854               STRB     R0,[R1, R3]
    377                  ptcb->OSTCBY    = ptcb->OSTCBPrio >> 3;
   \   00000106   2F23               MOVS     R3,#+47
   \   00000108   C708               LSRS     R7,R0,#+3
   \   0000010A   CF54               STRB     R7,[R1, R3]
    378                  ptcb->OSTCBBitY = OSMapTbl[ptcb->OSTCBY];
   \   0000010C   ....               LDR      R3,??DataTable50  ;; OSMapTbl
   \   0000010E   DB5D               LDRB     R3,[R3, R7]
   \   00000110   3127               MOVS     R7,#+49
   \   00000112   CB55               STRB     R3,[R1, R7]
    379                  ptcb->OSTCBX    = ptcb->OSTCBPrio & 0x07;

⌨️ 快捷键说明

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