📄 os_mutex.txt
字号:
; generated by ARM/Thumb C/C++ Compiler with , RVCT3.0 [Build 951] for uVision
; commandline ArmCC [--debug -c --asm --interleave -oos_mutex.o --device=DARMP --apcs=interwork -O0 -IC:\Keil\ARM\INC\Philips uCosii\OS_MUTEX.C]
ARM
AREA ||.text.7||, CODE, READONLY, ALIGN=2
OSMutexAccept PROC
;;;59 INT8U OSMutexAccept (OS_EVENT *pevent, INT8U *err)
;;;60 {
000000 e92d4070 PUSH {r4-r6,lr}
000004 e1a04000 MOV r4,r0
000008 e1a05001 MOV r5,r1
;;;61 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;62 OS_CPU_SR cpu_sr;
;;;63 #endif
;;;64
;;;65
;;;66 if (OSIntNesting > 0) { /* Make sure it's not called from an ISR */
00000c e59f0884 LDR r0,|L1.2200|
000010 e5d00000 LDRB r0,[r0,#0] ; OSIntNesting
000014 e3500000 CMP r0,#0
000018 da000004 BLE |L1.48|
;;;67 *err = OS_ERR_PEND_ISR;
00001c e3a00002 MOV r0,#2
000020 e5c50000 STRB r0,[r5,#0]
;;;68 return (0);
000024 e3a00000 MOV r0,#0
|L1.40|
000028 e8bd4070 POP {r4-r6,lr}
;;;69 }
;;;70 #if OS_ARG_CHK_EN > 0
;;;71 if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
;;;72 *err = OS_ERR_PEVENT_NULL;
;;;73 return (0);
;;;74 }
;;;75 if (pevent->OSEventType != OS_EVENT_TYPE_MUTEX) { /* Validate event block type */
;;;76 *err = OS_ERR_EVENT_TYPE;
;;;77 return (0);
;;;78 }
;;;79 #endif
;;;80 OS_ENTER_CRITICAL(); /* Get value (0 or 1) of Mutex */
;;;81 if ((pevent->OSEventCnt & OS_MUTEX_KEEP_LOWER_8) == OS_MUTEX_AVAILABLE) {
;;;82 pevent->OSEventCnt &= OS_MUTEX_KEEP_UPPER_8; /* Mask off LSByte (Acquire Mutex) */
;;;83 pevent->OSEventCnt |= OSTCBCur->OSTCBPrio; /* Save current task priority in LSByte */
;;;84 pevent->OSEventPtr = (void *)OSTCBCur; /* Link TCB of task owning Mutex */
;;;85 OS_EXIT_CRITICAL();
;;;86 *err = OS_NO_ERR;
;;;87 return (1);
;;;88 }
;;;89 OS_EXIT_CRITICAL();
;;;90 *err = OS_NO_ERR;
;;;91 return (0);
;;;92 }
00002c e12fff1e BX lr
|L1.48|
000030 e3540000 CMP r4,#0 ;71
000034 1a000003 BNE |L1.72| ;71
000038 e3a00004 MOV r0,#4 ;72
00003c e5c50000 STRB r0,[r5,#0] ;72
000040 e3a00000 MOV r0,#0 ;73
000044 eafffff7 B |L1.40| ;73
|L1.72|
000048 e5d40000 LDRB r0,[r4,#0] ;75
00004c e3500004 CMP r0,#4 ;75
000050 0a000003 BEQ |L1.100| ;75
000054 e3a00001 MOV r0,#1 ;76
000058 e5c50000 STRB r0,[r5,#0] ;76
00005c e3a00000 MOV r0,#0 ;77
000060 eafffff0 B |L1.40| ;77
|L1.100|
000064 ef000002 SVC 0x2 ; formerly SWI ;80
000068 e1d400b2 LDRH r0,[r4,#2] ;81
00006c e20000ff AND r0,r0,#0xff ;81
000070 e35000ff CMP r0,#0xff ;81
000074 1a000010 BNE |L1.188| ;81
000078 e1d400b2 LDRH r0,[r4,#2] ;82
00007c e2000cff AND r0,r0,#0xff00 ;82
000080 e1c400b2 STRH r0,[r4,#2] ;82
000084 e1d400b2 LDRH r0,[r4,#2] ;83
000088 e59f180c LDR r1,|L1.2204| ;83
00008c e5911000 LDR r1,[r1,#0] ;83 ; OSTCBCur
000090 e5d1102d LDRB r1,[r1,#0x2d] ;83
000094 e1800001 ORR r0,r0,r1 ;83
000098 e1c400b2 STRH r0,[r4,#2] ;83
00009c e59f07f8 LDR r0,|L1.2204| ;84
0000a0 e5900000 LDR r0,[r0,#0] ;84 ; OSTCBCur
0000a4 e5840004 STR r0,[r4,#4] ;84
0000a8 ef000003 SVC 0x3 ; formerly SWI ;85
0000ac e3a00000 MOV r0,#0 ;86
0000b0 e5c50000 STRB r0,[r5,#0] ;86
0000b4 e3a00001 MOV r0,#1 ;87
0000b8 eaffffda B |L1.40| ;87
|L1.188|
0000bc ef000003 SVC 0x3 ; formerly SWI ;89
0000c0 e3a00000 MOV r0,#0 ;90
0000c4 e5c50000 STRB r0,[r5,#0] ;90
0000c8 eaffffd6 B |L1.40| ;91
ENDP
OSMutexCreate PROC
;;;129 OS_EVENT *OSMutexCreate (INT8U prio, INT8U *err)
;;;130 {
0000cc e92d4070 PUSH {r4-r6,lr}
0000d0 e1a04000 MOV r4,r0
0000d4 e1a06001 MOV r6,r1
;;;131 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;132 OS_CPU_SR cpu_sr;
;;;133 #endif
;;;134 OS_EVENT *pevent;
;;;135
;;;136
;;;137 if (OSIntNesting > 0) { /* See if called from ISR ... */
0000d8 e59f07b8 LDR r0,|L1.2200|
0000dc e5d00000 LDRB r0,[r0,#0] ; OSIntNesting
0000e0 e3500000 CMP r0,#0
0000e4 da000004 BLE |L1.252|
;;;138 *err = OS_ERR_CREATE_ISR; /* ... can't CREATE mutex from an ISR */
0000e8 e3a0008d MOV r0,#0x8d
0000ec e5c60000 STRB r0,[r6,#0]
;;;139 return ((OS_EVENT *)0);
0000f0 e3a00000 MOV r0,#0
|L1.244|
0000f4 e8bd4070 POP {r4-r6,lr}
;;;140 }
;;;141 #if OS_ARG_CHK_EN > 0
;;;142 if (prio >= OS_LOWEST_PRIO) { /* Validate PIP */
;;;143 *err = OS_PRIO_INVALID;
;;;144 return ((OS_EVENT *)0);
;;;145 }
;;;146 #endif
;;;147 OS_ENTER_CRITICAL();
;;;148 if (OSTCBPrioTbl[prio] != (OS_TCB *)0) { /* Mutex priority must not already exist */
;;;149 OS_EXIT_CRITICAL(); /* Task already exist at priority ... */
;;;150 *err = OS_PRIO_EXIST; /* ... inheritance priority */
;;;151 return ((OS_EVENT *)0);
;;;152 }
;;;153 OSTCBPrioTbl[prio] = (OS_TCB *)1; /* Reserve the table entry */
;;;154 pevent = OSEventFreeList; /* Get next free event control block */
;;;155 if (pevent == (OS_EVENT *)0) { /* See if an ECB was available */
;;;156 OSTCBPrioTbl[prio] = (OS_TCB *)0; /* No, Release the table entry */
;;;157 OS_EXIT_CRITICAL();
;;;158 *err = OS_ERR_PEVENT_NULL; /* No more event control blocks */
;;;159 return (pevent);
;;;160 }
;;;161 OSEventFreeList = (OS_EVENT *)OSEventFreeList->OSEventPtr; /* Adjust the free list */
;;;162 OS_EXIT_CRITICAL();
;;;163 pevent->OSEventType = OS_EVENT_TYPE_MUTEX;
;;;164 pevent->OSEventCnt = (prio << 8) | OS_MUTEX_AVAILABLE;/* Resource is available */
;;;165 pevent->OSEventPtr = (void *)0; /* No task owning the mutex */
;;;166 OS_EventWaitListInit(pevent);
;;;167 *err = OS_NO_ERR;
;;;168 return (pevent);
;;;169 }
0000f8 e12fff1e BX lr
|L1.252|
0000fc e354000c CMP r4,#0xc ;142
000100 ba000003 BLT |L1.276| ;142
000104 e3a0002a MOV r0,#0x2a ;143
000108 e5c60000 STRB r0,[r6,#0] ;143
00010c e3a00000 MOV r0,#0 ;144
000110 eafffff7 B |L1.244| ;144
|L1.276|
000114 ef000002 SVC 0x2 ; formerly SWI ;147
000118 e59f0780 LDR r0,|L1.2208| ;148
00011c e7900104 LDR r0,[r0,r4,LSL #2] ;148
000120 e3500000 CMP r0,#0 ;148
000124 0a000004 BEQ |L1.316| ;148
000128 ef000003 SVC 0x3 ; formerly SWI ;149
00012c e3a00028 MOV r0,#0x28 ;150
000130 e5c60000 STRB r0,[r6,#0] ;150
000134 e3a00000 MOV r0,#0 ;151
000138 eaffffed B |L1.244| ;151
|L1.316|
00013c e3a00001 MOV r0,#1 ;153
000140 e59f1758 LDR r1,|L1.2208| ;153
000144 e7810104 STR r0,[r1,r4,LSL #2] ;153
000148 e59f0754 LDR r0,|L1.2212| ;154
00014c e5905000 LDR r5,[r0,#0] ;154 ; OSEventFreeList
000150 e3550000 CMP r5,#0 ;155
000154 1a000006 BNE |L1.372| ;155
000158 e3a00000 MOV r0,#0 ;156
00015c e7810104 STR r0,[r1,r4,LSL #2] ;156
000160 ef000003 SVC 0x3 ; formerly SWI ;157
000164 e3a00004 MOV r0,#4 ;158
000168 e5c60000 STRB r0,[r6,#0] ;158
00016c e1a00005 MOV r0,r5 ;159
000170 eaffffdf B |L1.244| ;159
|L1.372|
000174 e59f0728 LDR r0,|L1.2212| ;161
000178 e5900000 LDR r0,[r0,#0] ;161 ; OSEventFreeList
00017c e5900004 LDR r0,[r0,#4] ;161
000180 e59f171c LDR r1,|L1.2212| ;161
000184 e5810000 STR r0,[r1,#0] ;161 ; OSEventFreeList
000188 ef000003 SVC 0x3 ; formerly SWI ;162
00018c e3a00004 MOV r0,#4 ;163
000190 e5c50000 STRB r0,[r5,#0] ;163
000194 e3a000ff MOV r0,#0xff ;164
000198 e1800404 ORR r0,r0,r4,LSL #8 ;164
00019c e1c500b2 STRH r0,[r5,#2] ;164
0001a0 e3a00000 MOV r0,#0 ;165
0001a4 e5850004 STR r0,[r5,#4] ;165
0001a8 e1a00005 MOV r0,r5 ;166
0001ac ebfffffe BL OS_EventWaitListInit ;166
0001b0 e3a00000 MOV r0,#0 ;167
0001b4 e5c60000 STRB r0,[r6,#0] ;167
0001b8 e1a00005 MOV r0,r5 ;168
0001bc eaffffcc B |L1.244| ;168
ENDP
OSMutexDel PROC
;;;206 OS_EVENT *OSMutexDel (OS_EVENT *pevent, INT8U opt, INT8U *err)
;;;207 {
0001c0 e92d41f0 PUSH {r4-r8,lr}
0001c4 e1a04000 MOV r4,r0
0001c8 e1a05001 MOV r5,r1
0001cc e1a06002 MOV r6,r2
;;;208 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;209 OS_CPU_SR cpu_sr;
;;;210 #endif
;;;211 BOOLEAN tasks_waiting;
;;;212 INT8U pip;
;;;213
;;;214
;;;215 if (OSIntNesting > 0) { /* See if called from ISR ... */
0001d0 e59f06c0 LDR r0,|L1.2200|
0001d4 e5d00000 LDRB r0,[r0,#0] ; OSIntNesting
0001d8 e3500000 CMP r0,#0
0001dc da000004 BLE |L1.500|
;;;216 *err = OS_ERR_DEL_ISR; /* ... can't DELETE from an ISR */
0001e0 e3a0008c MOV r0,#0x8c
0001e4 e5c60000 STRB r0,[r6,#0]
;;;217 return (pevent);
0001e8 e1a00004 MOV r0,r4
|L1.492|
0001ec e8bd41f0 POP {r4-r8,lr}
;;;218 }
;;;219 #if OS_ARG_CHK_EN > 0
;;;220 if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
;;;221 *err = OS_ERR_PEVENT_NULL;
;;;222 return ((OS_EVENT *)0);
;;;223 }
;;;224 if (pevent->OSEventType != OS_EVENT_TYPE_MUTEX) { /* Validate event block type */
;;;225 *err = OS_ERR_EVENT_TYPE;
;;;226 return (pevent);
;;;227 }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -