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

📄 os_mutex.txt

📁 ucos2.86版本结合STM板极支持包
💻 TXT
📖 第 1 页 / 共 4 页
字号:
00049a  e8bde8bd          POP      {r4-r11,pc}
                  |L1.1182|
;;;509                     break;
;;;510    
;;;511                case OS_STAT_PEND_ABORT:
;;;512                     *perr = OS_ERR_PEND_ABORT;           /* Indicate that we aborted getting mutex        */
00049e  200e              MOVS     r0,#0xe
0004a0  7020              STRB     r0,[r4,#0]
0004a2  b005              ADD      sp,sp,#0x14
0004a4  e8bde8bd          POP      {r4-r11,pc}
                  |L1.1192|
;;;513                     break;
;;;514            }
;;;515            return;
;;;516        }
;;;517        OSTCBCur->OSTCBEventPtr = (OS_EVENT *)0;
0004a8  61cf              STR      r7,[r1,#0x1c]
;;;518        OS_EXIT_CRITICAL();
0004aa  4640              MOV      r0,r8
0004ac  f7fff7ff          BL       OS_CPU_SR_Restore
;;;519        *perr = OS_ERR_NONE;
0004b0  7027              STRB     r7,[r4,#0]
;;;520    }
0004b2  b005              ADD      sp,sp,#0x14
0004b4  e8bde8bd          POP      {r4-r11,pc}
;;;521    /*$PAGE*/
                          ENDP

                  OSMutexPost PROC
;;;546    INT8U  OSMutexPost (OS_EVENT *pevent)
;;;547    {
0004b8  e92de92d          PUSH     {r4-r8,lr}
0004bc  4604              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 ...                    */
0004be  4847              LDR      r0,|L1.1500|
0004c0  7800              LDRB     r0,[r0,#0]  ; OSIntNesting
0004c2  b110              CBZ      r0,|L1.1226|
;;;557            return (OS_ERR_POST_ISR);                     /* ... can't POST mutex from an ISR              */
0004c4  2005              MOVS     r0,#5
0004c6  e8bde8bd          POP      {r4-r8,pc}
                  |L1.1226|
;;;558        }
;;;559    #if OS_ARG_CHK_EN > 0
;;;560        if (pevent == (OS_EVENT *)0) {                    /* Validate 'pevent'                             */
0004ca  b914              CBNZ     r4,|L1.1234|
;;;561            return (OS_ERR_PEVENT_NULL);
0004cc  2004              MOVS     r0,#4
0004ce  e8bde8bd          POP      {r4-r8,pc}
                  |L1.1234|
;;;562        }
;;;563    #endif
;;;564        if (pevent->OSEventType != OS_EVENT_TYPE_MUTEX) { /* Validate event block type                     */
0004d2  7820              LDRB     r0,[r4,#0]
0004d4  2804              CMP      r0,#4
0004d6  d002              BEQ      |L1.1246|
;;;565            return (OS_ERR_EVENT_TYPE);
0004d8  2001              MOVS     r0,#1
0004da  e8bde8bd          POP      {r4-r8,pc}
                  |L1.1246|
;;;566        }
;;;567        OS_ENTER_CRITICAL();
0004de  f7fff7ff          BL       OS_CPU_SR_Save
0004e2  4606              MOV      r6,r0
;;;568        pip  = (INT8U)(pevent->OSEventCnt >> 8);          /* Get priority inheritance priority of mutex    */
0004e4  8920              LDRH     r0,[r4,#8]
0004e6  0a05              LSRS     r5,r0,#8
;;;569        prio = (INT8U)(pevent->OSEventCnt & OS_MUTEX_KEEP_LOWER_8);  /* Get owner's original priority      */
0004e8  b2c1              UXTB     r1,r0
;;;570        if (OSTCBCur != (OS_TCB *)pevent->OSEventPtr) {   /* See if posting task owns the MUTEX            */
0004ea  483d              LDR      r0,|L1.1504|
0004ec  6862              LDR      r2,[r4,#4]
0004ee  6800              LDR      r0,[r0,#0]  ; OSTCBCur
0004f0  4282              CMP      r2,r0
0004f2  d005              BEQ      |L1.1280|
;;;571            OS_EXIT_CRITICAL();
0004f4  4630              MOV      r0,r6
0004f6  f7fff7ff          BL       OS_CPU_SR_Restore
;;;572            return (OS_ERR_NOT_MUTEX_OWNER);
0004fa  2064              MOVS     r0,#0x64
0004fc  e8bde8bd          POP      {r4-r8,pc}
                  |L1.1280|
;;;573        }
;;;574        if (OSTCBCur->OSTCBPrio == pip) {                 /* Did we have to raise current task's priority? */
000500  f890f890          LDRB     r2,[r0,#0x2e]
000504  42aa              CMP      r2,r5
000506  d101              BNE      |L1.1292|
;;;575            OSMutex_RdyAtPrio(OSTCBCur, prio);            /* Restore the task's original priority          */
000508  f7fff7ff          BL       OSMutex_RdyAtPrio
                  |L1.1292|
;;;576        }
;;;577        OSTCBPrioTbl[pip] = OS_TCB_RESERVED;              /* Reserve table entry                           */
00050c  4f32              LDR      r7,|L1.1496|
00050e  2001              MOVS     r0,#1
000510  f847f847          STR      r0,[r7,r5,LSL #2]
;;;578        if (pevent->OSEventGrp != 0) {                    /* Any task waiting for the mutex?               */
000514  7aa0              LDRB     r0,[r4,#0xa]
000516  b1f8              CBZ      r0,|L1.1368|
;;;579                                                          /* Yes, Make HPT waiting for mutex ready         */
;;;580            prio                = OS_EventTaskRdy(pevent, (void *)0, OS_STAT_MUTEX, OS_STAT_PEND_OK);
000518  2300              MOVS     r3,#0
00051a  2210              MOVS     r2,#0x10
00051c  4619              MOV      r1,r3
00051e  4620              MOV      r0,r4
000520  f7fff7ff          BL       OS_EventTaskRdy
;;;581            pevent->OSEventCnt &= OS_MUTEX_KEEP_UPPER_8;  /*      Save priority of mutex's new owner       */
000524  8921              LDRH     r1,[r4,#8]
000526  f401f401          AND      r1,r1,#0xff00
;;;582            pevent->OSEventCnt |= prio;
00052a  4301              ORRS     r1,r1,r0
00052c  8121              STRH     r1,[r4,#8]
;;;583            pevent->OSEventPtr  = OSTCBPrioTbl[prio];     /*      Link to new mutex owner's OS_TCB         */
00052e  f857f857          LDR      r1,[r7,r0,LSL #2]
000532  6061              STR      r1,[r4,#4]
;;;584            if (prio <= pip) {                            /*      PIP 'must' have a SMALLER prio ...       */
000534  42a8              CMP      r0,r5
000536  d807              BHI      |L1.1352|
;;;585                OS_EXIT_CRITICAL();                       /*      ... than current task!                   */
000538  4630              MOV      r0,r6
00053a  f7fff7ff          BL       OS_CPU_SR_Restore
;;;586                OS_Sched();                               /*      Find highest priority task ready to run  */
00053e  f7fff7ff          BL       OS_Sched
;;;587                return (OS_ERR_PIP_LOWER);
000542  2078              MOVS     r0,#0x78
000544  e8bde8bd          POP      {r4-r8,pc}
                  |L1.1352|
;;;588            } else {
;;;589                OS_EXIT_CRITICAL();
000548  4630              MOV      r0,r6
00054a  f7fff7ff          BL       OS_CPU_SR_Restore
;;;590                OS_Sched();                               /*      Find highest priority task ready to run  */
00054e  f7fff7ff          BL       OS_Sched
;;;591                return (OS_ERR_NONE);
000552  2000              MOVS     r0,#0
000554  e8bde8bd          POP      {r4-r8,pc}
                  |L1.1368|
;;;592            }
;;;593        }
;;;594        pevent->OSEventCnt |= OS_MUTEX_AVAILABLE;         /* No,  Mutex is now available                   */
000558  8920              LDRH     r0,[r4,#8]
00055a  f040f040          ORR      r0,r0,#0xff
00055e  8120              STRH     r0,[r4,#8]
;;;595        pevent->OSEventPtr  = (void *)0;
000560  2000              MOVS     r0,#0
000562  6060              STR      r0,[r4,#4]
;;;596        OS_EXIT_CRITICAL();
000564  4630              MOV      r0,r6
000566  f7fff7ff          BL       OS_CPU_SR_Restore
;;;597        return (OS_ERR_NONE);
00056a  2000              MOVS     r0,#0
;;;598    }
00056c  e8bde8bd          POP      {r4-r8,pc}
;;;599    /*$PAGE*/
                          ENDP

                  OSMutexQuery PROC
;;;619    INT8U  OSMutexQuery (OS_EVENT *pevent, OS_MUTEX_DATA *p_mutex_data)
;;;620    {
000570  b570              PUSH     {r4-r6,lr}
000572  4605              MOV      r5,r0
000574  460c              MOV      r4,r1
;;;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 ...               */
000576  4819              LDR      r0,|L1.1500|
000578  7800              LDRB     r0,[r0,#0]  ; OSIntNesting
00057a  b108              CBZ      r0,|L1.1408|
;;;636            return (OS_ERR_QUERY_ISR);                         /* ... can't QUERY mutex from an ISR        */
00057c  2006              MOVS     r0,#6
;;;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                */
;;;647            return (OS_ERR_EVENT_TYPE);
;;;648        }
;;;649        OS_ENTER_CRITICAL();
;;;650        p_mutex_data->OSMutexPIP  = (INT8U)(pevent->OSEventCnt >> 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++) {
;;;661            *pdest++ = *psrc++;
;;;662        }
;;;663        OS_EXIT_CRITICAL();
;;;664        return (OS_ERR_NONE);
;;;665    }
00057e  bd70              POP      {r4-r6,pc}
                  |L1.1408|
000580  b90d              CBNZ     r5,|L1.1414|
000582  2004              MOVS     r0,#4
000584  bd70              POP      {r4-r6,pc}
                  |L1.1414|
000586  b90c              CBNZ     r4,|L1.1420|
000588  2009              MOVS     r0,#9
00058a  bd70              POP      {r4-r6,pc}
                  |L1.1420|
00058c  7828              LDRB     r0,[r5,#0]
00058e  2804              CMP      r0,#4
000590  d001              BEQ      |L1.1430|
000592  2001              MOVS     r0,#1
000594  bd70              POP      {r4-r6,pc}
                  |L1.1430|
000596  f7fff7ff          BL       OS_CPU_SR_Save
00059a  8929              LDRH     r1,[r5,#8]
00059c  0a09              LSRS     r1,r1,#8
00059e  71e1              STRB     r1,[r4,#7]
0005a0  8929              LDRH     r1,[r5,#8]
0005a2  b2c9              UXTB     r1,r1
0005a4  71a1              STRB     r1,[r4,#6]
0005a6  29ff              CMP      r1,#0xff
0005a8  d102              BNE      |L1.1456|
0005aa  2101              MOVS     r1,#1
0005ac  7161              STRB     r1,[r4,#5]
0005ae  e001              B        |L1.1460|
                  |L1.1456|
0005b0  2100              MOVS     r1,#0
0005b2  7161              STRB     r1,[r4,#5]
                  |L1.1460|
0005b4  7aa9              LDRB     r1,[r5,#0xa]
0005b6  7121              STRB     r1,[r4,#4]
0005b8  f105f105          ADD      r1,r5,#0xb
0005bc  2200              MOVS     r2,#0
                  |L1.1470|
0005be  f811f811          LDRB     r3,[r1],#1
0005c2  f804f804          STRB     r3,[r4],#1
0005c6  1c52              ADDS     r2,r2,#1
0005c8  b2d2              UXTB     r2,r2
0005ca  2a04              CMP      r2,#4
0005cc  d3f7              BCC      |L1.1470|
0005ce  f7fff7ff          BL       OS_CPU_SR_Restore
0005d2  2000              MOVS     r0,#0
0005d4  bd70              POP      {r4-r6,pc}
;;;666    #endif                                                     /* OS_MUTEX_QUERY_EN                        */
                          ENDP

0005d6  0000              DCW      0x0000
                  |L1.1496|
0005d8  00000000          DCD      OSTCBPrioTbl
                  |L1.1500|
0005dc  00000000          DCD      OSIntNesting
                  |L1.1504|
0005e0  00000000          DCD      OSTCBCur

⌨️ 快捷键说明

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