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

📄 os_mutex.lst

📁 ARM仿真案例
💻 LST
📖 第 1 页 / 共 5 页
字号:
   \   00000114   2E23               MOVS     R3,#+46
   \   00000116   4707               LSLS     R7,R0,#+29
   \   00000118   7F0F               LSRS     R7,R7,#+29
   \   0000011A   CF54               STRB     R7,[R1, R3]
    380                  ptcb->OSTCBBitX = OSMapTbl[ptcb->OSTCBX];
   \   0000011C   CF5C               LDRB     R7,[R1, R3]
   \   0000011E   ....               LDR      R3,??DataTable50  ;; OSMapTbl
   \   00000120   DB5D               LDRB     R3,[R3, R7]
   \   00000122   3027               MOVS     R7,#+48
   \   00000124   CB55               STRB     R3,[R1, R7]
    381                  if (rdy == TRUE) {                                 /* If task was ready at owner's priority ...*/
   \   00000126   012A               CMP      R2,#+1
   \   00000128   13D1               BNE      ??OSMutexPend_10
    382                      OSRdyGrp               |= ptcb->OSTCBBitY;     /* ... make it ready at new priority.       */
   \   0000012A   ....               LDR      R2,??DataTable55  ;; OSRdyGrp
   \   0000012C   ....               LDR      R3,??DataTable55  ;; OSRdyGrp
   \   0000012E   1B78               LDRB     R3,[R3, #+0]
   \   00000130   3127               MOVS     R7,#+49
   \   00000132   CF5D               LDRB     R7,[R1, R7]
   \   00000134   1F43               ORRS     R7,R7,R3
   \   00000136   1770               STRB     R7,[R2, #+0]
    383                      OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
   \   00000138   2F22               MOVS     R2,#+47
   \   0000013A   8A5C               LDRB     R2,[R1, R2]
   \   0000013C   ....               LDR      R7,??DataTable58  ;; OSRdyTbl
   \   0000013E   9446               MOV      R12,R2
   \   00000140   6346               MOV      R3,R12
   \   00000142   ....               LDR      R2,??DataTable58  ;; OSRdyTbl
   \   00000144   D25C               LDRB     R2,[R2, R3]
   \   00000146   3023               MOVS     R3,#+48
   \   00000148   CB5C               LDRB     R3,[R1, R3]
   \   0000014A   1343               ORRS     R3,R3,R2
   \   0000014C   6246               MOV      R2,R12
   \   0000014E   BB54               STRB     R3,[R7, R2]
   \   00000150   12E0               B        ??OSMutexPend_11
    384                  } else {
    385                      pevent2 = ptcb->OSTCBEventPtr;
   \                     ??OSMutexPend_10:
   \   00000152   CA69               LDR      R2,[R1, #+28]
    386                      if (pevent2 != (OS_EVENT *)0) {                /* Remove from event wait list              */
   \   00000154   002A               CMP      R2,#+0
   \   00000156   0FD0               BEQ      ??OSMutexPend_11
    387                          pevent2->OSEventGrp               |= ptcb->OSTCBBitY;
   \   00000158   5378               LDRB     R3,[R2, #+1]
   \   0000015A   3127               MOVS     R7,#+49
   \   0000015C   CF5D               LDRB     R7,[R1, R7]
   \   0000015E   1F43               ORRS     R7,R7,R3
   \   00000160   5770               STRB     R7,[R2, #+1]
    388                          pevent2->OSEventTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
   \   00000162   2F23               MOVS     R3,#+47
   \   00000164   CB5C               LDRB     R3,[R1, R3]
   \   00000166   D318               ADDS     R3,R2,R3
   \   00000168   2F27               MOVS     R7,#+47
   \   0000016A   CF5D               LDRB     R7,[R1, R7]
   \   0000016C   D219               ADDS     R2,R2,R7
   \   0000016E   177A               LDRB     R7,[R2, #+8]
   \   00000170   3022               MOVS     R2,#+48
   \   00000172   8A5C               LDRB     R2,[R1, R2]
   \   00000174   3A43               ORRS     R2,R2,R7
   \   00000176   1A72               STRB     R2,[R3, #+8]
    389                      }
    390                  }
    391                  OSTCBPrioTbl[pip] = (OS_TCB *)ptcb;
   \                     ??OSMutexPend_11:
   \   00000178   8000               LSLS     R0,R0,#+2
   \   0000017A   ....               LDR      R2,??DataTable63  ;; OSTCBPrioTbl
   \   0000017C   1150               STR      R1,[R2, R0]
    392              }
    393              OSTCBCur->OSTCBStat |= OS_STAT_MUTEX;             /* Mutex not available, pend current task        */
   \                     ??OSMutexPend_5:
   \   0000017E   ....               LDR      R0,??DataTable49  ;; OSTCBCur
   \   00000180   0068               LDR      R0,[R0, #+0]
   \   00000182   2C30               ADDS     R0,R0,#+44
   \   00000184   ....               LDR      R1,??DataTable49  ;; OSTCBCur
   \   00000186   0968               LDR      R1,[R1, #+0]
   \   00000188   2C31               ADDS     R1,R1,#+44
   \   0000018A   0978               LDRB     R1,[R1, #+0]
   \   0000018C   1022               MOVS     R2,#+16
   \   0000018E   0A43               ORRS     R2,R2,R1
   \   00000190   0270               STRB     R2,[R0, #+0]
    394              OSTCBCur->OSTCBDly   = timeout;                   /* Store timeout in current task's TCB           */
   \   00000192   ....               LDR      R0,??DataTable49  ;; OSTCBCur
   \   00000194   0068               LDR      R0,[R0, #+0]
   \   00000196   6946               MOV      R1,SP
   \   00000198   8988               LDRH     R1,[R1, #+4]
   \   0000019A   4185               STRH     R1,[R0, #+42]
    395              OS_EventTaskWait(pevent);                         /* Suspend task until event or timeout occurs    */
   \   0000019C   2000               MOVS     R0,R4
   \   0000019E   ........           _BLF     OS_EventTaskWait,??OS_EventTaskWait??rT
    396              OS_EXIT_CRITICAL();
   \   000001A2   3000               MOVS     R0,R6
   \   000001A4   ........           _BLF     OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rT
    397              OS_Sched();                                        /* Find next highest priority task ready         */
   \   000001A8   ........           _BLF     OS_Sched,??OS_Sched??rT
    398              OS_ENTER_CRITICAL();
   \   000001AC   ........           _BLF     OS_CPU_SR_Save,??OS_CPU_SR_Save??rT
   \   000001B0   0600               MOVS     R6,R0
    399              if (OSTCBCur->OSTCBStat & OS_STAT_MUTEX) {        /* Must have timed out if still waiting for event*/
   \   000001B2   ....               LDR      R0,??DataTable49  ;; OSTCBCur
   \   000001B4   0068               LDR      R0,[R0, #+0]
   \   000001B6   2C30               ADDS     R0,R0,#+44
   \   000001B8   0078               LDRB     R0,[R0, #+0]
   \   000001BA   C006               LSLS     R0,R0,#+27
   \   000001BC   07D5               BPL      ??OSMutexPend_12
    400                  OS_EventTO(pevent);
   \   000001BE   2000               MOVS     R0,R4
   \   000001C0   ........           _BLF     OS_EventTO,??OS_EventTO??rT
    401                  OS_EXIT_CRITICAL();
   \   000001C4   3000               MOVS     R0,R6
   \   000001C6   ........           _BLF     OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rT
    402                  *err = OS_TIMEOUT;                            /* Indicate that we didn't get mutex within TO   */
   \   000001CA   0A20               MOVS     R0,#+10
   \   000001CC   07E0               B.N      ??OSMutexPend_1
    403                  return;
    404              }
    405              OSTCBCur->OSTCBEventPtr = (OS_EVENT *)0;
   \                     ??OSMutexPend_12:
   \   000001CE   ....               LDR      R0,??DataTable49  ;; OSTCBCur
   \   000001D0   0068               LDR      R0,[R0, #+0]
   \   000001D2   0021               MOVS     R1,#+0
   \   000001D4   C161               STR      R1,[R0, #+28]
    406              OS_EXIT_CRITICAL();
   \   000001D6   3000               MOVS     R0,R6
   \   000001D8   ........           _BLF     OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rT
    407              *err = OS_NO_ERR;
   \   000001DC   0020               MOVS     R0,#+0
   \                     ??OSMutexPend_1:
   \   000001DE   2870               STRB     R0,[R5, #+0]
    408          }
   \   000001E0   02B0               ADD      SP,SP,#+8
   \   000001E2   F0BC               POP      {R4-R7}
   \   000001E4   01BC               POP      {R0}
   \   000001E6   0047               BX       R0               ;; return
    409          /*$PAGE*/
    410          /*
    411          *********************************************************************************************************
    412          *                                  POST TO A MUTUAL EXCLUSION SEMAPHORE
    413          *
    414          * Description: This function signals a mutual exclusion semaphore
    415          *
    416          * Arguments  : pevent              is a pointer to the event control block associated with the desired
    417          *                                  mutex.
    418          *
    419          * Returns    : OS_NO_ERR               The call was successful and the mutex was signaled.
    420          *              OS_ERR_EVENT_TYPE       If you didn't pass a pointer to a mutex
    421          *              OS_ERR_PEVENT_NULL      'pevent' is a NULL pointer
    422          *              OS_ERR_POST_ISR         Attempted to post from an ISR (not valid for MUTEXes)
    423          *              OS_ERR_NOT_MUTEX_OWNER  The task that did the post is NOT the owner of the MUTEX.
    424          *********************************************************************************************************
    425          */
    426          

   \                                 In segment CODE, align 4, keep-with-next
    427          INT8U  OSMutexPost (OS_EVENT *pevent)
    428          {
   \                     OSMutexPost:
   \   00000000   F0B5               PUSH     {R4-R7,LR}
   \   00000002   0400               MOVS     R4,R0
    429          #if OS_CRITICAL_METHOD == 3                           /* Allocate storage for CPU status register      */
    430              OS_CPU_SR  cpu_sr;
    431          #endif    
    432              INT8U      pip;                                   /* Priority inheritance priority                 */
    433              INT8U      prio;
    434              INT8U      y;
    435          
    436          
    437              if (OSIntNesting > 0) {                           /* See if called from ISR ...                    */
   \   00000004   ....               LDR      R0,??DataTable64  ;; OSIntNesting
   \   00000006   0078               LDRB     R0,[R0, #+0]
   \   00000008   0028               CMP      R0,#+0
   \   0000000A   01D0               BEQ      ??OSMutexPost_0
    438                  return (OS_ERR_POST_ISR);                     /* ... can't POST mutex from an ISR              */
   \   0000000C   0520               MOVS     R0,#+5
   \   0000000E   9FE0               B        ??OSMutexPost_1
    439              }
    440          #if OS_ARG_CHK_EN > 0
    441              if (pevent == (OS_EVENT *)0) {                    /* Validate 'pevent'                             */
   \                     ??OSMutexPost_0:
   \   00000010   002C               CMP      R4,#+0
   \   00000012   01D1               BNE      ??OSMutexPost_2
    442                  return (OS_ERR_PEVENT_NULL);
   \   00000014   0420               MOVS     R0,#+4
   \   00000016   9BE0               B        ??OSMutexPost_1
    443              }
    444          #endif
    445              if (pevent->OSEventType != OS_EVENT_TYPE_MUTEX) { /* Validate event block type                     */
   \                     ??OSMutexPost_2:
   \   00000018   2078               LDRB     R0,[R4, #+0]
   \   0000001A   0428               CMP      R0,#+4
   \   0000001C   01D0               BEQ      ??OSMutexPost_3
    446                  return (OS_ERR_EVENT_TYPE);
   \   0000001E   0120               MOVS     R0,#+1
   \   00000020   96E0               B        ??OSMutexPost_1
    447              }                                                 
    448              OS_ENTER_CRITICAL();
   \                     ??OSMutexPost_3:
   \   00000022   ........           _BLF     OS_CPU_SR_Save,??OS_CPU_SR_Save??rT
   \   00000026   0500               MOVS     R5,R0
    449              pip  = (INT8U)(pevent->OSEventCnt >> 8);          /* Get priority inheritance priority of mutex    */
   \   00000028   6088 

⌨️ 快捷键说明

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