📄 os_mutex.txt
字号:
; generated by ARM/Thumb C/C++ Compiler with , RVCT3.0 [Build 947] for uVision
; commandline ArmCC [--debug -c --asm --interleave -o.\os_mutex.o --device=DARMP -O0 -IC:\Keil\ARM\INC\Philips ..\Source\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 e59f086c LDR r0,|L1.2176|
000010 e5d00000 LDRB r0,[r0,#0] ; OSIntNesting
000014 e3500000 CMP r0,#0
000018 da000003 BLE |L1.44|
;;;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
;;;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 }
|L1.40|
000028 e8bd8070 POP {r4-r6,pc}
|L1.44|
00002c e3540000 CMP r4,#0 ;71
000030 1a000003 BNE |L1.68| ;71
000034 e3a00004 MOV r0,#4 ;72
000038 e5c50000 STRB r0,[r5,#0] ;72
00003c e3a00000 MOV r0,#0 ;73
000040 eafffff8 B |L1.40| ;73
|L1.68|
000044 e5d40000 LDRB r0,[r4,#0] ;75
000048 e3500004 CMP r0,#4 ;75
00004c 0a000003 BEQ |L1.96| ;75
000050 e3a00001 MOV r0,#1 ;76
000054 e5c50000 STRB r0,[r5,#0] ;76
000058 e3a00000 MOV r0,#0 ;77
00005c eafffff1 B |L1.40| ;77
|L1.96|
000060 ef000002 SVC 0x2 ; formerly SWI ;80
000064 e1d400b2 LDRH r0,[r4,#2] ;81
000068 e20000ff AND r0,r0,#0xff ;81
00006c e35000ff CMP r0,#0xff ;81
000070 1a000010 BNE |L1.184| ;81
000074 e1d400b2 LDRH r0,[r4,#2] ;82
000078 e2000cff AND r0,r0,#0xff00 ;82
00007c e1c400b2 STRH r0,[r4,#2] ;82
000080 e1d400b2 LDRH r0,[r4,#2] ;83
000084 e59f17f8 LDR r1,|L1.2180| ;83
000088 e5911000 LDR r1,[r1,#0] ;83 ; OSTCBCur
00008c e5d1101d LDRB r1,[r1,#0x1d] ;83
000090 e1800001 ORR r0,r0,r1 ;83
000094 e1c400b2 STRH r0,[r4,#2] ;83
000098 e59f07e4 LDR r0,|L1.2180| ;84
00009c e5900000 LDR r0,[r0,#0] ;84 ; OSTCBCur
0000a0 e5840004 STR r0,[r4,#4] ;84
0000a4 ef000003 SVC 0x3 ; formerly SWI ;85
0000a8 e3a00000 MOV r0,#0 ;86
0000ac e5c50000 STRB r0,[r5,#0] ;86
0000b0 e3a00001 MOV r0,#1 ;87
0000b4 eaffffdb B |L1.40| ;87
|L1.184|
0000b8 ef000003 SVC 0x3 ; formerly SWI ;89
0000bc e3a00000 MOV r0,#0 ;90
0000c0 e5c50000 STRB r0,[r5,#0] ;90
0000c4 eaffffd7 B |L1.40| ;91
ENDP
OSMutexCreate PROC
;;;129 OS_EVENT *OSMutexCreate (INT8U prio, INT8U *err)
;;;130 {
0000c8 e92d4070 PUSH {r4-r6,lr}
0000cc e1a04000 MOV r4,r0
0000d0 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 ... */
0000d4 e59f07a4 LDR r0,|L1.2176|
0000d8 e5d00000 LDRB r0,[r0,#0] ; OSIntNesting
0000dc e3500000 CMP r0,#0
0000e0 da000003 BLE |L1.244|
;;;138 *err = OS_ERR_CREATE_ISR; /* ... can't CREATE mutex from an ISR */
0000e4 e3a0008d MOV r0,#0x8d
0000e8 e5c60000 STRB r0,[r6,#0]
;;;139 return ((OS_EVENT *)0);
0000ec e3a00000 MOV r0,#0
;;;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 }
|L1.240|
0000f0 e8bd8070 POP {r4-r6,pc}
|L1.244|
0000f4 e354000c CMP r4,#0xc ;142
0000f8 ba000003 BLT |L1.268| ;142
0000fc e3a0002a MOV r0,#0x2a ;143
000100 e5c60000 STRB r0,[r6,#0] ;143
000104 e3a00000 MOV r0,#0 ;144
000108 eafffff8 B |L1.240| ;144
|L1.268|
00010c ef000002 SVC 0x2 ; formerly SWI ;147
000110 e59f0770 LDR r0,|L1.2184| ;148
000114 e7900104 LDR r0,[r0,r4,LSL #2] ;148
000118 e3500000 CMP r0,#0 ;148
00011c 0a000004 BEQ |L1.308| ;148
000120 ef000003 SVC 0x3 ; formerly SWI ;149
000124 e3a00028 MOV r0,#0x28 ;150
000128 e5c60000 STRB r0,[r6,#0] ;150
00012c e3a00000 MOV r0,#0 ;151
000130 eaffffee B |L1.240| ;151
|L1.308|
000134 e3a00001 MOV r0,#1 ;153
000138 e59f1748 LDR r1,|L1.2184| ;153
00013c e7810104 STR r0,[r1,r4,LSL #2] ;153
000140 e59f0744 LDR r0,|L1.2188| ;154
000144 e5905000 LDR r5,[r0,#0] ;154 ; OSEventFreeList
000148 e3550000 CMP r5,#0 ;155
00014c 1a000006 BNE |L1.364| ;155
000150 e3a00000 MOV r0,#0 ;156
000154 e7810104 STR r0,[r1,r4,LSL #2] ;156
000158 ef000003 SVC 0x3 ; formerly SWI ;157
00015c e3a00004 MOV r0,#4 ;158
000160 e5c60000 STRB r0,[r6,#0] ;158
000164 e1a00005 MOV r0,r5 ;159
000168 eaffffe0 B |L1.240| ;159
|L1.364|
00016c e59f0718 LDR r0,|L1.2188| ;161
000170 e5900000 LDR r0,[r0,#0] ;161 ; OSEventFreeList
000174 e5900004 LDR r0,[r0,#4] ;161
000178 e59f170c LDR r1,|L1.2188| ;161
00017c e5810000 STR r0,[r1,#0] ;161 ; OSEventFreeList
000180 ef000003 SVC 0x3 ; formerly SWI ;162
000184 e3a00004 MOV r0,#4 ;163
000188 e5c50000 STRB r0,[r5,#0] ;163
00018c e3a000ff MOV r0,#0xff ;164
000190 e1800404 ORR r0,r0,r4,LSL #8 ;164
000194 e1c500b2 STRH r0,[r5,#2] ;164
000198 e3a00000 MOV r0,#0 ;165
00019c e5850004 STR r0,[r5,#4] ;165
0001a0 e1a00005 MOV r0,r5 ;166
0001a4 ebfffffe BL OS_EventWaitListInit ;166
0001a8 e3a00000 MOV r0,#0 ;167
0001ac e5c60000 STRB r0,[r6,#0] ;167
0001b0 e1a00005 MOV r0,r5 ;168
0001b4 eaffffcd B |L1.240| ;168
ENDP
OSMutexDel PROC
;;;206 OS_EVENT *OSMutexDel (OS_EVENT *pevent, INT8U opt, INT8U *err)
;;;207 {
0001b8 e92d41f0 PUSH {r4-r8,lr}
0001bc e1a04000 MOV r4,r0
0001c0 e1a05001 MOV r5,r1
0001c4 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 ... */
0001c8 e59f06b0 LDR r0,|L1.2176|
0001cc e5d00000 LDRB r0,[r0,#0] ; OSIntNesting
0001d0 e3500000 CMP r0,#0
0001d4 da000003 BLE |L1.488|
;;;216 *err = OS_ERR_DEL_ISR; /* ... can't DELETE from an ISR */
0001d8 e3a0008c MOV r0,#0x8c
0001dc e5c60000 STRB r0,[r6,#0]
;;;217 return (pevent);
0001e0 e1a00004 MOV r0,r4
;;;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 }
;;;228 #endif
;;;229 OS_ENTER_CRITICAL();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -