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

📄 os_mutex.txt

📁 IARSOURCECODE是基于LPC2478嵌入式软件IAR EWARM V4.42的应用实例代码
💻 TXT
📖 第 1 页 / 共 5 页
字号:
;;;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                     */
;;;565            return (OS_ERR_EVENT_TYPE);
;;;566        }
;;;567        OS_ENTER_CRITICAL();
;;;568        pip  = (INT8U)(pevent->OSEventCnt >> 8);          /* Get priority inheritance priority of mutex    */
;;;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            */
;;;571            OS_EXIT_CRITICAL();
;;;572            return (OS_ERR_NOT_MUTEX_OWNER);
;;;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 *)1;                  /* 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    }
00096c  e12fff1e          BX       lr
                  |L1.2416|
000970  e3540000          CMP      r4,#0
000974  1a000001          BNE      |L1.2432|
000978  e3a00004          MOV      r0,#4
00097c  eafffff9          B        |L1.2408|
                  |L1.2432|
000980  e5d40000          LDRB     r0,[r4,#0]
000984  e3500004          CMP      r0,#4
000988  0a000001          BEQ      |L1.2452|
00098c  e3a00001          MOV      r0,#1
000990  eafffff4          B        |L1.2408|
                  |L1.2452|
000994  ebfffffe          BL       OS_CPU_SR_Save
000998  e1a07000          MOV      r7,r0
00099c  e1d400b8          LDRH     r0,[r4,#8]
0009a0  e1a05440          ASR      r5,r0,#8
0009a4  e1d400b8          LDRH     r0,[r4,#8]
0009a8  e20060ff          AND      r6,r0,#0xff
0009ac  e59f11c8          LDR      r1,|L1.2940|
0009b0  e5940004          LDR      r0,[r4,#4]
0009b4  e5911000          LDR      r1,[r1,#0]  ; OSTCBCur
0009b8  e1500001          CMP      r0,r1
0009bc  0a000003          BEQ      |L1.2512|
0009c0  e1a00007          MOV      r0,r7
0009c4  ebfffffe          BL       OS_CPU_SR_Restore
0009c8  e3a00064          MOV      r0,#0x64
0009cc  eaffffe5          B        |L1.2408|
                  |L1.2512|
0009d0  e59f01a4          LDR      r0,|L1.2940|
0009d4  e5900000          LDR      r0,[r0,#0]  ; OSTCBCur
0009d8  e5d0002e          LDRB     r0,[r0,#0x2e]
0009dc  e1500005          CMP      r0,r5
0009e0  1a000003          BNE      |L1.2548|
0009e4  e1a01006          MOV      r1,r6
0009e8  e59f018c          LDR      r0,|L1.2940|
0009ec  e5900000          LDR      r0,[r0,#0]  ; OSTCBCur
0009f0  ebfffffe          BL       OSMutex_RdyAtPrio
                  |L1.2548|
0009f4  e3a00001          MOV      r0,#1
0009f8  e59f1180          LDR      r1,|L1.2944|
0009fc  e7810105          STR      r0,[r1,r5,LSL #2]
000a00  e5d4000a          LDRB     r0,[r4,#0xa]
000a04  e3500000          CMP      r0,#0
000a08  0a00001a          BEQ      |L1.2680|
000a0c  e3a03000          MOV      r3,#0
000a10  e3a02010          MOV      r2,#0x10
000a14  e1a01003          MOV      r1,r3
000a18  e1a00004          MOV      r0,r4
000a1c  ebfffffe          BL       OS_EventTaskRdy
000a20  e1a06000          MOV      r6,r0
000a24  e1d400b8          LDRH     r0,[r4,#8]
000a28  e2000cff          AND      r0,r0,#0xff00
000a2c  e1c400b8          STRH     r0,[r4,#8]
000a30  e1d400b8          LDRH     r0,[r4,#8]
000a34  e1800006          ORR      r0,r0,r6
000a38  e1c400b8          STRH     r0,[r4,#8]
000a3c  e59f013c          LDR      r0,|L1.2944|
000a40  e7900106          LDR      r0,[r0,r6,LSL #2]
000a44  e5840004          STR      r0,[r4,#4]
000a48  e1560005          CMP      r6,r5
000a4c  ca000004          BGT      |L1.2660|
000a50  e1a00007          MOV      r0,r7
000a54  ebfffffe          BL       OS_CPU_SR_Restore
000a58  ebfffffe          BL       OS_Sched
000a5c  e3a00078          MOV      r0,#0x78
000a60  eaffffc0          B        |L1.2408|
                  |L1.2660|
000a64  e1a00007          MOV      r0,r7
000a68  ebfffffe          BL       OS_CPU_SR_Restore
000a6c  ebfffffe          BL       OS_Sched
000a70  e3a00000          MOV      r0,#0
000a74  eaffffbb          B        |L1.2408|
                  |L1.2680|
000a78  e1d400b8          LDRH     r0,[r4,#8]
000a7c  e38000ff          ORR      r0,r0,#0xff
000a80  e1c400b8          STRH     r0,[r4,#8]
000a84  e3a00000          MOV      r0,#0
000a88  e5840004          STR      r0,[r4,#4]
000a8c  e1a00007          MOV      r0,r7
000a90  ebfffffe          BL       OS_CPU_SR_Restore
000a94  e3a00000          MOV      r0,#0
000a98  eaffffb2          B        |L1.2408|
                          ENDP

                  OSMutexQuery PROC
;;;619    INT8U  OSMutexQuery (OS_EVENT *pevent, OS_MUTEX_DATA *p_mutex_data)
;;;620    {
000a9c  e92d47f0          PUSH     {r4-r10,lr}
000aa0  e1a04000          MOV      r4,r0
000aa4  e1a05001          MOV      r5,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;
000aa8  e3a09000          MOV      r9,#0
;;;631    #endif
;;;632    
;;;633    
;;;634    
;;;635        if (OSIntNesting > 0) {                                /* See if called from ISR ...               */
000aac  e59f00c4          LDR      r0,|L1.2936|
000ab0  e5d00000          LDRB     r0,[r0,#0]  ; OSIntNesting
000ab4  e3500000          CMP      r0,#0
000ab8  da000002          BLE      |L1.2760|
;;;636            return (OS_ERR_QUERY_ISR);                         /* ... can't QUERY mutex from an ISR        */
000abc  e3a00006          MOV      r0,#6
                  |L1.2752|
000ac0  e8bd47f0          POP      {r4-r10,lr}
;;;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 = 1;
;;;654        } else {
;;;655            p_mutex_data->OSValue = 0;
;;;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    }
000ac4  e12fff1e          BX       lr
                  |L1.2760|
000ac8  e3540000          CMP      r4,#0
000acc  1a000001          BNE      |L1.2776|
000ad0  e3a00004          MOV      r0,#4
000ad4  eafffff9          B        |L1.2752|
                  |L1.2776|
000ad8  e3550000          CMP      r5,#0
000adc  1a000001          BNE      |L1.2792|
000ae0  e3a00009          MOV      r0,#9
000ae4  eafffff5          B        |L1.2752|
                  |L1.2792|
000ae8  e5d40000          LDRB     r0,[r4,#0]
000aec  e3500004          CMP      r0,#4
000af0  0a000001          BEQ      |L1.2812|
000af4  e3a00001          MOV      r0,#1
000af8  eafffff0          B        |L1.2752|
                  |L1.2812|
000afc  ebfffffe          BL       OS_CPU_SR_Save
000b00  e1a09000          MOV      r9,r0
000b04  e1d400b8          LDRH     r0,[r4,#8]
000b08  e1a00440          ASR      r0,r0,#8
000b0c  e5c50007          STRB     r0,[r5,#7]
000b10  e1d400b8          LDRH     r0,[r4,#8]
000b14  e5c50006          STRB     r0,[r5,#6]
000b18  e5d50006          LDRB     r0,[r5,#6]
000b1c  e35000ff          CMP      r0,#0xff
000b20  1a000002          BNE      |L1.2864|
000b24  e3a00001          MOV      r0,#1
000b28  e5c50005          STRB     r0,[r5,#5]
000b2c  ea000001          B        |L1.2872|
                  |L1.2864|
000b30  e3a00000          MOV      r0,#0
000b34  e5c50005          STRB     r0,[r5,#5]
                  |L1.2872|
000b38  e5d4000a          LDRB     r0,[r4,#0xa]
000b3c  e5c50004          STRB     r0,[r5,#4]
000b40  e284800b          ADD      r8,r4,#0xb
000b44  e1a07005          MOV      r7,r5
000b48  e3a06000          MOV      r6,#0
000b4c  ea000003          B        |L1.2912|
                  |L1.2896|
000b50  e4d80001          LDRB     r0,[r8],#1
000b54  e4c70001          STRB     r0,[r7],#1
000b58  e2860001          ADD      r0,r6,#1
000b5c  e20060ff          AND      r6,r0,#0xff
                  |L1.2912|
000b60  e3560004          CMP      r6,#4
000b64  bafffff9          BLT      |L1.2896|
000b68  e1a00009          MOV      r0,r9
000b6c  ebfffffe          BL       OS_CPU_SR_Restore
000b70  e3a00000          MOV      r0,#0
000b74  eaffffd1          B        |L1.2752|
                          ENDP

                  |L1.2936|
000b78  00000000          DCD      OSIntNesting
                  |L1.2940|
000b7c  00000000          DCD      OSTCBCur
                  |L1.2944|
000b80  00000000          DCD      OSTCBPrioTbl
                  |L1.2948|
000b84  00000000          DCD      OSEventFreeList
                  |L1.2952|
000b88  00000000          DCD      OSRdyTbl
                  |L1.2956|
000b8c  00000000          DCD      OSRdyGrp
                  |L1.2960|
000b90  00000000          DCD      OSLockNesting

⌨️ 快捷键说明

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