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

📄 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 页
字号:
;;;518        OS_EXIT_CRITICAL();
;;;519        *perr = OS_ERR_NONE;
;;;520    }
000590  e8bd4ffe          POP      {r1-r11,lr}
000594  e12fff1e          BX       lr
                  |L1.1432|
000598  e1a00008          MOV      r0,r8                 ;518
00059c  e581901c          STR      r9,[r1,#0x1c]         ;518
                  |L1.1440|
0005a0  ebfffffe          BL       OS_CPU_SR_Restore
0005a4  e5c49000          STRB     r9,[r4,#0]            ;445
0005a8  eafffff8          B        |L1.1424|
;;;521    /*$PAGE*/
                          ENDP

                  OSMutexPost PROC
;;;546    INT8U  OSMutexPost (OS_EVENT *pevent)
;;;547    {
0005ac  e92d41f0          PUSH     {r4-r8,lr}
0005b0  e1a04000          MOV      r4,r0
;;;548        INT8U      pip;                                   /* Priority inheritance priority                 */
;;;549        INT8U      prio;
;;;550    #if OS_CRITICAL_METHOD == 3                           /* Allocate storage for CPU status register      */
;;;551        OS_CPU_SR  cpu_sr = 0;
;;;552    #endif
;;;553    
;;;554    
;;;555    
;;;556        if (OSIntNesting > 0) {                           /* See if called from ISR ...                    */
0005b4  e59f0188          LDR      r0,|L1.1860|
0005b8  e5d00000          LDRB     r0,[r0,#0]  ; OSIntNesting
0005bc  e3500000          CMP      r0,#0
;;;557            return (OS_ERR_POST_ISR);                     /* ... can't POST mutex from an ISR              */
0005c0  13a00005          MOVNE    r0,#5
0005c4  1a000010          BNE      |L1.1548|
;;;558        }
;;;559    #if OS_ARG_CHK_EN > 0
;;;560        if (pevent == (OS_EVENT *)0) {                    /* Validate 'pevent'                             */
;;;561            return (OS_ERR_PEVENT_NULL);
;;;562        }
;;;563    #endif
;;;564        if (pevent->OSEventType != OS_EVENT_TYPE_MUTEX) { /* Validate event block type                     */
0005c8  e5d40000          LDRB     r0,[r4,#0]
0005cc  e3500004          CMP      r0,#4
;;;565            return (OS_ERR_EVENT_TYPE);
0005d0  13a00001          MOVNE    r0,#1
0005d4  1a00000c          BNE      |L1.1548|
;;;566        }
;;;567        OS_ENTER_CRITICAL();
0005d8  ebfffffe          BL       OS_CPU_SR_Save
0005dc  e1a06000          MOV      r6,r0
;;;568        pip  = (INT8U)(pevent->OSEventCnt >> 8);          /* Get priority inheritance priority of mutex    */
0005e0  e1d400b8          LDRH     r0,[r4,#8]
;;;569        prio = (INT8U)(pevent->OSEventCnt & OS_MUTEX_KEEP_LOWER_8);  /* Get owner's original priority      */
;;;570        if (OSTCBCur != (OS_TCB *)pevent->OSEventPtr) {   /* See if posting task owns the MUTEX            */
0005e4  e5942004          LDR      r2,[r4,#4]
0005e8  e1a05420          LSR      r5,r0,#8              ;568
0005ec  e20010ff          AND      r1,r0,#0xff           ;569
0005f0  e59f0150          LDR      r0,|L1.1864|
0005f4  e5900000          LDR      r0,[r0,#0]  ; OSTCBCur
0005f8  e1520000          CMP      r2,r0
0005fc  0a000004          BEQ      |L1.1556|
;;;571            OS_EXIT_CRITICAL();
000600  e1a00006          MOV      r0,r6
000604  ebfffffe          BL       OS_CPU_SR_Restore
;;;572            return (OS_ERR_NOT_MUTEX_OWNER);
000608  e3a00064          MOV      r0,#0x64
                  |L1.1548|
00060c  e8bd41f0          POP      {r4-r8,lr}
;;;573        }
;;;574        if (OSTCBCur->OSTCBPrio == pip) {                 /* Did we have to raise current task's priority? */
;;;575            OSMutex_RdyAtPrio(OSTCBCur, prio);            /* Restore the task's original priority          */
;;;576        }
;;;577        OSTCBPrioTbl[pip] = OS_TCB_RESERVED;              /* Reserve table entry                           */
;;;578        if (pevent->OSEventGrp != 0) {                    /* Any task waiting for the mutex?               */
;;;579                                                          /* Yes, Make HPT waiting for mutex ready         */
;;;580            prio                = OS_EventTaskRdy(pevent, (void *)0, OS_STAT_MUTEX, OS_STAT_PEND_OK);
;;;581            pevent->OSEventCnt &= OS_MUTEX_KEEP_UPPER_8;  /*      Save priority of mutex's new owner       */
;;;582            pevent->OSEventCnt |= prio;
;;;583            pevent->OSEventPtr  = OSTCBPrioTbl[prio];     /*      Link to new mutex owner's OS_TCB         */
;;;584            if (prio <= pip) {                            /*      PIP 'must' have a SMALLER prio ...       */
;;;585                OS_EXIT_CRITICAL();                       /*      ... than current task!                   */
;;;586                OS_Sched();                               /*      Find highest priority task ready to run  */
;;;587                return (OS_ERR_PIP_LOWER);
;;;588            } else {
;;;589                OS_EXIT_CRITICAL();
;;;590                OS_Sched();                               /*      Find highest priority task ready to run  */
;;;591                return (OS_ERR_NONE);
;;;592            }
;;;593        }
;;;594        pevent->OSEventCnt |= OS_MUTEX_AVAILABLE;         /* No,  Mutex is now available                   */
;;;595        pevent->OSEventPtr  = (void *)0;
;;;596        OS_EXIT_CRITICAL();
;;;597        return (OS_ERR_NONE);
;;;598    }
000610  e12fff1e          BX       lr
                  |L1.1556|
000614  e5d0202e          LDRB     r2,[r0,#0x2e]         ;574
000618  e1520005          CMP      r2,r5                 ;574
00061c  0bfffffe          BLEQ     OSMutex_RdyAtPrio
000620  e59f7124          LDR      r7,|L1.1868|
000624  e3a00001          MOV      r0,#1                 ;577
000628  e7870105          STR      r0,[r7,r5,LSL #2]     ;577
00062c  e5d4000a          LDRB     r0,[r4,#0xa]          ;578
000630  e3500000          CMP      r0,#0                 ;578
000634  0a000015          BEQ      |L1.1680|
000638  e3a03000          MOV      r3,#0                 ;580
00063c  e3a02010          MOV      r2,#0x10              ;580
000640  e1a01003          MOV      r1,r3                 ;580
000644  e1a00004          MOV      r0,r4                 ;580
000648  ebfffffe          BL       OS_EventTaskRdy
00064c  e1d410b8          LDRH     r1,[r4,#8]            ;581
000650  e1500005          CMP      r0,r5                 ;584
000654  e2011cff          AND      r1,r1,#0xff00         ;581
000658  e1811000          ORR      r1,r1,r0              ;582
00065c  e1c410b8          STRH     r1,[r4,#8]            ;582
000660  e7971100          LDR      r1,[r7,r0,LSL #2]     ;583
000664  e1a00006          MOV      r0,r6                 ;585
000668  e5841004          STR      r1,[r4,#4]            ;585
00066c  8a000003          BHI      |L1.1664|
000670  ebfffffe          BL       OS_CPU_SR_Restore
000674  ebfffffe          BL       OS_Sched
000678  e3a00078          MOV      r0,#0x78              ;587
00067c  eaffffe2          B        |L1.1548|
                  |L1.1664|
000680  ebfffffe          BL       OS_CPU_SR_Restore
000684  ebfffffe          BL       OS_Sched
                  |L1.1672|
000688  e3a00000          MOV      r0,#0                 ;597
00068c  eaffffde          B        |L1.1548|
                  |L1.1680|
000690  e1d400b8          LDRH     r0,[r4,#8]            ;594
000694  e38000ff          ORR      r0,r0,#0xff           ;594
000698  e1c400b8          STRH     r0,[r4,#8]            ;594
00069c  e3a00000          MOV      r0,#0                 ;595
0006a0  e5840004          STR      r0,[r4,#4]            ;595
0006a4  e1a00006          MOV      r0,r6                 ;596
0006a8  ebfffffe          BL       OS_CPU_SR_Restore
0006ac  eafffff5          B        |L1.1672|
;;;599    /*$PAGE*/
                          ENDP

                  OSMutexQuery PROC
;;;619    INT8U  OSMutexQuery (OS_EVENT *pevent, OS_MUTEX_DATA *p_mutex_data)
;;;620    {
0006b0  e92d4070          PUSH     {r4-r6,lr}
0006b4  e1a05000          MOV      r5,r0
;;;621        INT8U      i;
;;;622    #if OS_LOWEST_PRIO <= 63
;;;623        INT8U     *psrc;
;;;624        INT8U     *pdest;
;;;625    #else
;;;626        INT16U    *psrc;
;;;627        INT16U    *pdest;
;;;628    #endif
;;;629    #if OS_CRITICAL_METHOD == 3                      /* Allocate storage for CPU status register           */
;;;630        OS_CPU_SR  cpu_sr = 0;
;;;631    #endif
;;;632    
;;;633    
;;;634    
;;;635        if (OSIntNesting > 0) {                                /* See if called from ISR ...               */
0006b8  e59f0084          LDR      r0,|L1.1860|
0006bc  e1a04001          MOV      r4,r1                 ;620
0006c0  e5d00000          LDRB     r0,[r0,#0]  ; OSIntNesting
0006c4  e3500000          CMP      r0,#0
;;;636            return (OS_ERR_QUERY_ISR);                         /* ... can't QUERY mutex from an ISR        */
0006c8  13a00006          MOVNE    r0,#6
0006cc  1a00001a          BNE      |L1.1852|
;;;637        }
;;;638    #if OS_ARG_CHK_EN > 0
;;;639        if (pevent == (OS_EVENT *)0) {                         /* Validate 'pevent'                        */
;;;640            return (OS_ERR_PEVENT_NULL);
;;;641        }
;;;642        if (p_mutex_data == (OS_MUTEX_DATA *)0) {              /* Validate 'p_mutex_data'                  */
;;;643            return (OS_ERR_PDATA_NULL);
;;;644        }
;;;645    #endif
;;;646        if (pevent->OSEventType != OS_EVENT_TYPE_MUTEX) {      /* Validate event block type                */
0006d0  e5d50000          LDRB     r0,[r5,#0]
0006d4  e3500004          CMP      r0,#4
;;;647            return (OS_ERR_EVENT_TYPE);
0006d8  13a00001          MOVNE    r0,#1
0006dc  1a000016          BNE      |L1.1852|
;;;648        }
;;;649        OS_ENTER_CRITICAL();
0006e0  ebfffffe          BL       OS_CPU_SR_Save
;;;650        p_mutex_data->OSMutexPIP  = (INT8U)(pevent->OSEventCnt >> 8);
0006e4  e1d510b8          LDRH     r1,[r5,#8]
;;;651        p_mutex_data->OSOwnerPrio = (INT8U)(pevent->OSEventCnt & OS_MUTEX_KEEP_LOWER_8);
;;;652        if (p_mutex_data->OSOwnerPrio == 0xFF) {
;;;653            p_mutex_data->OSValue = OS_TRUE;
;;;654        } else {
;;;655            p_mutex_data->OSValue = OS_FALSE;
;;;656        }
;;;657        p_mutex_data->OSEventGrp  = pevent->OSEventGrp;        /* Copy wait list                           */
;;;658        psrc                      = &pevent->OSEventTbl[0];
;;;659        pdest                     = &p_mutex_data->OSEventTbl[0];
;;;660        for (i = 0; i < OS_EVENT_TBL_SIZE; i++) {
0006e8  e3a02000          MOV      r2,#0
0006ec  e1a01421          LSR      r1,r1,#8              ;650
0006f0  e5c41007          STRB     r1,[r4,#7]            ;650
0006f4  e1d510b8          LDRH     r1,[r5,#8]            ;651
0006f8  e20110ff          AND      r1,r1,#0xff           ;651
0006fc  e35100ff          CMP      r1,#0xff              ;652
000700  e5c41006          STRB     r1,[r4,#6]            ;651
000704  13a01000          MOVNE    r1,#0                 ;655
000708  03a01001          MOVEQ    r1,#1                 ;653
00070c  e5c41005          STRB     r1,[r4,#5]            ;655
000710  e5d5100a          LDRB     r1,[r5,#0xa]          ;657
000714  e5c41004          STRB     r1,[r4,#4]            ;657
000718  e285100b          ADD      r1,r5,#0xb            ;658
                  |L1.1820|
;;;661            *pdest++ = *psrc++;
00071c  e4d13001          LDRB     r3,[r1],#1
000720  e2822001          ADD      r2,r2,#1              ;660
000724  e20220ff          AND      r2,r2,#0xff           ;660
000728  e3520004          CMP      r2,#4                 ;660
00072c  e4c43001          STRB     r3,[r4],#1
000730  3afffff9          BCC      |L1.1820|
;;;662        }
;;;663        OS_EXIT_CRITICAL();
000734  ebfffffe          BL       OS_CPU_SR_Restore
;;;664        return (OS_ERR_NONE);
000738  e3a00000          MOV      r0,#0
                  |L1.1852|
00073c  e8bd4070          POP      {r4-r6,lr}
;;;665    }
000740  e12fff1e          BX       lr
;;;666    #endif                                                     /* OS_MUTEX_QUERY_EN                        */
                          ENDP

                  |L1.1860|
000744  00000000          DCD      OSIntNesting
                  |L1.1864|
000748  00000000          DCD      OSTCBCur
                  |L1.1868|
00074c  00000000          DCD      OSTCBPrioTbl
                  |L1.1872|
000750  00000000          DCD      OSEventFreeList
                  |L1.1876|
000754  00000000          DCD      OSRdyTbl
                  |L1.1880|
000758  00000000          DCD      OSRdyGrp
                  |L1.1884|
00075c  00000000          DCD      OSLockNesting

⌨️ 快捷键说明

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