📄 os_mutex.txt
字号:
; 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 + -