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

📄 os_mutex.s79

📁 ARM仿真案例
💻 S79
📖 第 1 页 / 共 5 页
字号:
??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
        LSRS     R0,R0,#+24
        CMP      R0,#+255
        LDRH     R0,[R4, #+2]
        BNE      ??OSMutexPend_4
//  349         pevent->OSEventCnt &= OS_MUTEX_KEEP_UPPER_8;       /* Yes, Acquire the resource                */
        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        */
        MOVS     R0,R1
        LDR      R1,??DataTable49  ;; 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,??DataTable49  ;; 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
        B.N      ??OSMutexPend_1
//  354         return;
//  355     }
//  356     pip   = (INT8U)(pevent->OSEventCnt >> 8);                     /* No, Get PIP from mutex            */
??OSMutexPend_4:
        LSRS     R0,R0,#+8
//  357     mprio = (INT8U)(pevent->OSEventCnt & OS_MUTEX_KEEP_LOWER_8);  /*     Get priority of mutex owner   */
        LDRH     R2,[R4, #+2]
        LSLS     R2,R2,#+24
        LSRS     R2,R2,#+24
//  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]
        CMP      R3,R0
        BNE      .+5
        B        ??OSMutexPend_5
        LDR      R3,??DataTable49  ;; OSTCBCur
        LDR      R3,[R3, #+0]
        ADDS     R3,R3,#+45
        LDRB     R3,[R3, #+0]
        CMP      R3,R2
        BCC      .+5
        B        ??OSMutexPend_5
//  360         y = ptcb->OSTCBY;                          
        MOVS     R2,#+47
        LDRB     R2,[R1, R2]
        STR      R2,[SP, #+0]
//  361         if ((OSRdyTbl[y] & ptcb->OSTCBBitX) != 0x00) {            /*     See if mutex owner is ready   */
        LDR      R3,??DataTable58  ;; OSRdyTbl
        LDRB     R2,[R3, R2]
        MOVS     R3,#+48
        LDRB     R3,[R1, R3]
        TST      R2,R3
        BEQ      ??OSMutexPend_6
//  362             OSRdyTbl[y] &= ~ptcb->OSTCBBitX;                      /*     Yes, Remove owner from Rdy ...*/
        LDR      R3,[SP, #+0]
        LSLS     R3,R3,#+24
        LSRS     R3,R3,#+24
        LDR      R7,??DataTable58  ;; OSRdyTbl
        MOV      R12,R3
        LDR      R2,??DataTable58  ;; OSRdyTbl
        LDRB     R2,[R2, R3]
        MOVS     R3,#+48
        LDRB     R3,[R1, R3]
        BICS     R2,R2,R3
        MOV      R3,R12
        STRB     R2,[R7, R3]
//  363             if (OSRdyTbl[y] == 0x00) {                            /*          ... list at current prio */
        LDR      R2,[SP, #+0]
        LSLS     R2,R2,#+24
        LSRS     R2,R2,#+24
        LDR      R3,??DataTable58  ;; OSRdyTbl
        LDRB     R2,[R3, R2]
        CMP      R2,#+0
        BNE      ??OSMutexPend_7
//  364                 OSRdyGrp &= ~ptcb->OSTCBBitY;
        LDR      R2,??DataTable55  ;; OSRdyGrp
        LDR      R3,??DataTable55  ;; 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      R2,[R1, #+28]
//  369             if (pevent2 != (OS_EVENT *)0) {                       /* Remove from event wait list       */
        CMP      R2,#+0
        BEQ      ??OSMutexPend_9
//  370                 if ((pevent2->OSEventTbl[ptcb->OSTCBY] &= ~ptcb->OSTCBBitX) == 0) {
        MOVS     R3,#+47
        LDRB     R3,[R1, R3]
        ADDS     R3,R2,R3
        MOV      R12,R3
        MOVS     R3,#+47
        LDRB     R3,[R1, R3]
        ADDS     R3,R2,R3
        LDRB     R7,[R3, #+8]
        MOVS     R3,#+48
        LDRB     R3,[R1, R3]
        BICS     R7,R7,R3
        MOV      R3,R12
        STRB     R7,[R3, #+8]
        MOVS     R3,#+47
        LDRB     R3,[R1, R3]
        ADDS     R3,R2,R3
        LDRB     R3,[R3, #+8]
        CMP      R3,#+0
        BNE      ??OSMutexPend_9
//  371                     pevent2->OSEventGrp &= ~ptcb->OSTCBBitY;
        LDRB     R3,[R2, #+1]
        MOVS     R7,#+49
        LDRB     R7,[R1, R7]
        BICS     R3,R3,R7
        STRB     R3,[R2, #+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
        LSRS     R7,R0,#+3
        STRB     R7,[R1, R3]
//  378         ptcb->OSTCBBitY = OSMapTbl[ptcb->OSTCBY];
        LDR      R3,??DataTable50  ;; OSMapTbl
        LDRB     R3,[R3, R7]
        MOVS     R7,#+49
        STRB     R3,[R1, R7]
//  379         ptcb->OSTCBX    = ptcb->OSTCBPrio & 0x07;
        MOVS     R3,#+46
        LSLS     R7,R0,#+29
        LSRS     R7,R7,#+29
        STRB     R7,[R1, R3]
//  380         ptcb->OSTCBBitX = OSMapTbl[ptcb->OSTCBX];
        LDRB     R7,[R1, R3]
        LDR      R3,??DataTable50  ;; OSMapTbl
        LDRB     R3,[R3, R7]
        MOVS     R7,#+48
        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,??DataTable55  ;; OSRdyGrp
        LDR      R3,??DataTable55  ;; 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,??DataTable58  ;; OSRdyTbl
        MOV      R12,R2
        MOV      R3,R12
        LDR      R2,??DataTable58  ;; 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      R2,[R1, #+28]
//  386             if (pevent2 != (OS_EVENT *)0) {                /* Remove from event wait list              */
        CMP      R2,#+0
        BEQ      ??OSMutexPend_11
//  387                 pevent2->OSEventGrp               |= ptcb->OSTCBBitY;
        LDRB     R3,[R2, #+1]
        MOVS     R7,#+49
        LDRB     R7,[R1, R7]
        ORRS     R7,R7,R3
        STRB     R7,[R2, #+1]
//  388                 pevent2->OSEventTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
        MOVS     R3,#+47
        LDRB     R3,[R1, R3]
        ADDS     R3,R2,R3
        MOVS     R7,#+47
        LDRB     R7,[R1, R7]
        ADDS     R2,R2,R7
        LDRB     R7,[R2, #+8]
        MOVS     R2,#+48
        LDRB     R2,[R1, R2]
        ORRS     R2,R2,R7
        STRB     R2,[R3, #+8]
//  389             }
//  390         }
//  391         OSTCBPrioTbl[pip] = (OS_TCB *)ptcb;
??OSMutexPend_11:
        LSLS     R0,R0,#+2
        LDR      R2,??DataTable63  ;; OSTCBPrioTbl
        STR      R1,[R2, R0]
//  392     }
//  393     OSTCBCur->OSTCBStat |= OS_STAT_MUTEX;             /* Mutex not available, pend current task        */
??OSMutexPend_5:
        LDR      R0,??DataTable49  ;; OSTCBCur
        LDR      R0,[R0, #+0]
        ADDS     R0,R0,#+44
        LDR      R1,??DataTable49  ;; 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,??DataTable49  ;; OSTCBCur
        LDR      R0,[R0, #+0]
        MOV      R1,SP
        LDRH     R1,[R1, #+4]
        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();
        _BLF     OS_CPU_SR_Save,??OS_CPU_SR_Save??rT
        MOVS     R6,R0
//  399     if (OSTCBCur->OSTCBStat & OS_STAT_MUTEX) {        /* Must have timed out if still waiting for event*/
        LDR      R0,??DataTable49  ;; OSTCBCur
        LDR      R0,[R0, #+0]
        ADDS     R0,R0,#+44
        LDRB     R0,[R0, #+0]
        LSLS     R0,R0,#+27
        BPL      ??OSMutexPend_12
//  400         OS_EventTO(pevent);
        MOVS     R0,R4
        _BLF     OS_EventTO,??OS_EventTO??rT
//  401         OS_EXIT_CRITICAL();
        MOVS     R0,R6
        _BLF     OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rT
//  402         *err = OS_TIMEOUT;                            /* Indicate that we didn't get mutex within TO   */
        MOVS     R0,#+10
        B.N      ??OSMutexPend_1
//  403         return;
//  404     }
//  405     OSTCBCur->OSTCBEventPtr = (OS_EVENT *)0;
??OSMutexPend_12:
        LDR      R0,??DataTable49  ;; OSTCBCur
        LDR      R0,[R0, #+0]
        MOVS     R1,#+0
        STR      R1,[R0, #+28]
//  406     OS_EXIT_CRITICAL();
        MOVS     R0,R6
        _BLF     OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rT
//  407     *err = OS_NO_ERR;
        MOVS     R0,#+0
??OSMutexPend_1:
        STRB     R0,[R5, #+0]
//  408 }
        ADD      SP,SP,#+8
        CFI CFA R13+20
        POP      {R4-R7}
        POP      {R0}
        BX       R0               ;; return
        CFI EndBlock cfiBlock7

        RSEG CODE:CODE:NOROOT(2)
        DATA
??DataTable13:
        DC32     OSIntNesting

        RSEG CODE:CODE:NOROOT(2)
        CFI Block cfiBlock8 Using cfiCommon0
        CFI NoFunction
        ARM
??OSMutexPost??rA:
        ADD      R12,PC,#+1
        BX       R12
        CFI EndBlock cfiBlock8
        REQUIRE OSMutexPost
//  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.

⌨️ 快捷键说明

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