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

📄 os_mutex.s79

📁 ARM仿真案例
💻 S79
📖 第 1 页 / 共 5 页
字号:
        _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,??DataTable38  ;; 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
        STRB     R0,[R5, #+0]
//  403         return;
        B        ??OSMutexPend_1
//  404     }
//  405     OSTCBCur->OSTCBEventPtr = (OS_EVENT *)0;
??OSMutexPend_12:
        LDR      R0,??DataTable38  ;; 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
        STRB     R0,[R5, #+0]
//  408 }
??OSMutexPend_1:
        ADD      SP,SP,#+4
        CFI CFA R13+20
        POP      {R4-R7}
        POP      {R0}
        BX       R0               ;; return
        CFI EndBlock cfiBlock7

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

        RSEG CODE:CODE:NOROOT(2)
        DATA
??DataTable38:
        DC32     OSTCBCur

        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.
//  424 *********************************************************************************************************
//  425 */
//  426 

        RSEG CODE:CODE:NOROOT(2)
        CFI Block cfiBlock9 Using cfiCommon1
        CFI Function OSMutexPost
        THUMB
//  427 INT8U  OSMutexPost (OS_EVENT *pevent)
//  428 {
OSMutexPost:
        PUSH     {R4-R7,LR}
        CFI ?RET Frame(CFA, -4)
        CFI R7 Frame(CFA, -8)
        CFI R6 Frame(CFA, -12)
        CFI R5 Frame(CFA, -16)
        CFI R4 Frame(CFA, -20)
        CFI CFA R13+20
        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 ...                    */
        LDR      R0,??DataTable71  ;; OSIntNesting
        LDRB     R0,[R0, #+0]
        CMP      R0,#+1
        BCC      ??OSMutexPost_0
//  438         return (OS_ERR_POST_ISR);                     /* ... can't POST mutex from an ISR              */
        MOVS     R0,#+5
        B        ??OSMutexPost_1
//  439     }
//  440 #if OS_ARG_CHK_EN > 0
//  441     if (pevent == (OS_EVENT *)0) {                    /* Validate 'pevent'                             */
??OSMutexPost_0:
        CMP      R4,#+0
        BNE      ??OSMutexPost_2
//  442         return (OS_ERR_PEVENT_NULL);
        MOVS     R0,#+4
        B        ??OSMutexPost_1
//  443     }
//  444 #endif
//  445     if (pevent->OSEventType != OS_EVENT_TYPE_MUTEX) { /* Validate event block type                     */
??OSMutexPost_2:
        LDRB     R0,[R4, #+0]
        CMP      R0,#+4
        BEQ      ??OSMutexPost_3
//  446         return (OS_ERR_EVENT_TYPE);
        MOVS     R0,#+1
        B        ??OSMutexPost_1
//  447     }                                                 
//  448     OS_ENTER_CRITICAL();
??OSMutexPost_3:
        _BLF     OS_CPU_SR_Save,??OS_CPU_SR_Save??rT
        MOVS     R5,R0
//  449     pip  = (INT8U)(pevent->OSEventCnt >> 8);          /* Get priority inheritance priority of mutex    */
        LDRH     R0,[R4, #+2]
        MOVS     R2,R0
        LSLS     R2,R2,#+16       ;; ZeroExtS R2,R2,#+16,#+16
        LSRS     R2,R2,#+16
        LSRS     R2,R2,#+8
//  450     prio = (INT8U)(pevent->OSEventCnt & OS_MUTEX_KEEP_LOWER_8);  /* Get owner's original priority      */
        LDRH     R1,[R4, #+2]
//  451     if (OSTCBCur != (OS_TCB *)pevent->OSEventPtr) {   /* See if posting task owns the MUTEX            */
        LDR      R0,??DataTable68  ;; OSTCBCur
        LDR      R0,[R0, #+0]
        LDR      R3,[R4, #+4]
        CMP      R0,R3
        BEQ      ??OSMutexPost_4
//  452         OS_EXIT_CRITICAL();
        MOVS     R0,R5
        _BLF     OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rT
//  453         return (OS_ERR_NOT_MUTEX_OWNER);
        MOVS     R0,#+120
        B        ??OSMutexPost_1
//  454     }
//  455     if (OSTCBCur->OSTCBPrio == pip) {                 /* Did we have to raise current task's priority? */
??OSMutexPost_4:
        LDR      R0,??DataTable68  ;; OSTCBCur
        LDR      R0,[R0, #+0]
        ADDS     R0,R0,#+45
        LDRB     R0,[R0, #+0]
        LSLS     R2,R2,#+24       ;; ZeroExtS R2,R2,#+24,#+24
        LSRS     R2,R2,#+24
        CMP      R0,R2
        BNE      ??OSMutexPost_5
//  456         y            = OSTCBCur->OSTCBY;              /* Yes, Return to original priority              */
        LDR      R0,??DataTable68  ;; OSTCBCur
        LDR      R0,[R0, #+0]
        ADDS     R0,R0,#+47
        LDRB     R3,[R0, #+0]
//  457         OSRdyTbl[y] &= ~OSTCBCur->OSTCBBitX;          /*      Remove owner from ready list at 'pip'    */
        LSLS     R3,R3,#+24       ;; ZeroExtS R3,R3,#+24,#+24
        LSRS     R3,R3,#+24
        LDR      R0,??DataTable46  ;; OSRdyTbl
        LSLS     R3,R3,#+24       ;; ZeroExtS R3,R3,#+24,#+24
        LSRS     R3,R3,#+24
        LDR      R6,??DataTable46  ;; OSRdyTbl
        LDRB     R6,[R6, R3]
        LDR      R7,??DataTable68  ;; OSTCBCur
        LDR      R7,[R7, #+0]
        ADDS     R7,R7,#+48
        LDRB     R7,[R7, #+0]
        BICS     R6,R6,R7
        STRB     R6,[R0, R3]
//  458         if (OSRdyTbl[y] == 0) {
        LDR      R0,??DataTable46  ;; OSRdyTbl
        LDRB     R0,[R0, R3]
        CMP      R0,#+0
        BNE      ??OSMutexPost_6
//  459             OSRdyGrp &= ~OSTCBCur->OSTCBBitY;
        LDR      R0,??DataTable60  ;; OSRdyGrp
        LDR      R3,??DataTable60  ;; OSRdyGrp
        LDRB     R3,[R3, #+0]
        LDR      R6,??DataTable68  ;; OSTCBCur
        LDR      R6,[R6, #+0]
        ADDS     R6,R6,#+49
        LDRB     R6,[R6, #+0]
        BICS     R3,R3,R6
        STRB     R3,[R0, #+0]
//  460         }
//  461         OSTCBCur->OSTCBPrio         = prio;
??OSMutexPost_6:
        LDR      R0,??DataTable68  ;; OSTCBCur
        LDR      R0,[R0, #+0]
        ADDS     R0,R0,#+45
        STRB     R1,[R0, #+0]
//  462         OSTCBCur->OSTCBY            = prio >> 3;
        LDR      R0,??DataTable68  ;; OSTCBCur
        LDR      R0,[R0, #+0]
        ADDS     R0,R0,#+47
        MOVS     R3,R1
        LSLS     R3,R3,#+24       ;; ZeroExtS R3,R3,#+24,#+24
        LSRS     R3,R3,#+24
        LSRS     R3,R3,#+3
        STRB     R3,[R0, #+0]
//  463         OSTCBCur->OSTCBBitY         = OSMapTbl[OSTCBCur->OSTCBY];
        LDR      R0,??DataTable68  ;; OSTCBCur
        LDR      R0,[R0, #+0]
        ADDS     R0,R0,#+49
        LDR      R3,??DataTable68  ;; OSTCBCur
        LDR      R3,[R3, #+0]
        ADDS     R3,R3,#+47
        LDRB     R3,[R3, #+0]
        LDR      R6,??DataTable58  ;; OSMapTbl
        LDRB     R3,[R6, R3]
        STRB     R3,[R0, #+0]
//  464         OSTCBCur->OSTCBX            = prio & 0x07;
        LDR      R0,??DataTable68  ;; OSTCBCur
        LDR      R0,[R0, #+0]
        ADDS     R0,R0,#+46
        LSLS     R3,R1,#+29       ;; ZeroExtS R3,R1,#+29,#+29
        LSRS     R3,R3,#+29
        STRB     R3,[R0, #+0]
//  465         OSTCBCur->OSTCBBitX         = OSMapTbl[OSTCBCur->OSTCBX];
        LDR      R0,??DataTable68  ;; OSTCBCur
        LDR      R0,[R0, #+0]
        ADDS     R0,R0,#+48
        LDR      R3,??DataTable68  ;; OSTCBCur
        LDR      R3,[R3, #+0]
        ADDS     R3,R3,#+46
        LDRB     R3,[R3, #+0]
        LDR      R6,??DataTable58  ;; OSMapTbl
        LDRB     R3,[R6, R3]
        STRB     R3,[R0, #+0]
//  466         OSRdyGrp                   |= OSTCBCur->OSTCBBitY;
        LDR      R0,??DataTable60  ;; OSRdyGrp
        LDR      R3,??DataTable60  ;; OSRdyGrp
        LDRB     R3,[R3, #+0]
        LDR      R6,??DataTable68  ;; OSTCBCur
        LDR      R6,[R6, #+0]
        ADDS     R6,R6,#+49
        LDRB     R6,[R6, #+0]
        ORRS     R6,R6,R3
        STRB     R6,[R0, #+0]
//  467         OSRdyTbl[OSTCBCur->OSTCBY] |= OSTCBCur->OSTCBBitX;
        LDR      R0,??DataTable68  ;; OSTCBCur
        LDR      R0,[R0, #+0]
        ADDS     R0,R0,#+47
        LDRB     R0,[R0, #+0]
        LDR      R6,??DataTable46  ;; OSRdyTbl
        LDR      R3,??DataTable68  ;; OSTCBCur
        LDR      R3,[R3, #+0]
        ADDS     R3,R3,#+47
        LDRB     R3,[R3, #+0]
        LDR      R7,??DataTable46  ;; OSRdyTbl
        LDRB     R7,[R7, R3]
        LDR      R3,??DataTable68  ;; OSTCBCur
        LDR      R3,[R3, #+0]
        ADDS     R3,R3,#+48
        LDRB     R3,[R3, #+0]
        ORRS     R3,R3,R7
        STRB     R3,[R6, R0]
//  468         OSTCBPrioTbl[prio]          = (OS_TCB *)OSTCBCur;
        LSLS     R1,R1,#+24       ;; ZeroExtS R1,R1,#+24,#+24
        LSRS     R1,R1,#+24
        MOVS     R0,#+4
        MULS     R1,R0,R1
        LDR      R0,??DataTable70  ;; OSTCBPrioTbl
        LDR      R3,??DataTable68  ;; OSTCBCur
        LDR      R3,[R3, #+0]
        STR      R3,[R0, R1]
//  469     }
//  470     OSTCBPrioTbl[pip] = (OS_TCB *)1;                  /* Reserve table entry                           */
??OSMutexPost_5:
        LSLS     R2,R2,#+24       ;; ZeroExtS R2,R2,#+24,#+24
        LSRS     R2,R2,#+24
        MOVS     R0,#+4
        MULS     R2,R0,R2
        LDR      R0,??DataTable70  ;; OSTCBPrioTbl
        MOVS     R1,#+1
        STR      R1,[R0, R2]
//  471     if (pevent->OSEventGrp != 0x00) {                 /* Any task waiting for the mutex?               */
        LDRB     R0,[R4, #+1]
        CMP      R0,#+0
        BEQ      ??OSMutexPost_7
//  472                                                       /* Yes, Make HPT waiting for mutex ready         */
//  473         prio                = OS_EventTaskRdy(pevent, (void *)0, OS_STAT_MUTEX);
        MOVS     R2,#+16
        MOVS     R1,#+0
        MOVS     R0,R4
        _BLF     OS_EventTaskRdy,??OS_EventTaskRdy??rT
        MOVS     R1,R0
//  474         pevent->OSEventCnt &= OS_MUTEX_KEEP_UPPER_8;  /*      Save priority of mutex's new owner       */
        LDRH     R0,[R4, #+2]
        MOVS     R2,#+255
        LSLS     R2,R2,#+8        ;; #+65280
        ANDS     R2,R2,R0
        STRH     R2,[R4, #+2]
//  475         pevent->OSEventCnt |= prio;
        LDRH     R0,[R4, #+2]
        LSLS     R1,R1,#+24       ;; ZeroExtS R1,R1,#+24,#+24
        LSRS     R1,R1,#+24
        ORRS     R0,R0,R1
        STRH     R0,[R4, #+2]
//  476         pevent->OSEventPtr  = OSTCBPrioTbl[prio];     /*     

⌨️ 快捷键说明

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