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

📄 os_mutex.txt

📁 ucos2.86版本结合STM板极支持包
💻 TXT
📖 第 1 页 / 共 4 页
字号:
0002b6  2004              MOVS     r0,#4
0002b8  7020              STRB     r0,[r4,#0]
                  |L1.698|
0002ba  b005              ADD      sp,sp,#0x14
0002bc  e8bde8bd          POP      {r4-r11,pc}
                  |L1.704|
;;;418            return;
;;;419        }
;;;420    #endif
;;;421        if (pevent->OSEventType != OS_EVENT_TYPE_MUTEX) {      /* Validate event block type                */
0002c0  7828              LDRB     r0,[r5,#0]
0002c2  f04ff04f          MOV      r8,#1
0002c6  2804              CMP      r0,#4
0002c8  d004              BEQ      |L1.724|
;;;422            *perr = OS_ERR_EVENT_TYPE;
0002ca  f884f884          STRB     r8,[r4,#0]
0002ce  b005              ADD      sp,sp,#0x14
0002d0  e8bde8bd          POP      {r4-r11,pc}
                  |L1.724|
;;;423            return;
;;;424        }
;;;425        if (OSIntNesting > 0) {                                /* See if called from ISR ...               */
0002d4  484c              LDR      r0,|L1.1032|
0002d6  7800              LDRB     r0,[r0,#0]  ; OSIntNesting
0002d8  b120              CBZ      r0,|L1.740|
;;;426            *perr = OS_ERR_PEND_ISR;                           /* ... can't PEND from an ISR               */
0002da  2002              MOVS     r0,#2
0002dc  7020              STRB     r0,[r4,#0]
0002de  b005              ADD      sp,sp,#0x14
0002e0  e8bde8bd          POP      {r4-r11,pc}
                  |L1.740|
;;;427            return;
;;;428        }
;;;429        if (OSLockNesting > 0) {                               /* See if called with scheduler locked ...  */
0002e4  484e              LDR      r0,|L1.1056|
0002e6  7800              LDRB     r0,[r0,#0]  ; OSLockNesting
0002e8  b120              CBZ      r0,|L1.756|
;;;430            *perr = OS_ERR_PEND_LOCKED;                        /* ... can't PEND when locked               */
0002ea  200d              MOVS     r0,#0xd
0002ec  7020              STRB     r0,[r4,#0]
0002ee  b005              ADD      sp,sp,#0x14
0002f0  e8bde8bd          POP      {r4-r11,pc}
                  |L1.756|
;;;431            return;
;;;432        }
;;;433        OS_ENTER_CRITICAL();                                
0002f4  f7fff7ff          BL       OS_CPU_SR_Save
0002f8  9001              STR      r0,[sp,#4]
;;;434        pip = (INT8U)(pevent->OSEventCnt >> 8);                /* Get PIP from mutex                       */
0002fa  8928              LDRH     r0,[r5,#8]
0002fc  0a01              LSRS     r1,r0,#8
;;;435                                                               /* Is Mutex available?                      */
;;;436        if ((INT8U)(pevent->OSEventCnt & OS_MUTEX_KEEP_LOWER_8) == OS_MUTEX_AVAILABLE) {
0002fe  43c2              MVNS     r2,r0
000300  4e42              LDR      r6,|L1.1036|
000302  f012f012          TST      r2,#0xff
000306  f04ff04f          MOV      r7,#0
00030a  d11b              BNE      |L1.836|
;;;437            pevent->OSEventCnt &= OS_MUTEX_KEEP_UPPER_8;       /* Yes, Acquire the resource                */
00030c  f400f400          AND      r2,r0,#0xff00
000310  812a              STRH     r2,[r5,#8]
;;;438            pevent->OSEventCnt |= OSTCBCur->OSTCBPrio;         /*      Save priority of owning task        */
000312  6830              LDR      r0,[r6,#0]  ; OSTCBCur
000314  f890f890          LDRB     r3,[r0,#0x2e]
000318  431a              ORRS     r2,r2,r3
00031a  812a              STRH     r2,[r5,#8]
;;;439            pevent->OSEventPtr  = (void *)OSTCBCur;            /*      Point to owning task's OS_TCB       */
00031c  6068              STR      r0,[r5,#4]
;;;440            if (OSTCBCur->OSTCBPrio <= pip) {                  /*      PIP 'must' have a SMALLER prio ...  */
00031e  f890f890          LDRB     r0,[r0,#0x2e]
000322  4288              CMP      r0,r1
000324  d807              BHI      |L1.822|
;;;441                OS_EXIT_CRITICAL();                            /*      ... than current task!              */
000326  9801              LDR      r0,[sp,#4]
000328  f7fff7ff          BL       OS_CPU_SR_Restore
;;;442                *perr = OS_ERR_PIP_LOWER;
00032c  2078              MOVS     r0,#0x78
00032e  7020              STRB     r0,[r4,#0]
000330  b005              ADD      sp,sp,#0x14
000332  e8bde8bd          POP      {r4-r11,pc}
                  |L1.822|
;;;443            } else {
;;;444                OS_EXIT_CRITICAL();
000336  9801              LDR      r0,[sp,#4]
000338  f7fff7ff          BL       OS_CPU_SR_Restore
;;;445                *perr = OS_ERR_NONE;
00033c  7027              STRB     r7,[r4,#0]
00033e  b005              ADD      sp,sp,#0x14
000340  e8bde8bd          POP      {r4-r11,pc}
                  |L1.836|
;;;446            }
;;;447            return;
;;;448        }
;;;449        mprio = (INT8U)(pevent->OSEventCnt & OS_MUTEX_KEEP_LOWER_8);  /* No, Get priority of mutex owner   */
000344  b2c2              UXTB     r2,r0
;;;450        ptcb  = (OS_TCB *)(pevent->OSEventPtr);                       /*     Point to TCB of mutex owner   */
000346  6868              LDR      r0,[r5,#4]
;;;451        if (ptcb->OSTCBPrio > pip) {                                  /*     Need to promote prio of owner?*/
000348  f890f890          LDRB     r3,[r0,#0x2e]
00034c  428b              CMP      r3,r1
00034e  d97f              BLS      |L1.1104|
;;;452            if (mprio > OSTCBCur->OSTCBPrio) {
000350  6833              LDR      r3,[r6,#0]  ; OSTCBCur
000352  f893f893          LDRB     r3,[r3,#0x2e]
000356  4293              CMP      r3,r2
000358  d27a              BCS      |L1.1104|
;;;453                y = ptcb->OSTCBY;
00035a  f890f890          LDRB     r3,[r0,#0x30]
;;;454                if ((OSRdyTbl[y] & ptcb->OSTCBBitX) != 0) {           /*     See if mutex owner is ready   */
00035e  f8dff8df          LDR      lr,|L1.1048|
000362  f890f890          LDRB     r12,[r0,#0x31]
000366  f81ef81e          LDRB     r2,[lr,r3]
00036a  f8dff8df          LDR      r9,|L1.1052|
00036e  ea12ea12          TST      r2,r12
000372  d010              BEQ      |L1.918|
;;;455                    OSRdyTbl[y] &= ~ptcb->OSTCBBitX;                  /*     Yes, Remove owner from Rdy ...*/
000374  ea22ea22          BIC      r2,r2,r12
000378  f80ef80e          STRB     r2,[lr,r3]
;;;456                    if (OSRdyTbl[y] == 0) {                           /*          ... list at current prio */
00037c  f81ef81e          LDRB     r2,[lr,r3]
000380  b93a              CBNZ     r2,|L1.914|
;;;457                        OSRdyGrp &= ~ptcb->OSTCBBitY;
000382  f890f890          LDRB     r2,[r0,#0x32]
000386  f899f899          LDRB     r3,[r9,#0]  ; OSRdyGrp
00038a  ea23ea23          BIC      r2,r3,r2
00038e  f889f889          STRB     r2,[r9,#0]  ; OSRdyGrp
                  |L1.914|
;;;458                    }
;;;459                    rdy = OS_TRUE;
000392  2201              MOVS     r2,#1
000394  e011              B        |L1.954|
                  |L1.918|
;;;460                } else {
;;;461                    pevent2 = ptcb->OSTCBEventPtr;
000396  69c2              LDR      r2,[r0,#0x1c]
;;;462                    if (pevent2 != (OS_EVENT *)0) {                   /* Remove from event wait list       */
000398  b172              CBZ      r2,|L1.952|
;;;463                        if ((pevent2->OSEventTbl[ptcb->OSTCBY] &= ~ptcb->OSTCBBitX) == 0) {
00039a  f102f102          ADD      r10,r2,#0xb
00039e  f813f813          LDRB     r11,[r3,r10]
0003a2  ea3bea3b          BICS     r12,r11,r12
0003a6  f803f803          STRB     r12,[r3,r10]
0003aa  d105              BNE      |L1.952|
;;;464                            pevent2->OSEventGrp &= ~ptcb->OSTCBBitY;
0003ac  7a93              LDRB     r3,[r2,#0xa]
0003ae  f890f890          LDRB     r12,[r0,#0x32]
0003b2  ea23ea23          BIC      r3,r3,r12
0003b6  7293              STRB     r3,[r2,#0xa]
                  |L1.952|
;;;465                        }
;;;466                    }
;;;467                    rdy = OS_FALSE;                            /* No                                       */
0003b8  2200              MOVS     r2,#0
                  |L1.954|
;;;468                }
;;;469                ptcb->OSTCBPrio = pip;                         /* Change owner task prio to PIP            */
0003ba  f880f880          STRB     r1,[r0,#0x2e]
;;;470    #if OS_LOWEST_PRIO <= 63
;;;471                ptcb->OSTCBY    = (INT8U)( ptcb->OSTCBPrio >> 3);
0003be  f890f890          LDRB     r3,[r0,#0x2e]
0003c2  ea4fea4f          LSR      r12,r3,#3
0003c6  f880f880          STRB     r12,[r0,#0x30]
;;;472                ptcb->OSTCBX    = (INT8U)( ptcb->OSTCBPrio & 0x07);
0003ca  f003f003          AND      r10,r3,#7
0003ce  f880f880          STRB     r10,[r0,#0x2f]
;;;473                ptcb->OSTCBBitY = (INT8U)(1 << ptcb->OSTCBY);
0003d2  f890f890          LDRB     r12,[r0,#0x30]
0003d6  fa08fa08          LSL      r3,r8,r12
0003da  b2db              UXTB     r3,r3
0003dc  f880f880          STRB     r3,[r0,#0x32]
;;;474                ptcb->OSTCBBitX = (INT8U)(1 << ptcb->OSTCBX);
0003e0  fa08fa08          LSL      r8,r8,r10
0003e4  f008f008          AND      r8,r8,#0xff
0003e8  f880f880          STRB     r8,[r0,#0x31]
;;;475    #else
;;;476                ptcb->OSTCBY    = (INT8U)((ptcb->OSTCBPrio >> 4) & 0xFF);
;;;477                ptcb->OSTCBX    = (INT8U)( ptcb->OSTCBPrio & 0x0F);
;;;478                ptcb->OSTCBBitY = (INT16U)(1 << ptcb->OSTCBY);
;;;479                ptcb->OSTCBBitX = (INT16U)(1 << ptcb->OSTCBX);
;;;480    #endif
;;;481                if (rdy == OS_TRUE) {                          /* If task was ready at owner's priority ...*/
0003ec  2a01              CMP      r2,#1
0003ee  d11a              BNE      |L1.1062|
;;;482                    OSRdyGrp               |= ptcb->OSTCBBitY; /* ... make it ready at new priority.       */
0003f0  f899f899          LDRB     r2,[r9,#0]  ; OSRdyGrp
0003f4  431a              ORRS     r2,r2,r3
0003f6  f889f889          STRB     r2,[r9,#0]  ; OSRdyGrp
;;;483                    OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
0003fa  f81ef81e          LDRB     r2,[lr,r12]
0003fe  ea42ea42          ORR      r2,r2,r8
000402  f80ef80e          STRB     r2,[lr,r12]
000406  e020              B        |L1.1098|
                  |L1.1032|
000408  00000000          DCD      OSIntNesting
                  |L1.1036|
00040c  00000000          DCD      OSTCBCur
                  |L1.1040|
000410  00000000          DCD      OSTCBPrioTbl
                  |L1.1044|
000414  00000000          DCD      OSEventFreeList
                  |L1.1048|
000418  00000000          DCD      OSRdyTbl
                  |L1.1052|
00041c  00000000          DCD      OSRdyGrp
                  |L1.1056|
000420  00000000          DCD      OSLockNesting
000424  e014              B        |L1.1104|
                  |L1.1062|
;;;484                } else {
;;;485                    pevent2 = ptcb->OSTCBEventPtr;
000426  69c2              LDR      r2,[r0,#0x1c]
;;;486                    if (pevent2 != (OS_EVENT *)0) {            /* Add to event wait list                   */
000428  b17a              CBZ      r2,|L1.1098|
;;;487                        pevent2->OSEventGrp               |= ptcb->OSTCBBitY;
00042a  f892f892          LDRB     r12,[r2,#0xa]
00042e  ea4cea4c          ORR      r3,r12,r3
000432  7293              STRB     r3,[r2,#0xa]
;;;488                        pevent2->OSEventTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
000434  f890f890          LDRB     r3,[r0,#0x30]
000438  320b              ADDS     r2,r2,#0xb
00043a  f813f813          LDRB     r12,[r3,r2]
00043e  f890f890          LDRB     lr,[r0,#0x31]
000442  ea4cea4c          ORR      r12,r12,lr
000446  f803f803          STRB     r12,[r3,r2]
                  |L1.1098|
;;;489                    }
;;;490                }
;;;491                OSTCBPrioTbl[pip] = ptcb;
00044a  4a63              LDR      r2,|L1.1496|
00044c  f842f842          STR      r0,[r2,r1,LSL #2]
                  |L1.1104|
;;;492            }
;;;493        }
;;;494        OSTCBCur->OSTCBStat     |= OS_STAT_MUTEX;         /* Mutex not available, pend current task        */
000450  6830              LDR      r0,[r6,#0]  ; OSTCBCur
000452  f890f890          LDRB     r1,[r0,#0x2c]
000456  f041f041          ORR      r1,r1,#0x10
00045a  f880f880          STRB     r1,[r0,#0x2c]
;;;495        OSTCBCur->OSTCBStatPend  = OS_STAT_PEND_OK;
00045e  f880f880          STRB     r7,[r0,#0x2d]
;;;496        OSTCBCur->OSTCBDly       = timeout;               /* Store timeout in current task's TCB           */
000462  9903              LDR      r1,[sp,#0xc]
000464  8541              STRH     r1,[r0,#0x2a]
;;;497        OS_EventTaskWait(pevent);                         /* Suspend task until event or timeout occurs    */
000466  4628              MOV      r0,r5
000468  f7fff7ff          BL       OS_EventTaskWait
;;;498        OS_EXIT_CRITICAL();
00046c  9801              LDR      r0,[sp,#4]
00046e  f7fff7ff          BL       OS_CPU_SR_Restore
;;;499        OS_Sched();                                       /* Find next highest priority task ready         */
000472  f7fff7ff          BL       OS_Sched
;;;500        OS_ENTER_CRITICAL();
000476  f7fff7ff          BL       OS_CPU_SR_Save
00047a  4680              MOV      r8,r0
;;;501        if (OSTCBCur->OSTCBStatPend != OS_STAT_PEND_OK) { /* See if we timed out during the pend           */
00047c  6831              LDR      r1,[r6,#0]  ; OSTCBCur
00047e  f891f891          LDRB     r6,[r1,#0x2d]
000482  b18e              CBZ      r6,|L1.1192|
;;;502            pend_stat = OSTCBCur->OSTCBStatPend;
;;;503            OS_EventTOAbort(pevent);
000484  4628              MOV      r0,r5
000486  f7fff7ff          BL       OS_EventTOAbort
;;;504            OS_EXIT_CRITICAL();
00048a  4640              MOV      r0,r8
00048c  f7fff7ff          BL       OS_CPU_SR_Restore
;;;505            switch (pend_stat) {
000490  2e02              CMP      r6,#2
000492  d004              BEQ      |L1.1182|
;;;506                case OS_STAT_PEND_TO:
;;;507                default:
;;;508                     *perr = OS_ERR_TIMEOUT;              /* Indicate that we didn't get mutex within TO   */
000494  200a              MOVS     r0,#0xa
000496  7020              STRB     r0,[r4,#0]
000498  b005              ADD      sp,sp,#0x14

⌨️ 快捷键说明

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