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

📄 os_mutex.s79

📁 ARM仿真案例
💻 S79
📖 第 1 页 / 共 5 页
字号:
        CFI R4 Frame(CFA, -20)
        CFI CFA R13+24
        MOVS     R4,R0
        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 ...               */
        LDR      R0,??DataTable17  ;; OSIntNesting
        LDRB     R0,[R0, #+0]
        CMP      R0,#+1
        BCC      ??OSMutexPend_0
//  334         *err = OS_ERR_PEND_ISR;                            /* ... can't PEND from an ISR               */
        MOVS     R0,#+2
        STRB     R0,[R5, #+0]
//  335         return;
        B        ??OSMutexPend_1
//  336     }
//  337 #if OS_ARG_CHK_EN > 0
//  338     if (pevent == (OS_EVENT *)0) {                         /* Validate 'pevent'                        */
??OSMutexPend_0:
        CMP      R4,#+0
        BNE      ??OSMutexPend_2
//  339         *err = OS_ERR_PEVENT_NULL;
        MOVS     R0,#+4
        STRB     R0,[R5, #+0]
//  340         return;
        B        ??OSMutexPend_1
//  341     }
//  342 #endif
//  343     if (pevent->OSEventType != OS_EVENT_TYPE_MUTEX) {      /* Validate event block type                */
??OSMutexPend_2:
        LDRB     R0,[R4, #+0]
        CMP      R0,#+4
        BEQ      ??OSMutexPend_3
//  344         *err = OS_ERR_EVENT_TYPE;
        MOVS     R0,#+1
        STRB     R0,[R5, #+0]
//  345         return;
        B        ??OSMutexPend_1
//  346     }
//  347     OS_ENTER_CRITICAL();								   /* Is Mutex available?                      */
??OSMutexPend_3:
        _BLF     OS_CPU_SR_Save,??OS_CPU_SR_Save??rT
        MOVS     R6,R0
//  348     if ((INT8U)(pevent->OSEventCnt & OS_MUTEX_KEEP_LOWER_8) == OS_MUTEX_AVAILABLE) {
        LDRH     R0,[R4, #+2]
        LSLS     R0,R0,#+24       ;; ZeroExtS R0,R0,#+24,#+24
        LSRS     R0,R0,#+24
        CMP      R0,#+255
        BNE      ??OSMutexPend_4
//  349         pevent->OSEventCnt &= OS_MUTEX_KEEP_UPPER_8;       /* Yes, Acquire the resource                */
        LDRH     R0,[R4, #+2]
        MOVS     R1,#+255
        LSLS     R1,R1,#+8        ;; #+65280
        ANDS     R1,R1,R0
        STRH     R1,[R4, #+2]
//  350         pevent->OSEventCnt |= OSTCBCur->OSTCBPrio;         /*      Save priority of owning task        */
        LDRH     R0,[R4, #+2]
        LDR      R1,??DataTable38  ;; OSTCBCur
        LDR      R1,[R1, #+0]
        ADDS     R1,R1,#+45
        LDRB     R1,[R1, #+0]
        ORRS     R1,R1,R0
        STRH     R1,[R4, #+2]
//  351         pevent->OSEventPtr  = (void *)OSTCBCur;            /*      Point to owning task's OS_TCB       */
        LDR      R0,??DataTable38  ;; OSTCBCur
        LDR      R0,[R0, #+0]
        STR      R0,[R4, #+4]
//  352         OS_EXIT_CRITICAL();
        MOVS     R0,R6
        _BLF     OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rT
//  353         *err  = OS_NO_ERR;
        MOVS     R0,#+0
        STRB     R0,[R5, #+0]
//  354         return;
        B        ??OSMutexPend_1
//  355     }
//  356     pip   = (INT8U)(pevent->OSEventCnt >> 8);                     /* No, Get PIP from mutex            */
??OSMutexPend_4:
        LDRH     R0,[R4, #+2]
        LSLS     R0,R0,#+16       ;; ZeroExtS R0,R0,#+16,#+16
        LSRS     R0,R0,#+16
        LSRS     R0,R0,#+8
//  357     mprio = (INT8U)(pevent->OSEventCnt & OS_MUTEX_KEEP_LOWER_8);  /*     Get priority of mutex owner   */
        LDRH     R2,[R4, #+2]
//  358     ptcb  = (OS_TCB *)(pevent->OSEventPtr);                       /*     Point to TCB of mutex owner   */
        LDR      R1,[R4, #+4]
//  359     if (ptcb->OSTCBPrio != pip && mprio > OSTCBCur->OSTCBPrio) {  /*     Need to promote prio of owner?*/
        MOVS     R3,#+45
        LDRB     R3,[R1, R3]
        LSLS     R0,R0,#+24       ;; ZeroExtS R0,R0,#+24,#+24
        LSRS     R0,R0,#+24
        CMP      R3,R0
        BNE      .+5
        B        ??OSMutexPend_5
        LDR      R3,??DataTable38  ;; OSTCBCur
        LDR      R3,[R3, #+0]
        ADDS     R3,R3,#+45
        LDRB     R3,[R3, #+0]
        LSLS     R2,R2,#+24       ;; ZeroExtS R2,R2,#+24,#+24
        LSRS     R2,R2,#+24
        CMP      R3,R2
        BCC      .+5
        B        ??OSMutexPend_5
//  360         y = ptcb->OSTCBY;                          
        MOVS     R2,#+47
        LDRB     R2,[R1, R2]
//  361         if ((OSRdyTbl[y] & ptcb->OSTCBBitX) != 0x00) {            /*     See if mutex owner is ready   */
        LSLS     R2,R2,#+24       ;; ZeroExtS R2,R2,#+24,#+24
        LSRS     R2,R2,#+24
        LDR      R3,??DataTable46  ;; OSRdyTbl
        LDRB     R3,[R3, R2]
        MOVS     R7,#+48
        LDRB     R7,[R1, R7]
        TST      R3,R7
        BEQ      ??OSMutexPend_6
//  362             OSRdyTbl[y] &= ~ptcb->OSTCBBitX;                      /*     Yes, Remove owner from Rdy ...*/
        LSLS     R2,R2,#+24       ;; ZeroExtS R2,R2,#+24,#+24
        LSRS     R2,R2,#+24
        LDR      R3,??DataTable46  ;; OSRdyTbl
        MOV      R12,R3
        LSLS     R2,R2,#+24       ;; ZeroExtS R2,R2,#+24,#+24
        LSRS     R2,R2,#+24
        LDR      R3,??DataTable46  ;; OSRdyTbl
        LDRB     R7,[R3, R2]
        MOVS     R3,#+48
        LDRB     R3,[R1, R3]
        BICS     R7,R7,R3
        MOV      R3,R12
        STRB     R7,[R3, R2]
//  363             if (OSRdyTbl[y] == 0x00) {                            /*          ... list at current prio */
        LDR      R3,??DataTable46  ;; OSRdyTbl
        LDRB     R2,[R3, R2]
        CMP      R2,#+0
        BNE      ??OSMutexPend_7
//  364                 OSRdyGrp &= ~ptcb->OSTCBBitY;
        LDR      R2,??DataTable60  ;; OSRdyGrp
        LDR      R3,??DataTable60  ;; OSRdyGrp
        LDRB     R3,[R3, #+0]
        MOVS     R7,#+49
        LDRB     R7,[R1, R7]
        BICS     R3,R3,R7
        STRB     R3,[R2, #+0]
//  365             }
//  366             rdy = TRUE;
??OSMutexPend_7:
        MOVS     R2,#+1
        B        ??OSMutexPend_8
//  367         } else {
//  368             pevent2 = ptcb->OSTCBEventPtr;
??OSMutexPend_6:
        LDR      R3,[R1, #+28]
//  369             if (pevent2 != (OS_EVENT *)0) {                       /* Remove from event wait list       */
        CMP      R3,#+0
        BEQ      ??OSMutexPend_9
//  370                 if ((pevent2->OSEventTbl[ptcb->OSTCBY] &= ~ptcb->OSTCBBitX) == 0) {
        MOVS     R2,#+47
        LDRB     R2,[R1, R2]
        ADDS     R2,R3,R2
        LDRB     R2,[R2, #+8]
        MOVS     R7,#+48
        LDRB     R7,[R1, R7]
        BICS     R2,R2,R7
        MOVS     R7,#+47
        LDRB     R7,[R1, R7]
        ADDS     R7,R3,R7
        STRB     R2,[R7, #+8]
        LSLS     R2,R2,#+24       ;; ZeroExtS R2,R2,#+24,#+24
        LSRS     R2,R2,#+24
        CMP      R2,#+0
        BNE      ??OSMutexPend_9
//  371                     pevent2->OSEventGrp &= ~ptcb->OSTCBBitY;
        LDRB     R2,[R3, #+1]
        MOVS     R7,#+49
        LDRB     R7,[R1, R7]
        BICS     R2,R2,R7
        STRB     R2,[R3, #+1]
//  372                 }
//  373             }
//  374             rdy = FALSE;                                   /* No                                       */
??OSMutexPend_9:
        MOVS     R2,#+0
//  375         }
//  376         ptcb->OSTCBPrio = pip;                             /* Change owner task prio to PIP            */
??OSMutexPend_8:
        MOVS     R3,#+45
        STRB     R0,[R1, R3]
//  377         ptcb->OSTCBY    = ptcb->OSTCBPrio >> 3;
        MOVS     R3,#+47
        MOVS     R7,#+45
        LDRB     R7,[R1, R7]
        LSLS     R7,R7,#+24       ;; ZeroExtS R7,R7,#+24,#+24
        LSRS     R7,R7,#+24
        LSRS     R7,R7,#+3
        STRB     R7,[R1, R3]
//  378         ptcb->OSTCBBitY = OSMapTbl[ptcb->OSTCBY];
        MOVS     R7,#+49
        MOV      R12,R7
        MOVS     R3,#+47
        LDRB     R7,[R1, R3]
        LDR      R3,??DataTable58  ;; OSMapTbl
        LDRB     R3,[R3, R7]
        MOV      R7,R12
        STRB     R3,[R1, R7]
//  379         ptcb->OSTCBX    = ptcb->OSTCBPrio & 0x07;
        MOVS     R3,#+46
        MOVS     R7,#+45
        LDRB     R7,[R1, R7]
        LSLS     R7,R7,#+29       ;; ZeroExtS R7,R7,#+29,#+29
        LSRS     R7,R7,#+29
        STRB     R7,[R1, R3]
//  380         ptcb->OSTCBBitX = OSMapTbl[ptcb->OSTCBX];
        MOVS     R7,#+48
        MOV      R12,R7
        MOVS     R3,#+46
        LDRB     R7,[R1, R3]
        LDR      R3,??DataTable58  ;; OSMapTbl
        LDRB     R3,[R3, R7]
        MOV      R7,R12
        STRB     R3,[R1, R7]
//  381         if (rdy == TRUE) {                                 /* If task was ready at owner's priority ...*/
        CMP      R2,#+1
        BNE      ??OSMutexPend_10
//  382             OSRdyGrp               |= ptcb->OSTCBBitY;     /* ... make it ready at new priority.       */
        LDR      R2,??DataTable60  ;; OSRdyGrp
        LDR      R3,??DataTable60  ;; OSRdyGrp
        LDRB     R3,[R3, #+0]
        MOVS     R7,#+49
        LDRB     R7,[R1, R7]
        ORRS     R7,R7,R3
        STRB     R7,[R2, #+0]
//  383             OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
        MOVS     R2,#+47
        LDRB     R2,[R1, R2]
        LDR      R7,??DataTable46  ;; OSRdyTbl
        MOV      R12,R2
        MOVS     R2,#+47
        LDRB     R3,[R1, R2]
        LDR      R2,??DataTable46  ;; OSRdyTbl
        LDRB     R2,[R2, R3]
        MOVS     R3,#+48
        LDRB     R3,[R1, R3]
        ORRS     R3,R3,R2
        MOV      R2,R12
        STRB     R3,[R7, R2]
        B        ??OSMutexPend_11
//  384         } else {
//  385             pevent2 = ptcb->OSTCBEventPtr;
??OSMutexPend_10:
        LDR      R3,[R1, #+28]
//  386             if (pevent2 != (OS_EVENT *)0) {                /* Remove from event wait list              */
        CMP      R3,#+0
        BEQ      ??OSMutexPend_11
//  387                 pevent2->OSEventGrp               |= ptcb->OSTCBBitY;
        LDRB     R2,[R3, #+1]
        MOVS     R7,#+49
        LDRB     R7,[R1, R7]
        ORRS     R7,R7,R2
        STRB     R7,[R3, #+1]
//  388                 pevent2->OSEventTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
        MOVS     R2,#+47
        LDRB     R2,[R1, R2]
        ADDS     R2,R3,R2
        MOVS     R7,#+47
        LDRB     R7,[R1, R7]
        ADDS     R3,R3,R7
        LDRB     R7,[R3, #+8]
        MOVS     R3,#+48
        LDRB     R3,[R1, R3]
        ORRS     R3,R3,R7
        STRB     R3,[R2, #+8]
//  389             }
//  390         }
//  391         OSTCBPrioTbl[pip] = (OS_TCB *)ptcb;
??OSMutexPend_11:
        LSLS     R0,R0,#+24       ;; ZeroExtS R0,R0,#+24,#+24
        LSRS     R0,R0,#+24
        MOVS     R2,#+4
        MULS     R0,R2,R0
        LDR      R2,??DataTable70  ;; OSTCBPrioTbl
        STR      R1,[R2, R0]
//  392     }
//  393     OSTCBCur->OSTCBStat |= OS_STAT_MUTEX;             /* Mutex not available, pend current task        */
??OSMutexPend_5:
        LDR      R0,??DataTable38  ;; OSTCBCur
        LDR      R0,[R0, #+0]
        ADDS     R0,R0,#+44
        LDR      R1,??DataTable38  ;; OSTCBCur
        LDR      R1,[R1, #+0]
        ADDS     R1,R1,#+44
        LDRB     R1,[R1, #+0]
        MOVS     R2,#+16
        ORRS     R2,R2,R1
        STRB     R2,[R0, #+0]
//  394     OSTCBCur->OSTCBDly   = timeout;                   /* Store timeout in current task's TCB           */
        LDR      R0,??DataTable38  ;; OSTCBCur
        LDR      R0,[R0, #+0]
        MOV      R1,SP
        LDRH     R1,[R1, #+0]
        STRH     R1,[R0, #+42]
//  395     OS_EventTaskWait(pevent);                         /* Suspend task until event or timeout occurs    */
        MOVS     R0,R4
        _BLF     OS_EventTaskWait,??OS_EventTaskWait??rT
//  396     OS_EXIT_CRITICAL();
        MOVS     R0,R6
        _BLF     OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rT
//  397     OS_Sched();                                        /* Find next highest priority task ready         */
        _BLF     OS_Sched,??OS_Sched??rT
//  398     OS_ENTER_CRITICAL();

⌨️ 快捷键说明

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