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

📄 os_mutex.txt

📁 uc/os在lpc2100系列的KEIL模板 uc/os在lpc2100系列的real view模板 uc/os在lpc210X系列的real view模板
💻 TXT
📖 第 1 页 / 共 4 页
字号:
;;;362            }
;;;363            OSTCBPrioTbl[pip]       = (OS_TCB *)ptcb;
;;;364        }
;;;365        OSTCBCur->OSTCBStat |= OS_STAT_MUTEX;             /* Mutex not available, pend current task        */
;;;366        OSTCBCur->OSTCBDly   = timeout;                   /* Store timeout in current task's TCB           */
;;;367        OS_EventTaskWait(pevent);                         /* Suspend task until event or timeout occurs    */
;;;368        OS_EXIT_CRITICAL();
;;;369        OS_Sched();                                        /* Find next highest priority task ready         */
;;;370        OS_ENTER_CRITICAL();
;;;371        if (OSTCBCur->OSTCBStat & OS_STAT_MUTEX) {        /* Must have timed out if still waiting for event*/
;;;372            OS_EventTO(pevent);
;;;373            OS_EXIT_CRITICAL();
;;;374            *err = OS_TIMEOUT;                            /* Indicate that we didn't get mutex within TO   */
;;;375            return;
;;;376        }
;;;377        OSTCBCur->OSTCBEventPtr = (OS_EVENT *)0;
;;;378        OS_EXIT_CRITICAL();
;;;379        *err = OS_NO_ERR;
;;;380    }
000314  e8bd5ff0          POP      {r4-r12,lr}
000318  e12fff1e          BX       lr
                  |L1.796|
00031c  e3540000          CMP      r4,#0                 ;322
000320  1a000002          BNE      |L1.816|
000324  e3a00004          MOV      r0,#4                 ;323
000328  e5c50000          STRB     r0,[r5,#0]            ;323
00032c  eafffff8          B        |L1.788|
                  |L1.816|
000330  e5d40000          LDRB     r0,[r4,#0]            ;326
000334  e3500004          CMP      r0,#4                 ;326
000338  0a000002          BEQ      |L1.840|
00033c  e3a00001          MOV      r0,#1                 ;327
000340  e5c50000          STRB     r0,[r5,#0]            ;327
000344  eafffff2          B        |L1.788|
                  |L1.840|
000348  ef000002          SVC      #0x2                  ;331
00034c  e1d400b2          LDRH     r0,[r4,#2]            ;332
000350  e59f6390          LDR      r6,|L1.1768|
000354  e3a07000          MOV      r7,#0                 ;332
000358  e1e01000          MVN      r1,r0                 ;332
00035c  e31100ff          TST      r1,#0xff              ;332
000360  1a00000a          BNE      |L1.912|
000364  e2000cff          AND      r0,r0,#0xff00         ;333
000368  e1c400b2          STRH     r0,[r4,#2]            ;333
00036c  e5961000          LDR      r1,[r6,#0]            ;334  ; OSTCBCur
000370  e5d1102d          LDRB     r1,[r1,#0x2d]         ;334
000374  e1800001          ORR      r0,r0,r1              ;334
000378  e1c400b2          STRH     r0,[r4,#2]            ;334
00037c  e5960000          LDR      r0,[r6,#0]            ;335  ; OSTCBCur
000380  e5840004          STR      r0,[r4,#4]            ;335
000384  ef000003          SVC      #0x3                  ;336
000388  e5c57000          STRB     r7,[r5,#0]            ;337
00038c  eaffffe0          B        |L1.788|
                  |L1.912|
000390  e1a01420          LSR      r1,r0,#8              ;340
000394  e20020ff          AND      r2,r0,#0xff           ;341
000398  e5940004          LDR      r0,[r4,#4]            ;342
00039c  e5d0302d          LDRB     r3,[r0,#0x2d]         ;343
0003a0  e1530001          CMP      r3,r1                 ;343
0003a4  0a00002c          BEQ      |L1.1116|
0003a8  e5963000          LDR      r3,[r6,#0]            ;343  ; OSTCBCur
0003ac  e5d3302d          LDRB     r3,[r3,#0x2d]         ;343
0003b0  e1530002          CMP      r3,r2                 ;343
0003b4  2a000028          BCS      |L1.1116|
0003b8  e5d0c02f          LDRB     r12,[r0,#0x2f]        ;344
0003bc  e59fe330          LDR      lr,|L1.1780|
0003c0  e5d03030          LDRB     r3,[r0,#0x30]         ;344
0003c4  e7de200c          LDRB     r2,[lr,r12]           ;344
0003c8  e59f9328          LDR      r9,|L1.1784|
0003cc  e1120003          TST      r2,r3                 ;344
0003d0  0a000008          BEQ      |L1.1016|
0003d4  e1d22003          BICS     r2,r2,r3              ;347
0003d8  e7ce200c          STRB     r2,[lr,r12]           ;347
0003dc  1a000003          BNE      |L1.1008|
0003e0  e5d02031          LDRB     r2,[r0,#0x31]         ;348
0003e4  e5d93000          LDRB     r3,[r9,#0]            ;348  ; OSRdyGrp
0003e8  e1c32002          BIC      r2,r3,r2              ;348
0003ec  e5c92000          STRB     r2,[r9,#0]            ;348  ; OSRdyGrp
                  |L1.1008|
0003f0  e3a03001          MOV      r3,#1                 ;350
0003f4  ea000000          B        |L1.1020|
                  |L1.1016|
0003f8  e3a03000          MOV      r3,#0                 ;352
                  |L1.1020|
0003fc  e5c0102d          STRB     r1,[r0,#0x2d]         ;354
000400  e5d0c02d          LDRB     r12,[r0,#0x2d]        ;355
000404  e1a021ac          LSR      r2,r12,#3             ;355
000408  e5c0202f          STRB     r2,[r0,#0x2f]         ;355
00040c  e5d0202f          LDRB     r2,[r0,#0x2f]         ;356
000410  e59fa2e4          LDR      r10,|L1.1788|
000414  e7dab002          LDRB     r11,[r10,r2]          ;356
000418  e5c0b031          STRB     r11,[r0,#0x31]        ;356
00041c  e20cc007          AND      r12,r12,#7            ;357
000420  e5c0c02e          STRB     r12,[r0,#0x2e]        ;357
000424  e7dac00c          LDRB     r12,[r10,r12]         ;358
000428  e5c0c030          STRB     r12,[r0,#0x30]        ;358
00042c  e3530001          CMP      r3,#1                 ;359
000430  1a000007          BNE      |L1.1108|
000434  e5d03031          LDRB     r3,[r0,#0x31]         ;360
000438  e5d9c000          LDRB     r12,[r9,#0]           ;360  ; OSRdyGrp
00043c  e183300c          ORR      r3,r3,r12             ;360
000440  e5c93000          STRB     r3,[r9,#0]            ;360  ; OSRdyGrp
000444  e7de3002          LDRB     r3,[lr,r2]            ;361
000448  e5d0c030          LDRB     r12,[r0,#0x30]        ;361
00044c  e183300c          ORR      r3,r3,r12             ;361
000450  e7ce3002          STRB     r3,[lr,r2]            ;361
                  |L1.1108|
000454  e59f2290          LDR      r2,|L1.1772|
000458  e7820101          STR      r0,[r2,r1,LSL #2]     ;363
                  |L1.1116|
00045c  e5960000          LDR      r0,[r6,#0]            ;365  ; OSTCBCur
000460  e5d0102c          LDRB     r1,[r0,#0x2c]         ;365
000464  e3811010          ORR      r1,r1,#0x10           ;365
000468  e5c0102c          STRB     r1,[r0,#0x2c]         ;365
00046c  e1c082ba          STRH     r8,[r0,#0x2a]         ;366
000470  e1a00004          MOV      r0,r4                 ;367
000474  ebfffffe          BL       OS_EventTaskWait
000478  ef000003          SVC      #0x3                  ;368
00047c  ebfffffe          BL       OS_Sched
000480  ef000002          SVC      #0x2                  ;370
000484  e5960000          LDR      r0,[r6,#0]            ;371  ; OSTCBCur
000488  e5d0102c          LDRB     r1,[r0,#0x2c]         ;371
00048c  e3110010          TST      r1,#0x10              ;371
000490  0a000005          BEQ      |L1.1196|
000494  e1a00004          MOV      r0,r4                 ;372
000498  ebfffffe          BL       OS_EventTO
00049c  ef000003          SVC      #0x3                  ;373
0004a0  e3a0000a          MOV      r0,#0xa               ;374
0004a4  e5c50000          STRB     r0,[r5,#0]            ;374
0004a8  eaffff99          B        |L1.788|
                  |L1.1196|
0004ac  e580701c          STR      r7,[r0,#0x1c]         ;377
0004b0  ef000003          SVC      #0x3                  ;378
0004b4  e5c57000          STRB     r7,[r5,#0]            ;379
0004b8  eaffff95          B        |L1.788|
;;;381    /*$PAGE*/
                          ENDP

                  OSMutexPost PROC
;;;399    INT8U  OSMutexPost (OS_EVENT *pevent)
;;;400    {
0004bc  e92d41f0          PUSH     {r4-r8,lr}
0004c0  e1a04000          MOV      r4,r0
;;;401    #if OS_CRITICAL_METHOD == 3                           /* Allocate storage for CPU status register      */
;;;402        OS_CPU_SR  cpu_sr;
;;;403    #endif    
;;;404        INT8U      pip;                                   /* Priority inheritance priority                 */
;;;405        INT8U      prio;
;;;406    
;;;407    
;;;408        if (OSIntNesting > 0) {                           /* See if called from ISR ...                    */
0004c4  e59f0218          LDR      r0,|L1.1764|
0004c8  e5d00000          LDRB     r0,[r0,#0]  ; OSIntNesting
0004cc  e3500000          CMP      r0,#0
0004d0  0a000002          BEQ      |L1.1248|
;;;409            return (OS_ERR_POST_ISR);                     /* ... can't POST mutex from an ISR              */
0004d4  e3a00005          MOV      r0,#5
                  |L1.1240|
0004d8  e8bd41f0          POP      {r4-r8,lr}
;;;410        }
;;;411    #if OS_ARG_CHK_EN > 0
;;;412        if (pevent == (OS_EVENT *)0) {                    /* Validate 'pevent'                             */
;;;413            return (OS_ERR_PEVENT_NULL);
;;;414        }
;;;415        if (pevent->OSEventType != OS_EVENT_TYPE_MUTEX) { /* Validate event block type                     */
;;;416            return (OS_ERR_EVENT_TYPE);
;;;417        }                                                 
;;;418    #endif
;;;419        OS_ENTER_CRITICAL();
;;;420        pip  = (INT8U)(pevent->OSEventCnt >> 8);          /* Get priority inheritance priority of mutex    */
;;;421        prio = (INT8U)(pevent->OSEventCnt & OS_MUTEX_KEEP_LOWER_8);  /* Get owner's original priority      */
;;;422        if (OSTCBCur->OSTCBPrio != pip && 
;;;423            OSTCBCur->OSTCBPrio != prio) {                /* See if posting task owns the MUTEX            */
;;;424            OS_EXIT_CRITICAL();
;;;425            return (OS_ERR_NOT_MUTEX_OWNER);
;;;426        }
;;;427        if (OSTCBCur->OSTCBPrio == pip) {                 /* Did we have to raise current task's priority? */
;;;428                                                          /* Yes, Return to original priority              */
;;;429                                                          /*      Remove owner from ready list at 'pip'    */
;;;430            if ((OSRdyTbl[OSTCBCur->OSTCBY] &= ~OSTCBCur->OSTCBBitX) == 0) {
;;;431                OSRdyGrp &= ~OSTCBCur->OSTCBBitY;
;;;432            }
;;;433            OSTCBCur->OSTCBPrio         = prio;
;;;434            OSTCBCur->OSTCBY            = prio >> 3;
;;;435            OSTCBCur->OSTCBBitY         = OSMapTbl[OSTCBCur->OSTCBY];
;;;436            OSTCBCur->OSTCBX            = prio & 0x07;
;;;437            OSTCBCur->OSTCBBitX         = OSMapTbl[OSTCBCur->OSTCBX];
;;;438            OSRdyGrp                   |= OSTCBCur->OSTCBBitY;
;;;439            OSRdyTbl[OSTCBCur->OSTCBY] |= OSTCBCur->OSTCBBitX;
;;;440            OSTCBPrioTbl[prio]          = (OS_TCB *)OSTCBCur;
;;;441        }
;;;442        OSTCBPrioTbl[pip] = (OS_TCB *)1;                  /* Reserve table entry                           */
;;;443        if (pevent->OSEventGrp != 0x00) {                 /* Any task waiting for the mutex?               */
;;;444                                                          /* Yes, Make HPT waiting for mutex ready         */
;;;445            prio                = OS_EventTaskRdy(pevent, (void *)0, OS_STAT_MUTEX);
;;;446            pevent->OSEventCnt &= OS_MUTEX_KEEP_UPPER_8;  /*      Save priority of mutex's new owner       */
;;;447            pevent->OSEventCnt |= prio;
;;;448            pevent->OSEventPtr  = OSTCBPrioTbl[prio];     /*      Link to mutex owner's OS_TCB             */
;;;449            OS_EXIT_CRITICAL();
;;;450            OS_Sched();                                   /*      Find highest priority task ready to run  */
;;;451            return (OS_NO_ERR);
;;;452        }
;;;453        pevent->OSEventCnt |= OS_MUTEX_AVAILABLE;         /* No,  Mutex is now available                   */
;;;454        pevent->OSEventPtr  = (void *)0;
;;;455        OS_EXIT_CRITICAL();
;;;456        return (OS_NO_ERR);
;;;457    }
0004dc  e12fff1e          BX       lr
                  |L1.1248|
0004e0  e3540000          CMP      r4,#0                 ;412
0004e4  1a000001          BNE      |L1.1264|
0004e8  e3a00004          MOV      r0,#4                 ;413
0004ec  eafffff9          B        |L1.1240|
                  |L1.1264|
0004f0  e5d40000          LDRB     r0,[r4,#0]            ;415
0004f4  e3500004          CMP      r0,#4                 ;415
0004f8  0a000001          BEQ      |L1.1284|
0004fc  e3a00001          MOV      r0,#1                 ;416
000500  eafffff4          B        |L1.1240|

⌨️ 快捷键说明

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