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

📄 os_mutex.txt

📁 IARSOURCECODE是基于LPC2478嵌入式软件IAR EWARM V4.42的应用实例代码
💻 TXT
📖 第 1 页 / 共 5 页
字号:
000410  e59d0000          LDR      r0,[sp,#0]
000414  ebfffffe          BL       OS_CPU_SR_Restore
000418  e3a00000          MOV      r0,#0
00041c  e5c60000          STRB     r0,[r6,#0]
000420  e3a08000          MOV      r8,#0
000424  ea000004          B        |L1.1084|
                  |L1.1064|
000428  e59d0000          LDR      r0,[sp,#0]
00042c  ebfffffe          BL       OS_CPU_SR_Restore
000430  e3a00049          MOV      r0,#0x49
000434  e5c60000          STRB     r0,[r6,#0]
000438  e1a08004          MOV      r8,r4
                  |L1.1084|
00043c  ea000037          B        |L1.1312|
                  |L1.1088|
000440  e1a00000          MOV      r0,r0
000444  e1d400b8          LDRH     r0,[r4,#8]
000448  e1a09440          ASR      r9,r0,#8
00044c  e1d400b8          LDRH     r0,[r4,#8]
000450  e200a0ff          AND      r10,r0,#0xff
000454  e594b004          LDR      r11,[r4,#4]
000458  e35b0000          CMP      r11,#0
00045c  0a000005          BEQ      |L1.1144|
000460  e5db002e          LDRB     r0,[r11,#0x2e]
000464  e1500009          CMP      r0,r9
000468  1a000002          BNE      |L1.1144|
00046c  e1a0100a          MOV      r1,r10
000470  e1a0000b          MOV      r0,r11
000474  ebfffffe          BL       OSMutex_RdyAtPrio
                  |L1.1144|
000478  ea000004          B        |L1.1168|
                  |L1.1148|
00047c  e3a03000          MOV      r3,#0
000480  e3a02010          MOV      r2,#0x10
000484  e1a01003          MOV      r1,r3
000488  e1a00004          MOV      r0,r4
00048c  ebfffffe          BL       OS_EventTaskRdy
                  |L1.1168|
000490  e5d4000a          LDRB     r0,[r4,#0xa]
000494  e3500000          CMP      r0,#0
000498  1afffff7          BNE      |L1.1148|
00049c  e3a0003f          MOV      r0,#0x3f
0004a0  e5c4000f          STRB     r0,[r4,#0xf]
0004a4  e3a00000          MOV      r0,#0
0004a8  e5c40010          STRB     r0,[r4,#0x10]
0004ac  e1d400b8          LDRH     r0,[r4,#8]
0004b0  e1a09440          ASR      r9,r0,#8
0004b4  e3a00000          MOV      r0,#0
0004b8  e59f16c0          LDR      r1,|L1.2944|
0004bc  e7810109          STR      r0,[r1,r9,LSL #2]
0004c0  e5c40000          STRB     r0,[r4,#0]
0004c4  e59f06b8          LDR      r0,|L1.2948|
0004c8  e5900000          LDR      r0,[r0,#0]  ; OSEventFreeList
0004cc  e5840004          STR      r0,[r4,#4]
0004d0  e3a00000          MOV      r0,#0
0004d4  e1c400b8          STRH     r0,[r4,#8]
0004d8  e59f06a4          LDR      r0,|L1.2948|
0004dc  e5804000          STR      r4,[r0,#0]  ; OSEventFreeList
0004e0  e59d0000          LDR      r0,[sp,#0]
0004e4  ebfffffe          BL       OS_CPU_SR_Restore
0004e8  e3570001          CMP      r7,#1
0004ec  1a000000          BNE      |L1.1268|
0004f0  ebfffffe          BL       OS_Sched
                  |L1.1268|
0004f4  e3a00000          MOV      r0,#0
0004f8  e5c60000          STRB     r0,[r6,#0]
0004fc  e3a08000          MOV      r8,#0
000500  ea000006          B        |L1.1312|
                  |L1.1284|
000504  e1a00000          MOV      r0,r0
000508  e59d0000          LDR      r0,[sp,#0]
00050c  ebfffffe          BL       OS_CPU_SR_Restore
000510  e3a00007          MOV      r0,#7
000514  e5c60000          STRB     r0,[r6,#0]
000518  e1a08004          MOV      r8,r4
00051c  e1a00000          MOV      r0,r0
                  |L1.1312|
000520  e1a00000          MOV      r0,r0
000524  e1a00008          MOV      r0,r8
000528  eaffff80          B        |L1.816|
                          ENDP

                  OSMutexPend PROC
;;;397    void  OSMutexPend (OS_EVENT *pevent, INT16U timeout, INT8U *err)
;;;398    {
00052c  e92d4ffe          PUSH     {r1-r11,lr}
000530  e1a04000          MOV      r4,r0
000534  e1a05001          MOV      r5,r1
000538  e1a06002          MOV      r6,r2
;;;399        INT8U      pip;                                        /* Priority Inheritance Priority (PIP)      */
;;;400        INT8U      mprio;                                      /* Mutex owner priority                     */
;;;401        BOOLEAN    rdy;                                        /* Flag indicating task was ready           */
;;;402        OS_TCB    *ptcb;
;;;403        OS_EVENT  *pevent2;
;;;404        INT8U      y;
;;;405        INT8U      pend_stat;
;;;406    #if OS_CRITICAL_METHOD == 3                                /* Allocate storage for CPU status register */
;;;407        OS_CPU_SR  cpu_sr = 0;
00053c  e3a00000          MOV      r0,#0
000540  e58d0000          STR      r0,[sp,#0]
;;;408    #endif
;;;409    
;;;410    
;;;411    
;;;412    #if OS_ARG_CHK_EN > 0
;;;413        if (err == (INT8U *)0) {                               /* Validate 'err'                           */
000544  e3560000          CMP      r6,#0
000548  1a000001          BNE      |L1.1364|
                  |L1.1356|
;;;414            return;
;;;415        }
;;;416        if (pevent == (OS_EVENT *)0) {                         /* Validate 'pevent'                        */
;;;417            *err = OS_ERR_PEVENT_NULL;
;;;418            return;
;;;419        }
;;;420    #endif
;;;421        if (pevent->OSEventType != OS_EVENT_TYPE_MUTEX) {      /* Validate event block type                */
;;;422            *err = OS_ERR_EVENT_TYPE;
;;;423            return;
;;;424        }
;;;425        if (OSIntNesting > 0) {                                /* See if called from ISR ...               */
;;;426            *err = OS_ERR_PEND_ISR;                            /* ... can't PEND from an ISR               */
;;;427            return;
;;;428        }
;;;429        if (OSLockNesting > 0) {                               /* See if called with scheduler locked ...  */
;;;430            *err = OS_ERR_PEND_LOCKED;                         /* ... can't PEND when locked               */
;;;431            return;
;;;432        }
;;;433        OS_ENTER_CRITICAL();                                
;;;434        pip = (INT8U)(pevent->OSEventCnt >> 8);                /* Get PIP from mutex                       */
;;;435                                                               /* Is Mutex available?                      */
;;;436        if ((INT8U)(pevent->OSEventCnt & OS_MUTEX_KEEP_LOWER_8) == OS_MUTEX_AVAILABLE) {
;;;437            pevent->OSEventCnt &= OS_MUTEX_KEEP_UPPER_8;       /* Yes, Acquire the resource                */
;;;438            pevent->OSEventCnt |= OSTCBCur->OSTCBPrio;         /*      Save priority of owning task        */
;;;439            pevent->OSEventPtr  = (void *)OSTCBCur;            /*      Point to owning task's OS_TCB       */
;;;440            if (OSTCBCur->OSTCBPrio <= pip) {                  /*      PIP 'must' have a SMALLER prio ...  */
;;;441                OS_EXIT_CRITICAL();                            /*      ... than current task!              */
;;;442                *err  = OS_ERR_PIP_LOWER;
;;;443            } else {
;;;444                OS_EXIT_CRITICAL();
;;;445                *err  = OS_ERR_NONE;
;;;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   */
;;;451        if (ptcb->OSTCBPrio > pip) {                                  /*     Need to promote prio of owner?*/
;;;452            if (mprio > OSTCBCur->OSTCBPrio) {
;;;453                y = ptcb->OSTCBY;
;;;454                if ((OSRdyTbl[y] & ptcb->OSTCBBitX) != 0) {           /*     See if mutex owner is ready   */
;;;455                    OSRdyTbl[y] &= ~ptcb->OSTCBBitX;                  /*     Yes, Remove owner from Rdy ...*/
;;;456                    if (OSRdyTbl[y] == 0) {                           /*          ... list at current prio */
;;;457                        OSRdyGrp &= ~ptcb->OSTCBBitY;
;;;458                    }
;;;459                    rdy = OS_TRUE;
;;;460                } else {
;;;461                    pevent2 = ptcb->OSTCBEventPtr;
;;;462                    if (pevent2 != (OS_EVENT *)0) {                   /* Remove from event wait list       */
;;;463                        if ((pevent2->OSEventTbl[ptcb->OSTCBY] &= ~ptcb->OSTCBBitX) == 0) {
;;;464                            pevent2->OSEventGrp &= ~ptcb->OSTCBBitY;
;;;465                        }
;;;466                    }
;;;467                    rdy = OS_FALSE;                            /* No                                       */
;;;468                }
;;;469                ptcb->OSTCBPrio = pip;                         /* Change owner task prio to PIP            */
;;;470    #if OS_LOWEST_PRIO <= 63
;;;471                ptcb->OSTCBY    = (INT8U)( ptcb->OSTCBPrio >> 3);
;;;472                ptcb->OSTCBX    = (INT8U)( ptcb->OSTCBPrio & 0x07);
;;;473                ptcb->OSTCBBitY = (INT8U)(1 << ptcb->OSTCBY);
;;;474                ptcb->OSTCBBitX = (INT8U)(1 << ptcb->OSTCBX);
;;;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 ...*/
;;;482                    OSRdyGrp               |= ptcb->OSTCBBitY; /* ... make it ready at new priority.       */
;;;483                    OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
;;;484                } else {
;;;485                    pevent2 = ptcb->OSTCBEventPtr;
;;;486                    if (pevent2 != (OS_EVENT *)0) {            /* Add to event wait list                   */
;;;487                        pevent2->OSEventGrp               |= ptcb->OSTCBBitY;
;;;488                        pevent2->OSEventTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
;;;489                    }
;;;490                }
;;;491                OSTCBPrioTbl[pip] = ptcb;
;;;492            }
;;;493        }
;;;494        OSTCBCur->OSTCBStat     |= OS_STAT_MUTEX;         /* Mutex not available, pend current task        */
;;;495        OSTCBCur->OSTCBStatPend  = OS_STAT_PEND_OK;
;;;496        OSTCBCur->OSTCBDly       = timeout;               /* Store timeout in current task's TCB           */
;;;497        OS_EventTaskWait(pevent);                         /* Suspend task until event or timeout occurs    */
;;;498        OS_EXIT_CRITICAL();
;;;499        OS_Sched();                                       /* Find next highest priority task ready         */
;;;500        OS_ENTER_CRITICAL();
;;;501        if (OSTCBCur->OSTCBStatPend != OS_STAT_PEND_OK) { /* See if we timed out during the pend           */
;;;502            pend_stat = OSTCBCur->OSTCBStatPend;
;;;503            OS_EventTOAbort(pevent);
;;;504            OS_EXIT_CRITICAL();
;;;505            switch (pend_stat) {
;;;506                case OS_STAT_PEND_TO:
;;;507                default:
;;;508                     *err = OS_ERR_TIMEOUT;               /* Indicate that we didn't get mutex within TO   */
;;;509                     break;
;;;510    
;;;511                case OS_STAT_PEND_ABORT:
;;;512                     *err = OS_ERR_PEND_ABORT;            /* Indicate that we aborted getting mutex        */
;;;513                     break;
;;;514            }
;;;515            return;
;;;516        }
;;;517        OSTCBCur->OSTCBEventPtr = (OS_EVENT *)0;
;;;518        OS_EXIT_CRITICAL();
;;;519        *err = OS_ERR_NONE;
;;;520    }
00054c  e8bd4ffe          POP      {r1-r11,lr}
000550  e12fff1e          BX       lr
                  |L1.1364|
000554  e3540000          CMP      r4,#0
000558  1a000002          BNE      |L1.1384|
00055c  e3a00004          MOV      r0,#4
000560  e5c60000          STRB     r0,[r6,#0]
000564  eafffff8          B        |L1.1356|
                  |L1.1384|
000568  e5d40000          LDRB     r0,[r4,#0]
00056c  e3500004          CMP      r0,#4
000570  0a000002          BEQ      |L1.1408|
000574  e3a00001          MOV      r0,#1
000578  e5c60000          STRB     r0,[r6,#0]
00057c  eafffff2          B        |L1.1356|
                  |L1.1408|
000580  e59f05f0          LDR      r0,|L1.2936|
000584  e5d00000          LDRB     r0,[r0,#0]  ; OSIntNesting
000588  e3500000          CMP      r0,#0
00058c  da000002          BLE      |L1.1436|
000590  e3a00002          MOV      r0,#2
000594  e5c60000          STRB     r0,[r6,#0]
000598  eaffffeb          B        |L1.1356|
                  |L1.1436|
00059c  e59f05ec          LDR      r0,|L1.2960|
0005a0  e5d00000          LDRB     r0,[r0,#0]  ; OSLockNesting
0005a4  e3500000          CMP      r0,#0
0005a8  da000002          BLE      |L1.1464|
0005ac  e3a0000d          MOV      r0,#0xd
0005b0  e5c60000          STRB     r0,[r6,#0]
0005b4  eaffffe4          B        |L1.1356|
                  |L1.1464|
0005b8  ebfffffe          BL       OS_CPU_SR_Save
0005bc  e58d0000          STR      r0,[sp,#0]
0005c0  e1d400b8          LDRH     r0,[r4,#8]
0005c4  e1a07440          ASR      r7,r0,#8
0005c8  e1d400b8          LDRH     r0,[r4,#8]
0005cc  e20000ff          AND      r0,r0,#0xff
0005d0  e35000ff          CMP      r0,#0xff
0005d4  1a00001a          BNE      |L1.1604|
0005d8  e1d400b8          LDRH     r0,[r4,#8]
0005dc  e2000cff          AND      r0,r0,#0xff00

⌨️ 快捷键说明

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