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

📄 os_mutex.txt

📁 IARSOURCECODE是基于LPC2478嵌入式软件IAR EWARM V4.42的应用实例代码
💻 TXT
📖 第 1 页 / 共 5 页
字号:
; generated by ARM/Thumb C/C++ Compiler with , RVCT3.1 [Build 903] for uVision
; commandline ArmCC [--debug -c --asm --interleave -oos_mutex.o --depend=os_mutex.d --device=DARMP --apcs=interwork -I. -I..\BSP -I..\..\..\..\..\uCOS-II\Ports\ARM\Generic\RVMDK -I..\..\..\..\..\uCOS-II\Source -I..\..\..\..\..\uC-CPU -I..\..\..\..\..\uC-CPU\ARM\RVMDK -I..\..\..\..\..\uC-LIB -I..\..\..\..\..\uCOSView\Source -I..\..\..\..\..\uCOSView\Ports\ARM7\LPC2468\IAR -Id:\Keil\ARM\INC\Philips ..\..\..\..\..\uCOS-II\Source\os_mutex.c]
                          ARM

                          AREA ||.text||, CODE, READONLY, ALIGN=2

                  OSMutexAccept PROC
;;;84     INT8U  OSMutexAccept (OS_EVENT *pevent, INT8U *err)
;;;85     {
000000  e92d41f0          PUSH     {r4-r8,lr}
000004  e1a04000          MOV      r4,r0
000008  e1a05001          MOV      r5,r1
;;;86         INT8U      pip;                                    /* Priority Inheritance Priority (PIP)          */
;;;87     #if OS_CRITICAL_METHOD == 3                            /* Allocate storage for CPU status register     */
;;;88         OS_CPU_SR  cpu_sr = 0;
00000c  e3a07000          MOV      r7,#0
;;;89     #endif
;;;90     
;;;91     
;;;92     
;;;93     #if OS_ARG_CHK_EN > 0
;;;94         if (err == (INT8U *)0) {                           /* Validate 'err'                               */
000010  e3550000          CMP      r5,#0
000014  1a000002          BNE      |L1.36|
;;;95             return (0);
000018  e3a00000          MOV      r0,#0
                  |L1.28|
00001c  e8bd41f0          POP      {r4-r8,lr}
;;;96         }
;;;97         if (pevent == (OS_EVENT *)0) {                     /* Validate 'pevent'                            */
;;;98             *err = OS_ERR_PEVENT_NULL;
;;;99             return (0);
;;;100        }
;;;101    #endif
;;;102        if (pevent->OSEventType != OS_EVENT_TYPE_MUTEX) {  /* Validate event block type                    */
;;;103            *err = OS_ERR_EVENT_TYPE;
;;;104            return (0);
;;;105        }
;;;106        if (OSIntNesting > 0) {                            /* Make sure it's not called from an ISR        */
;;;107            *err = OS_ERR_PEND_ISR;
;;;108            return (0);
;;;109        }
;;;110        OS_ENTER_CRITICAL();                               /* Get value (0 or 1) of Mutex                  */
;;;111        pip = (INT8U)(pevent->OSEventCnt >> 8);            /* Get PIP from mutex                           */
;;;112        if ((pevent->OSEventCnt & OS_MUTEX_KEEP_LOWER_8) == OS_MUTEX_AVAILABLE) {
;;;113            pevent->OSEventCnt &= OS_MUTEX_KEEP_UPPER_8;   /*      Mask off LSByte (Acquire Mutex)         */
;;;114            pevent->OSEventCnt |= OSTCBCur->OSTCBPrio;     /*      Save current task priority in LSByte    */
;;;115            pevent->OSEventPtr  = (void *)OSTCBCur;        /*      Link TCB of task owning Mutex           */
;;;116            if (OSTCBCur->OSTCBPrio <= pip) {              /*      PIP 'must' have a SMALLER prio ...      */
;;;117                OS_EXIT_CRITICAL();                        /*      ... than current task!                  */
;;;118                *err  = OS_ERR_PIP_LOWER;
;;;119            } else {
;;;120                OS_EXIT_CRITICAL();
;;;121                *err  = OS_ERR_NONE;
;;;122            }
;;;123            return (1);
;;;124        }
;;;125        OS_EXIT_CRITICAL();
;;;126        *err = OS_ERR_NONE;
;;;127        return (0);
;;;128    }
000020  e12fff1e          BX       lr
                  |L1.36|
000024  e3540000          CMP      r4,#0
000028  1a000003          BNE      |L1.60|
00002c  e3a00004          MOV      r0,#4
000030  e5c50000          STRB     r0,[r5,#0]
000034  e3a00000          MOV      r0,#0
000038  eafffff7          B        |L1.28|
                  |L1.60|
00003c  e5d40000          LDRB     r0,[r4,#0]
000040  e3500004          CMP      r0,#4
000044  0a000003          BEQ      |L1.88|
000048  e3a00001          MOV      r0,#1
00004c  e5c50000          STRB     r0,[r5,#0]
000050  e3a00000          MOV      r0,#0
000054  eafffff0          B        |L1.28|
                  |L1.88|
000058  e59f0b18          LDR      r0,|L1.2936|
00005c  e5d00000          LDRB     r0,[r0,#0]  ; OSIntNesting
000060  e3500000          CMP      r0,#0
000064  da000003          BLE      |L1.120|
000068  e3a00002          MOV      r0,#2
00006c  e5c50000          STRB     r0,[r5,#0]
000070  e3a00000          MOV      r0,#0
000074  eaffffe8          B        |L1.28|
                  |L1.120|
000078  ebfffffe          BL       OS_CPU_SR_Save
00007c  e1a07000          MOV      r7,r0
000080  e1d400b8          LDRH     r0,[r4,#8]
000084  e1a06440          ASR      r6,r0,#8
000088  e1d400b8          LDRH     r0,[r4,#8]
00008c  e20000ff          AND      r0,r0,#0xff
000090  e35000ff          CMP      r0,#0xff
000094  1a00001b          BNE      |L1.264|
000098  e1d400b8          LDRH     r0,[r4,#8]
00009c  e2000cff          AND      r0,r0,#0xff00
0000a0  e1c400b8          STRH     r0,[r4,#8]
0000a4  e1d400b8          LDRH     r0,[r4,#8]
0000a8  e59f1acc          LDR      r1,|L1.2940|
0000ac  e5911000          LDR      r1,[r1,#0]  ; OSTCBCur
0000b0  e5d1102e          LDRB     r1,[r1,#0x2e]
0000b4  e1800001          ORR      r0,r0,r1
0000b8  e1c400b8          STRH     r0,[r4,#8]
0000bc  e59f0ab8          LDR      r0,|L1.2940|
0000c0  e5900000          LDR      r0,[r0,#0]  ; OSTCBCur
0000c4  e5840004          STR      r0,[r4,#4]
0000c8  e59f0aac          LDR      r0,|L1.2940|
0000cc  e5900000          LDR      r0,[r0,#0]  ; OSTCBCur
0000d0  e5d0002e          LDRB     r0,[r0,#0x2e]
0000d4  e1500006          CMP      r0,r6
0000d8  ca000004          BGT      |L1.240|
0000dc  e1a00007          MOV      r0,r7
0000e0  ebfffffe          BL       OS_CPU_SR_Restore
0000e4  e3a00078          MOV      r0,#0x78
0000e8  e5c50000          STRB     r0,[r5,#0]
0000ec  ea000003          B        |L1.256|
                  |L1.240|
0000f0  e1a00007          MOV      r0,r7
0000f4  ebfffffe          BL       OS_CPU_SR_Restore
0000f8  e3a00000          MOV      r0,#0
0000fc  e5c50000          STRB     r0,[r5,#0]
                  |L1.256|
000100  e3a00001          MOV      r0,#1
000104  eaffffc4          B        |L1.28|
                  |L1.264|
000108  e1a00007          MOV      r0,r7
00010c  ebfffffe          BL       OS_CPU_SR_Restore
000110  e3a00000          MOV      r0,#0
000114  e5c50000          STRB     r0,[r5,#0]
000118  eaffffbf          B        |L1.28|
                          ENDP

                  OSMutexCreate PROC
;;;166    OS_EVENT  *OSMutexCreate (INT8U prio, INT8U *err)
;;;167    {
00011c  e92d41f0          PUSH     {r4-r8,lr}
000120  e1a04000          MOV      r4,r0
000124  e1a05001          MOV      r5,r1
;;;168        OS_EVENT  *pevent;
;;;169    #if OS_CRITICAL_METHOD == 3                                /* Allocate storage for CPU status register */
;;;170        OS_CPU_SR  cpu_sr = 0;
000128  e3a07000          MOV      r7,#0
;;;171    #endif
;;;172    
;;;173    
;;;174    
;;;175    #if OS_ARG_CHK_EN > 0
;;;176        if (err == (INT8U *)0) {                               /* Validate 'err'                           */
00012c  e3550000          CMP      r5,#0
000130  1a000002          BNE      |L1.320|
;;;177            return ((OS_EVENT *)0);
000134  e3a00000          MOV      r0,#0
                  |L1.312|
000138  e8bd41f0          POP      {r4-r8,lr}
;;;178        }
;;;179        if (prio >= OS_LOWEST_PRIO) {                          /* Validate PIP                             */
;;;180            *err = OS_ERR_PRIO_INVALID;
;;;181            return ((OS_EVENT *)0);
;;;182        }
;;;183    #endif
;;;184        if (OSIntNesting > 0) {                                /* See if called from ISR ...               */
;;;185            *err = OS_ERR_CREATE_ISR;                          /* ... can't CREATE mutex from an ISR       */
;;;186            return ((OS_EVENT *)0);
;;;187        }
;;;188        OS_ENTER_CRITICAL();
;;;189        if (OSTCBPrioTbl[prio] != (OS_TCB *)0) {               /* Mutex priority must not already exist    */
;;;190            OS_EXIT_CRITICAL();                                /* Task already exist at priority ...       */
;;;191            *err = OS_ERR_PRIO_EXIST;                          /* ... inheritance priority                 */
;;;192            return ((OS_EVENT *)0);
;;;193        }
;;;194        OSTCBPrioTbl[prio] = (OS_TCB *)1;                      /* Reserve the table entry                  */
;;;195        pevent             = OSEventFreeList;                  /* Get next free event control block        */
;;;196        if (pevent == (OS_EVENT *)0) {                         /* See if an ECB was available              */
;;;197            OSTCBPrioTbl[prio] = (OS_TCB *)0;                  /* No, Release the table entry              */
;;;198            OS_EXIT_CRITICAL();
;;;199            *err               = OS_ERR_PEVENT_NULL;           /* No more event control blocks             */
;;;200            return (pevent);
;;;201        }
;;;202        OSEventFreeList        = (OS_EVENT *)OSEventFreeList->OSEventPtr;   /* Adjust the free list        */
;;;203        OS_EXIT_CRITICAL();
;;;204        pevent->OSEventType    = OS_EVENT_TYPE_MUTEX;
;;;205        pevent->OSEventCnt     = (INT16U)((INT16U)prio << 8) | OS_MUTEX_AVAILABLE; /* Resource is avail.   */
;;;206        pevent->OSEventPtr     = (void *)0;                                 /* No task owning the mutex    */
;;;207    #if OS_EVENT_NAME_SIZE > 1
;;;208        pevent->OSEventName[0] = '?';
;;;209        pevent->OSEventName[1] = OS_ASCII_NUL;
;;;210    #endif
;;;211        OS_EventWaitListInit(pevent);
;;;212        *err                   = OS_ERR_NONE;
;;;213        return (pevent);
;;;214    }
00013c  e12fff1e          BX       lr
                  |L1.320|
000140  e354001f          CMP      r4,#0x1f
000144  ba000003          BLT      |L1.344|
000148  e3a0002a          MOV      r0,#0x2a
00014c  e5c50000          STRB     r0,[r5,#0]
000150  e3a00000          MOV      r0,#0
000154  eafffff7          B        |L1.312|
                  |L1.344|
000158  e59f0a18          LDR      r0,|L1.2936|
00015c  e5d00000          LDRB     r0,[r0,#0]  ; OSIntNesting
000160  e3500000          CMP      r0,#0
000164  da000003          BLE      |L1.376|
000168  e3a00010          MOV      r0,#0x10
00016c  e5c50000          STRB     r0,[r5,#0]
000170  e3a00000          MOV      r0,#0
000174  eaffffef          B        |L1.312|
                  |L1.376|
000178  ebfffffe          BL       OS_CPU_SR_Save
00017c  e1a07000          MOV      r7,r0
000180  e59f09f8          LDR      r0,|L1.2944|
000184  e7900104          LDR      r0,[r0,r4,LSL #2]
000188  e3500000          CMP      r0,#0
00018c  0a000005          BEQ      |L1.424|
000190  e1a00007          MOV      r0,r7
000194  ebfffffe          BL       OS_CPU_SR_Restore
000198  e3a00028          MOV      r0,#0x28
00019c  e5c50000          STRB     r0,[r5,#0]
0001a0  e3a00000          MOV      r0,#0
0001a4  eaffffe3          B        |L1.312|
                  |L1.424|
0001a8  e3a00001          MOV      r0,#1
0001ac  e59f19cc          LDR      r1,|L1.2944|
0001b0  e7810104          STR      r0,[r1,r4,LSL #2]
0001b4  e59f09c8          LDR      r0,|L1.2948|
0001b8  e5906000          LDR      r6,[r0,#0]  ; OSEventFreeList
0001bc  e3560000          CMP      r6,#0
0001c0  1a000008          BNE      |L1.488|
0001c4  e3a00000          MOV      r0,#0
0001c8  e59f19b0          LDR      r1,|L1.2944|
0001cc  e7810104          STR      r0,[r1,r4,LSL #2]
0001d0  e1a00007          MOV      r0,r7
0001d4  ebfffffe          BL       OS_CPU_SR_Restore
0001d8  e3a00004          MOV      r0,#4
0001dc  e5c50000          STRB     r0,[r5,#0]
0001e0  e1a00006          MOV      r0,r6
0001e4  eaffffd3          B        |L1.312|
                  |L1.488|
0001e8  e59f0994          LDR      r0,|L1.2948|
0001ec  e5900000          LDR      r0,[r0,#0]  ; OSEventFreeList
0001f0  e5900004          LDR      r0,[r0,#4]
0001f4  e59f1988          LDR      r1,|L1.2948|
0001f8  e5810000          STR      r0,[r1,#0]  ; OSEventFreeList
0001fc  e1a00007          MOV      r0,r7
000200  ebfffffe          BL       OS_CPU_SR_Restore
000204  e3a00004          MOV      r0,#4
000208  e5c60000          STRB     r0,[r6,#0]
00020c  e3a000ff          MOV      r0,#0xff
000210  e1800404          ORR      r0,r0,r4,LSL #8
000214  e1c600b8          STRH     r0,[r6,#8]
000218  e3a00000          MOV      r0,#0
00021c  e5860004          STR      r0,[r6,#4]
000220  e3a0003f          MOV      r0,#0x3f
000224  e5c6000f          STRB     r0,[r6,#0xf]
000228  e3a00000          MOV      r0,#0
00022c  e5c60010          STRB     r0,[r6,#0x10]

⌨️ 快捷键说明

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