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

📄 os_mutex.s79

📁 ARM仿真案例
💻 S79
📖 第 1 页 / 共 5 页
字号:
//  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,??DataTable64  ;; OSIntNesting
        LDRB     R0,[R0, #+0]
        CMP      R0,#+0
        BEQ      ??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]
        LSRS     R2,R0,#+8
//  450     prio = (INT8U)(pevent->OSEventCnt & OS_MUTEX_KEEP_LOWER_8);  /* Get owner's original priority      */
        LSLS     R1,R0,#+24
        LSRS     R1,R1,#+24
//  451     if (OSTCBCur != (OS_TCB *)pevent->OSEventPtr) {   /* See if posting task owns the MUTEX            */
        LDR      R0,??DataTable49  ;; 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,??DataTable49  ;; OSTCBCur
        LDR      R0,[R0, #+0]
        ADDS     R0,R0,#+45
        LDRB     R0,[R0, #+0]
        CMP      R0,R2
        BNE      ??OSMutexPost_5
//  456         y            = OSTCBCur->OSTCBY;              /* Yes, Return to original priority              */
        LDR      R0,??DataTable49  ;; 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'    */
        LDR      R7,??DataTable58  ;; OSRdyTbl
        MOV      R12,R3
        LDR      R0,??DataTable58  ;; OSRdyTbl
        LDRB     R0,[R0, R3]
        LDR      R6,??DataTable49  ;; OSTCBCur
        LDR      R6,[R6, #+0]
        ADDS     R6,R6,#+48
        LDRB     R6,[R6, #+0]
        BICS     R0,R0,R6
        MOV      R6,R12
        STRB     R0,[R7, R6]
//  458         if (OSRdyTbl[y] == 0) {
        LDR      R0,??DataTable58  ;; OSRdyTbl
        LDRB     R0,[R0, R3]
        CMP      R0,#+0
        BNE      ??OSMutexPost_6
//  459             OSRdyGrp &= ~OSTCBCur->OSTCBBitY;
        LDR      R0,??DataTable55  ;; OSRdyGrp
        LDR      R3,??DataTable55  ;; OSRdyGrp
        LDRB     R3,[R3, #+0]
        LDR      R6,??DataTable49  ;; 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,??DataTable49  ;; OSTCBCur
        LDR      R0,[R0, #+0]
        ADDS     R0,R0,#+45
        STRB     R1,[R0, #+0]
//  462         OSTCBCur->OSTCBY            = prio >> 3;
        LDR      R0,??DataTable49  ;; OSTCBCur
        LDR      R0,[R0, #+0]
        ADDS     R0,R0,#+47
        LSRS     R3,R1,#+3
        STRB     R3,[R0, #+0]
//  463         OSTCBCur->OSTCBBitY         = OSMapTbl[OSTCBCur->OSTCBY];
        LDR      R0,??DataTable49  ;; OSTCBCur
        LDR      R0,[R0, #+0]
        ADDS     R0,R0,#+49
        LDR      R3,??DataTable49  ;; OSTCBCur
        LDR      R3,[R3, #+0]
        ADDS     R3,R3,#+47
        LDRB     R3,[R3, #+0]
        LDR      R6,??DataTable50  ;; OSMapTbl
        LDRB     R3,[R6, R3]
        STRB     R3,[R0, #+0]
//  464         OSTCBCur->OSTCBX            = prio & 0x07;
        LDR      R0,??DataTable49  ;; OSTCBCur
        LDR      R0,[R0, #+0]
        ADDS     R0,R0,#+46
        LSLS     R3,R1,#+29
        LSRS     R3,R3,#+29
        STRB     R3,[R0, #+0]
//  465         OSTCBCur->OSTCBBitX         = OSMapTbl[OSTCBCur->OSTCBX];
        LDR      R0,??DataTable49  ;; OSTCBCur
        LDR      R0,[R0, #+0]
        ADDS     R0,R0,#+48
        LDR      R3,??DataTable49  ;; OSTCBCur
        LDR      R3,[R3, #+0]
        ADDS     R3,R3,#+46
        LDRB     R3,[R3, #+0]
        LDRB     R3,[R6, R3]
        STRB     R3,[R0, #+0]
//  466         OSRdyGrp                   |= OSTCBCur->OSTCBBitY;
        LDR      R0,??DataTable55  ;; OSRdyGrp
        LDR      R3,??DataTable55  ;; OSRdyGrp
        LDRB     R3,[R3, #+0]
        LDR      R6,??DataTable49  ;; 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,??DataTable49  ;; OSTCBCur
        LDR      R0,[R0, #+0]
        ADDS     R0,R0,#+47
        LDRB     R0,[R0, #+0]
        LDR      R6,??DataTable58  ;; OSRdyTbl
        LDRB     R7,[R7, R0]
        LDR      R3,??DataTable49  ;; 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     R0,R1,#+2
        LDR      R1,??DataTable63  ;; OSTCBPrioTbl
        LDR      R3,??DataTable49  ;; OSTCBCur
        LDR      R3,[R3, #+0]
        STR      R3,[R1, R0]
//  469     }
//  470     OSTCBPrioTbl[pip] = (OS_TCB *)1;                  /* Reserve table entry                           */
??OSMutexPost_5:
        LSLS     R0,R2,#+2
        LDR      R1,??DataTable63  ;; OSTCBPrioTbl
        MOVS     R2,#+1
        STR      R2,[R1, R0]
//  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       */
//  475         pevent->OSEventCnt |= prio;
        LDRH     R0,[R4, #+2]
        MOVS     R2,#+255
        LSLS     R2,R2,#+8        ;; #+65280
        ANDS     R2,R2,R0
        MOVS     R0,R1
        ORRS     R0,R0,R2
        STRH     R0,[R4, #+2]
//  476         pevent->OSEventPtr  = OSTCBPrioTbl[prio];     /*      Link to mutex owner's OS_TCB             */
        LSLS     R0,R1,#+2
        LDR      R1,??DataTable63  ;; OSTCBPrioTbl
        LDR      R0,[R1, R0]
        STR      R0,[R4, #+4]
//  477         OS_EXIT_CRITICAL();
        MOVS     R0,R5
        _BLF     OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rT
//  478         OS_Sched();                                   /*      Find highest priority task ready to run  */
        _BLF     OS_Sched,??OS_Sched??rT
//  479         return (OS_NO_ERR);
        B.N      ??OSMutexPost_8
//  480     }
//  481     pevent->OSEventCnt |= OS_MUTEX_AVAILABLE;         /* No,  Mutex is now available                   */
??OSMutexPost_7:
        LDRH     R0,[R4, #+2]
        MOVS     R1,#+255
        ORRS     R1,R1,R0
        STRH     R1,[R4, #+2]
//  482     pevent->OSEventPtr  = (void *)0;
        MOVS     R0,#+0
        STR      R0,[R4, #+4]
//  483     OS_EXIT_CRITICAL();
        MOVS     R0,R5
        _BLF     OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rT
//  484     return (OS_NO_ERR);
??OSMutexPost_8:
        MOVS     R0,#+0
??OSMutexPost_1:
        POP      {R4-R7}
        POP      {R1}
        BX       R1               ;; return
        CFI EndBlock cfiBlock9
//  485 }

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

        RSEG CODE:CODE:NOROOT(2)
        DATA
??DataTable50:
        DC32     OSMapTbl

        RSEG CODE:CODE:NOROOT(2)
        DATA
??DataTable55:
        DC32     OSRdyGrp

        RSEG CODE:CODE:NOROOT(2)
        DATA
??DataTable58:
        DC32     OSRdyTbl

        RSEG CODE:CODE:NOROOT(2)
        DATA
??DataTable63:
        DC32     OSTCBPrioTbl

        RSEG CODE:CODE:NOROOT(2)
        CFI Block cfiBlock10 Using cfiCommon0
        CFI NoFunction
        ARM
??OSMutexQuery??rA:
        ADD      R12,PC,#+1
        BX       R12
        CFI EndBlock cfiBlock10
        REQUIRE OSMutexQuery
//  486 /*$PAGE*/
//  487 /*
//  488 *********************************************************************************************************
//  489 *                                     QUERY A MUTUAL EXCLUSION SEMAPHORE
//  490 *
//  491 * Description: This function obtains information about a mutex
//  492 *
//  493 * Arguments  : pevent          is a pointer to the event control block associated with the desired mutex
//  494 *
//  495 *              p_mutex_data    is a pointer to a structure that will contain information about the mutex
//  496 *
//  497 * Returns    : OS_NO_ERR            The call was successful and the message was sent
//  498 *              OS_ERR_QUERY_ISR     If you called this function from an ISR
//  499 *              OS_ERR_PEVENT_NULL   'pevent' is a NULL pointer
//  500 *              OS_ERR_EVENT_TYPE    If you are attempting to obtain data from a non mutex.
//  501 *********************************************************************************************************
//  502 */
//  503 
//  504 #if OS_MUTEX_QUERY_EN > 0

        RSEG CODE:CODE:NOROOT(2)
        CFI Block cfiBlock11 Using cfiCommon1
        CFI Function OSMutexQuery
        THUMB
//  505 INT8U  OSMutexQuery (OS_EVENT *pevent, OS_MUTEX_DATA *p_mutex_data)
//  506 {
OSMutexQuery:
        PUSH     {R4,R5,LR}
        CFI ?RET Frame(CFA, -4)
        CFI R5 Frame(CFA, -8)
        CFI R4 Frame(CFA, -12)
        CFI CFA R13+12
        MOVS     R4,R0
        MOVS     R5,R1
//  507 #if OS_CRITICAL_METHOD == 3                      /* Allocate storage for CPU status register           */
//  

⌨️ 快捷键说明

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