📄 os_mutex.lst
字号:
213 OS_CPU_SR cpu_sr;
214 #endif
215 BOOLEAN tasks_waiting;
216 INT8U pip;
217
218
219 if (OSIntNesting > 0) { /* See if called from ISR ... */
\ 00000006 .... LDR R0,??DataTable10 ;; OSIntNesting
\ 00000008 0078 LDRB R0,[R0, #+0]
\ 0000000A 0128 CMP R0,#+1
\ 0000000C 03D3 BCC ??OSMutexDel_0
220 *err = OS_ERR_DEL_ISR; /* ... can't DELETE from an ISR */
\ 0000000E 8C20 MOVS R0,#+140
\ 00000010 2870 STRB R0,[R5, #+0]
221 return (pevent);
\ 00000012 2000 MOVS R0,R4
\ 00000014 75E0 B ??OSMutexDel_1
222 }
223 #if OS_ARG_CHK_EN > 0
224 if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
\ ??OSMutexDel_0:
\ 00000016 002C CMP R4,#+0
\ 00000018 03D1 BNE ??OSMutexDel_2
225 *err = OS_ERR_PEVENT_NULL;
\ 0000001A 0420 MOVS R0,#+4
\ 0000001C 2870 STRB R0,[R5, #+0]
226 return ((OS_EVENT *)0);
\ 0000001E 0020 MOVS R0,#+0
\ 00000020 6FE0 B ??OSMutexDel_1
227 }
228 #endif
229 if (pevent->OSEventType != OS_EVENT_TYPE_MUTEX) { /* Validate event block type */
\ ??OSMutexDel_2:
\ 00000022 2078 LDRB R0,[R4, #+0]
\ 00000024 0428 CMP R0,#+4
\ 00000026 03D0 BEQ ??OSMutexDel_3
230 *err = OS_ERR_EVENT_TYPE;
\ 00000028 0120 MOVS R0,#+1
\ 0000002A 2870 STRB R0,[R5, #+0]
231 return (pevent);
\ 0000002C 2000 MOVS R0,R4
\ 0000002E 68E0 B ??OSMutexDel_1
232 }
233 OS_ENTER_CRITICAL();
\ ??OSMutexDel_3:
\ 00000030 ........ _BLF OS_CPU_SR_Save,??OS_CPU_SR_Save??rT
\ 00000034 0600 MOVS R6,R0
234 if (pevent->OSEventGrp != 0x00) { /* See if any tasks waiting on mutex */
\ 00000036 6078 LDRB R0,[R4, #+1]
\ 00000038 0028 CMP R0,#+0
\ 0000003A 01D0 BEQ ??OSMutexDel_4
235 tasks_waiting = TRUE; /* Yes */
\ 0000003C 0127 MOVS R7,#+1
\ 0000003E 00E0 B ??OSMutexDel_5
236 } else {
237 tasks_waiting = FALSE; /* No */
\ ??OSMutexDel_4:
\ 00000040 0027 MOVS R7,#+0
238 }
239 switch (opt) {
\ ??OSMutexDel_5:
\ 00000042 6846 MOV R0,SP
\ 00000044 0078 LDRB R0,[R0, #+0]
\ 00000046 0028 CMP R0,#+0
\ 00000048 02D0 BEQ ??OSMutexDel_6
\ 0000004A 0128 CMP R0,#+1
\ 0000004C 2DD0 BEQ ??OSMutexDel_7
\ 0000004E 52E0 B ??OSMutexDel_8
240 case OS_DEL_NO_PEND: /* Delete mutex only if no task waiting */
241 if (tasks_waiting == FALSE) {
\ ??OSMutexDel_6:
\ 00000050 002F CMP R7,#+0
\ 00000052 1ED1 BNE ??OSMutexDel_9
242 #if OS_EVENT_NAME_SIZE > 1
243 pevent->OSEventName[0] = '?'; /* Unknown name */
\ 00000054 3F20 MOVS R0,#+63
\ 00000056 2074 STRB R0,[R4, #+16]
244 pevent->OSEventName[1] = OS_ASCII_NUL;
\ 00000058 0020 MOVS R0,#+0
\ 0000005A 6074 STRB R0,[R4, #+17]
245 #endif
246 pip = (INT8U)(pevent->OSEventCnt >> 8);
\ 0000005C 6088 LDRH R0,[R4, #+2]
\ 0000005E 0004 LSLS R0,R0,#+16 ;; ZeroExtS R0,R0,#+16,#+16
\ 00000060 000C LSRS R0,R0,#+16
\ 00000062 000A LSRS R0,R0,#+8
247 OSTCBPrioTbl[pip] = (OS_TCB *)0; /* Free up the PIP */
\ 00000064 0006 LSLS R0,R0,#+24 ;; ZeroExtS R0,R0,#+24,#+24
\ 00000066 000E LSRS R0,R0,#+24
\ 00000068 0421 MOVS R1,#+4
\ 0000006A 4843 MULS R0,R1,R0
\ 0000006C .... LDR R1,??DataTable14 ;; OSTCBPrioTbl
\ 0000006E 0022 MOVS R2,#+0
\ 00000070 0A50 STR R2,[R1, R0]
248 pevent->OSEventType = OS_EVENT_TYPE_UNUSED;
\ 00000072 0020 MOVS R0,#+0
\ 00000074 2070 STRB R0,[R4, #+0]
249 pevent->OSEventPtr = OSEventFreeList; /* Return Event Control Block to free list */
\ 00000076 .... LDR R0,??DataTable16 ;; OSEventFreeList
\ 00000078 0068 LDR R0,[R0, #+0]
\ 0000007A 6060 STR R0,[R4, #+4]
250 pevent->OSEventCnt = 0;
\ 0000007C 0020 MOVS R0,#+0
\ 0000007E 6080 STRH R0,[R4, #+2]
251 OSEventFreeList = pevent;
\ 00000080 .... LDR R0,??DataTable16 ;; OSEventFreeList
\ 00000082 0460 STR R4,[R0, #+0]
252 OS_EXIT_CRITICAL();
\ 00000084 3000 MOVS R0,R6
\ 00000086 ........ _BLF OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rT
253 *err = OS_NO_ERR;
\ 0000008A 0020 MOVS R0,#+0
\ 0000008C 2870 STRB R0,[R5, #+0]
254 return ((OS_EVENT *)0); /* Mutex has been deleted */
\ 0000008E 0020 MOVS R0,#+0
\ 00000090 37E0 B ??OSMutexDel_1
255 } else {
256 OS_EXIT_CRITICAL();
\ ??OSMutexDel_9:
\ 00000092 3000 MOVS R0,R6
\ 00000094 ........ _BLF OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rT
257 *err = OS_ERR_TASK_WAITING;
\ 00000098 0820 MOVS R0,#+8
\ 0000009A 2870 STRB R0,[R5, #+0]
258 return (pevent);
\ 0000009C 2000 MOVS R0,R4
\ 0000009E 30E0 B ??OSMutexDel_1
259 }
260
261 case OS_DEL_ALWAYS: /* Always delete the mutex */
262 while (pevent->OSEventGrp != 0x00) { /* Ready ALL tasks waiting for mutex */
263 OS_EventTaskRdy(pevent, (void *)0, OS_STAT_MUTEX);
\ ??OSMutexDel_10:
\ 000000A0 1022 MOVS R2,#+16
\ 000000A2 0021 MOVS R1,#+0
\ 000000A4 2000 MOVS R0,R4
\ 000000A6 ........ _BLF OS_EventTaskRdy,??OS_EventTaskRdy??rT
264 }
\ ??OSMutexDel_7:
\ 000000AA 6078 LDRB R0,[R4, #+1]
\ 000000AC 0028 CMP R0,#+0
\ 000000AE F7D1 BNE ??OSMutexDel_10
265 #if OS_EVENT_NAME_SIZE > 1
266 pevent->OSEventName[0] = '?'; /* Unknown name */
\ 000000B0 3F20 MOVS R0,#+63
\ 000000B2 2074 STRB R0,[R4, #+16]
267 pevent->OSEventName[1] = OS_ASCII_NUL;
\ 000000B4 0020 MOVS R0,#+0
\ 000000B6 6074 STRB R0,[R4, #+17]
268 #endif
269 pip = (INT8U)(pevent->OSEventCnt >> 8);
\ 000000B8 6088 LDRH R0,[R4, #+2]
\ 000000BA 0004 LSLS R0,R0,#+16 ;; ZeroExtS R0,R0,#+16,#+16
\ 000000BC 000C LSRS R0,R0,#+16
\ 000000BE 000A LSRS R0,R0,#+8
270 OSTCBPrioTbl[pip] = (OS_TCB *)0; /* Free up the PIP */
\ 000000C0 0006 LSLS R0,R0,#+24 ;; ZeroExtS R0,R0,#+24,#+24
\ 000000C2 000E LSRS R0,R0,#+24
\ 000000C4 0421 MOVS R1,#+4
\ 000000C6 4843 MULS R0,R1,R0
\ 000000C8 .... LDR R1,??DataTable14 ;; OSTCBPrioTbl
\ 000000CA 0022 MOVS R2,#+0
\ 000000CC 0A50 STR R2,[R1, R0]
271 pevent->OSEventType = OS_EVENT_TYPE_UNUSED;
\ 000000CE 0020 MOVS R0,#+0
\ 000000D0 2070 STRB R0,[R4, #+0]
272 pevent->OSEventPtr = OSEventFreeList; /* Return Event Control Block to free list */
\ 000000D2 .... LDR R0,??DataTable16 ;; OSEventFreeList
\ 000000D4 0068 LDR R0,[R0, #+0]
\ 000000D6 6060 STR R0,[R4, #+4]
273 pevent->OSEventCnt = 0;
\ 000000D8 0020 MOVS R0,#+0
\ 000000DA 6080 STRH R0,[R4, #+2]
274 OSEventFreeList = pevent; /* Get next free event control block */
\ 000000DC .... LDR R0,??DataTable16 ;; OSEventFreeList
\ 000000DE 0460 STR R4,[R0, #+0]
275 OS_EXIT_CRITICAL();
\ 000000E0 3000 MOVS R0,R6
\ 000000E2 ........ _BLF OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rT
276 if (tasks_waiting == TRUE) { /* Reschedule only if task(s) were waiting */
\ 000000E6 012F CMP R7,#+1
\ 000000E8 01D1 BNE ??OSMutexDel_11
277 OS_Sched(); /* Find highest priority task ready to run */
\ 000000EA ........ _BLF OS_Sched,??OS_Sched??rT
278 }
279 *err = OS_NO_ERR;
\ ??OSMutexDel_11:
\ 000000EE 0020 MOVS R0,#+0
\ 000000F0 2870 STRB R0,[R5, #+0]
280 return ((OS_EVENT *)0); /* Mutex has been deleted */
\ 000000F2 0020 MOVS R0,#+0
\ 000000F4 05E0 B ??OSMutexDel_1
281
282 default:
283 OS_EXIT_CRITICAL();
\ ??OSMutexDel_8:
\ 000000F6 3000 MOVS R0,R6
\ 000000F8 ........ _BLF OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rT
284 *err = OS_ERR_INVALID_OPT;
\ 000000FC 0720 MOVS R0,#+7
\ 000000FE 2870 STRB R0,[R5, #+0]
285 return (pevent);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -