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

📄 os_mutex.txt

📁 ucos2 is a file system for embedded applications which can be used on any media, for which you can p
💻 TXT
📖 第 1 页 / 共 4 页
字号:
;;;416        if (pevent == (OS_EVENT *)0) {                         /* Validate 'pevent'                        */
;;;417            *perr = OS_ERR_PEVENT_NULL;
;;;418            return;
;;;419        }
;;;420    #endif
;;;421        if (pevent->OSEventType != OS_EVENT_TYPE_MUTEX) {      /* Validate event block type                */
000368  e5d00000          LDRB     r0,[r0,#0]
00036c  e1a04002          MOV      r4,r2                 ;398
000370  e3a08001          MOV      r8,#1
000374  e3500004          CMP      r0,#4
;;;422            *perr = OS_ERR_EVENT_TYPE;
000378  15c48000          STRBNE   r8,[r4,#0]
;;;423            return;
00037c  1a000083          BNE      |L1.1424|
;;;424        }
;;;425        if (OSIntNesting > 0) {                                /* See if called from ISR ...               */
000380  e59f03bc          LDR      r0,|L1.1860|
000384  e5d00000          LDRB     r0,[r0,#0]  ; OSIntNesting
000388  e3500000          CMP      r0,#0
;;;426            *perr = OS_ERR_PEND_ISR;                           /* ... can't PEND from an ISR               */
00038c  13a00002          MOVNE    r0,#2
;;;427            return;
000390  1a00007d          BNE      |L1.1420|
;;;428        }
;;;429        if (OSLockNesting > 0) {                               /* See if called with scheduler locked ...  */
000394  e59f03c0          LDR      r0,|L1.1884|
000398  e5d00000          LDRB     r0,[r0,#0]  ; OSLockNesting
00039c  e3500000          CMP      r0,#0
;;;430            *perr = OS_ERR_PEND_LOCKED;                        /* ... can't PEND when locked               */
0003a0  13a0000d          MOVNE    r0,#0xd
;;;431            return;
0003a4  1a000078          BNE      |L1.1420|
;;;432        }
;;;433        OS_ENTER_CRITICAL();                                
0003a8  ebfffffe          BL       OS_CPU_SR_Save
0003ac  e1a06000          MOV      r6,r0
;;;434        pip = (INT8U)(pevent->OSEventCnt >> 8);                /* Get PIP from mutex                       */
0003b0  e1d500b8          LDRH     r0,[r5,#8]
;;;435                                                               /* Is Mutex available?                      */
;;;436        if ((INT8U)(pevent->OSEventCnt & OS_MUTEX_KEEP_LOWER_8) == OS_MUTEX_AVAILABLE) {
0003b4  e59f738c          LDR      r7,|L1.1864|
0003b8  e3a09000          MOV      r9,#0
0003bc  e1e01000          MVN      r1,r0
0003c0  e31100ff          TST      r1,#0xff
0003c4  e1a02420          LSR      r2,r0,#8              ;434
0003c8  1a00000d          BNE      |L1.1028|
;;;437            pevent->OSEventCnt &= OS_MUTEX_KEEP_UPPER_8;       /* Yes, Acquire the resource                */
0003cc  e2001cff          AND      r1,r0,#0xff00
0003d0  e1c510b8          STRH     r1,[r5,#8]
;;;438            pevent->OSEventCnt |= OSTCBCur->OSTCBPrio;         /*      Save priority of owning task        */
0003d4  e5970000          LDR      r0,[r7,#0]  ; OSTCBCur
0003d8  e5d0302e          LDRB     r3,[r0,#0x2e]
0003dc  e1811003          ORR      r1,r1,r3
0003e0  e1c510b8          STRH     r1,[r5,#8]
;;;439            pevent->OSEventPtr  = (void *)OSTCBCur;            /*      Point to owning task's OS_TCB       */
0003e4  e5850004          STR      r0,[r5,#4]
;;;440            if (OSTCBCur->OSTCBPrio <= pip) {                  /*      PIP 'must' have a SMALLER prio ...  */
0003e8  e5d0002e          LDRB     r0,[r0,#0x2e]
0003ec  e1500002          CMP      r0,r2
;;;441                OS_EXIT_CRITICAL();                            /*      ... than current task!              */
0003f0  e1a00006          MOV      r0,r6
;;;442                *perr = OS_ERR_PIP_LOWER;
;;;443            } else {
;;;444                OS_EXIT_CRITICAL();
;;;445                *perr = OS_ERR_NONE;
0003f4  8a000069          BHI      |L1.1440|
0003f8  ebfffffe          BL       OS_CPU_SR_Restore
0003fc  e3a00078          MOV      r0,#0x78              ;442
000400  ea000061          B        |L1.1420|
                  |L1.1028|
;;;446            }
;;;447            return;
;;;448        }
;;;449        mprio = (INT8U)(pevent->OSEventCnt & OS_MUTEX_KEEP_LOWER_8);  /* No, Get priority of mutex owner   */
;;;450        ptcb  = (OS_TCB *)(pevent->OSEventPtr);                       /*     Point to TCB of mutex owner   */
000404  e5951004          LDR      r1,[r5,#4]
000408  e20000ff          AND      r0,r0,#0xff           ;449
;;;451        if (ptcb->OSTCBPrio > pip) {                                  /*     Need to promote prio of owner?*/
00040c  e5d1302e          LDRB     r3,[r1,#0x2e]
000410  e1530002          CMP      r3,r2
000414  9a000043          BLS      |L1.1320|
;;;452            if (mprio > OSTCBCur->OSTCBPrio) {
000418  e5973000          LDR      r3,[r7,#0]  ; OSTCBCur
00041c  e5d3302e          LDRB     r3,[r3,#0x2e]
000420  e1530000          CMP      r3,r0
000424  2a00003f          BCS      |L1.1320|
;;;453                y = ptcb->OSTCBY;
000428  e5d1c030          LDRB     r12,[r1,#0x30]
;;;454                if ((OSRdyTbl[y] & ptcb->OSTCBBitX) != 0) {           /*     See if mutex owner is ready   */
00042c  e59fa320          LDR      r10,|L1.1876|
000430  e5d13031          LDRB     r3,[r1,#0x31]
000434  e7da000c          LDRB     r0,[r10,r12]
000438  e59fb318          LDR      r11,|L1.1880|
00043c  e1100003          TST      r0,r3
000440  0a000009          BEQ      |L1.1132|
;;;455                    OSRdyTbl[y] &= ~ptcb->OSTCBBitX;                  /*     Yes, Remove owner from Rdy ...*/
000444  e1c00003          BIC      r0,r0,r3
000448  e7ca000c          STRB     r0,[r10,r12]
;;;456                    if (OSRdyTbl[y] == 0) {                           /*          ... list at current prio */
00044c  e7da000c          LDRB     r0,[r10,r12]
000450  e3500000          CMP      r0,#0
;;;457                        OSRdyGrp &= ~ptcb->OSTCBBitY;
000454  05d10032          LDRBEQ   r0,[r1,#0x32]
000458  05db3000          LDRBEQ   r3,[r11,#0]  ; OSRdyGrp
00045c  01c30000          BICEQ    r0,r3,r0
000460  05cb0000          STRBEQ   r0,[r11,#0]  ; OSRdyGrp
;;;458                    }
;;;459                    rdy = OS_TRUE;
000464  e3a00001          MOV      r0,#1
000468  ea00000b          B        |L1.1180|
                  |L1.1132|
;;;460                } else {
;;;461                    pevent2 = ptcb->OSTCBEventPtr;
00046c  e591001c          LDR      r0,[r1,#0x1c]
;;;462                    if (pevent2 != (OS_EVENT *)0) {                   /* Remove from event wait list       */
000470  e3500000          CMP      r0,#0
000474  0a000007          BEQ      |L1.1176|
;;;463                        if ((pevent2->OSEventTbl[ptcb->OSTCBY] &= ~ptcb->OSTCBBitX) == 0) {
000478  e08cc000          ADD      r12,r12,r0
00047c  e5dce00b          LDRB     lr,[r12,#0xb]
000480  e1de3003          BICS     r3,lr,r3
000484  e5cc300b          STRB     r3,[r12,#0xb]
;;;464                            pevent2->OSEventGrp &= ~ptcb->OSTCBBitY;
000488  05d0300a          LDRBEQ   r3,[r0,#0xa]
00048c  05d1c032          LDRBEQ   r12,[r1,#0x32]
000490  01c3300c          BICEQ    r3,r3,r12
000494  05c0300a          STRBEQ   r3,[r0,#0xa]
                  |L1.1176|
;;;465                        }
;;;466                    }
;;;467                    rdy = OS_FALSE;                            /* No                                       */
000498  e3a00000          MOV      r0,#0
                  |L1.1180|
;;;468                }
;;;469                ptcb->OSTCBPrio = pip;                         /* Change owner task prio to PIP            */
;;;470    #if OS_LOWEST_PRIO <= 63
;;;471                ptcb->OSTCBY    = (INT8U)( ptcb->OSTCBPrio >> 3);
00049c  e20230ff          AND      r3,r2,#0xff
0004a0  e1a0c1a3          LSR      r12,r3,#3
;;;472                ptcb->OSTCBX    = (INT8U)( ptcb->OSTCBPrio & 0x07);
0004a4  e203e007          AND      lr,r3,#7
0004a8  e5c1202e          STRB     r2,[r1,#0x2e]         ;469
0004ac  e5c1c030          STRB     r12,[r1,#0x30]        ;471
;;;473                ptcb->OSTCBBitY = (INT8U)(1 << ptcb->OSTCBY);
0004b0  e20c30ff          AND      r3,r12,#0xff
0004b4  e5c1e02f          STRB     lr,[r1,#0x2f]         ;472
0004b8  e1a0c318          LSL      r12,r8,r3
;;;474                ptcb->OSTCBBitX = (INT8U)(1 << ptcb->OSTCBX);
0004bc  e1a0ee18          LSL      lr,r8,lr
0004c0  e20cc0ff          AND      r12,r12,#0xff         ;473
0004c4  e20ee0ff          AND      lr,lr,#0xff
0004c8  e5c1c032          STRB     r12,[r1,#0x32]        ;473
;;;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 ...*/
0004cc  e3500001          CMP      r0,#1
0004d0  e5c1e031          STRB     lr,[r1,#0x31]         ;474
;;;482                    OSRdyGrp               |= ptcb->OSTCBBitY; /* ... make it ready at new priority.       */
0004d4  05db0000          LDRBEQ   r0,[r11,#0]  ; OSRdyGrp
0004d8  0180000c          ORREQ    r0,r0,r12
0004dc  05cb0000          STRBEQ   r0,[r11,#0]  ; OSRdyGrp
;;;483                    OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
0004e0  07da0003          LDRBEQ   r0,[r10,r3]
0004e4  0180000e          ORREQ    r0,r0,lr
0004e8  07ca0003          STRBEQ   r0,[r10,r3]
0004ec  0a00000b          BEQ      |L1.1312|
;;;484                } else {
;;;485                    pevent2 = ptcb->OSTCBEventPtr;
0004f0  e591001c          LDR      r0,[r1,#0x1c]
;;;486                    if (pevent2 != (OS_EVENT *)0) {            /* Add to event wait list                   */
0004f4  e3500000          CMP      r0,#0
0004f8  0a000008          BEQ      |L1.1312|
;;;487                        pevent2->OSEventGrp               |= ptcb->OSTCBBitY;
0004fc  e5d0300a          LDRB     r3,[r0,#0xa]
000500  e183300c          ORR      r3,r3,r12
000504  e5c0300a          STRB     r3,[r0,#0xa]
;;;488                        pevent2->OSEventTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
000508  e5d13030          LDRB     r3,[r1,#0x30]
00050c  e5d1c031          LDRB     r12,[r1,#0x31]
000510  e0800003          ADD      r0,r0,r3
000514  e5d0300b          LDRB     r3,[r0,#0xb]
000518  e183300c          ORR      r3,r3,r12
00051c  e5c0300b          STRB     r3,[r0,#0xb]
                  |L1.1312|
;;;489                    }
;;;490                }
;;;491                OSTCBPrioTbl[pip] = ptcb;
000520  e59f0224          LDR      r0,|L1.1868|
000524  e7801102          STR      r1,[r0,r2,LSL #2]
                  |L1.1320|
;;;492            }
;;;493        }
;;;494        OSTCBCur->OSTCBStat     |= OS_STAT_MUTEX;         /* Mutex not available, pend current task        */
000528  e5970000          LDR      r0,[r7,#0]  ; OSTCBCur
00052c  e5d0102c          LDRB     r1,[r0,#0x2c]
000530  e3811010          ORR      r1,r1,#0x10
000534  e5c0102c          STRB     r1,[r0,#0x2c]
;;;495        OSTCBCur->OSTCBStatPend  = OS_STAT_PEND_OK;
000538  e5c0902d          STRB     r9,[r0,#0x2d]
;;;496        OSTCBCur->OSTCBDly       = timeout;               /* Store timeout in current task's TCB           */
00053c  e59d1004          LDR      r1,[sp,#4]
000540  e1c012ba          STRH     r1,[r0,#0x2a]
;;;497        OS_EventTaskWait(pevent);                         /* Suspend task until event or timeout occurs    */
000544  e1a00005          MOV      r0,r5
000548  ebfffffe          BL       OS_EventTaskWait
;;;498        OS_EXIT_CRITICAL();
00054c  e1a00006          MOV      r0,r6
000550  ebfffffe          BL       OS_CPU_SR_Restore
;;;499        OS_Sched();                                       /* Find next highest priority task ready         */
000554  ebfffffe          BL       OS_Sched
;;;500        OS_ENTER_CRITICAL();
000558  ebfffffe          BL       OS_CPU_SR_Save
;;;501        if (OSTCBCur->OSTCBStatPend != OS_STAT_PEND_OK) { /* See if we timed out during the pend           */
00055c  e5971000          LDR      r1,[r7,#0]  ; OSTCBCur
000560  e1a08000          MOV      r8,r0                 ;500
000564  e5d1602d          LDRB     r6,[r1,#0x2d]
000568  e3560000          CMP      r6,#0
00056c  0a000009          BEQ      |L1.1432|
;;;502            pend_stat = OSTCBCur->OSTCBStatPend;
;;;503            OS_EventTOAbort(pevent);
000570  e1a00005          MOV      r0,r5
000574  ebfffffe          BL       OS_EventTOAbort
;;;504            OS_EXIT_CRITICAL();
000578  e1a00008          MOV      r0,r8
00057c  ebfffffe          BL       OS_CPU_SR_Restore
;;;505            switch (pend_stat) {
000580  e3560002          CMP      r6,#2
;;;506                case OS_STAT_PEND_TO:
;;;507                default:
;;;508                     *perr = OS_ERR_TIMEOUT;              /* Indicate that we didn't get mutex within TO   */
;;;509                     break;
;;;510    
;;;511                case OS_STAT_PEND_ABORT:
;;;512                     *perr = OS_ERR_PEND_ABORT;           /* Indicate that we aborted getting mutex        */
000584  03a0000e          MOVEQ    r0,#0xe
000588  13a0000a          MOVNE    r0,#0xa               ;508
                  |L1.1420|
00058c  e5c40000          STRB     r0,[r4,#0]
                  |L1.1424|
;;;513                     break;
;;;514            }
;;;515            return;
;;;516        }
;;;517        OSTCBCur->OSTCBEventPtr = (OS_EVENT *)0;

⌨️ 快捷键说明

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