📄 os_mutex.lst
字号:
409
410
411
412 #if OS_ARG_CHK_EN > 0
413 if (err == (INT8U *)0) { /* Validate 'err' */
\ 00000018 000055E3 CMP R5,#+0
\ 0000001C E900000A BEQ ??OSMutexPend_0
414 return;
415 }
416 if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
\ 00000020 000054E3 CMP R4,#+0
\ 00000024 0200001A BNE ??OSMutexPend_1
417 *err = OS_ERR_PEVENT_NULL;
\ 00000028 0400A0E3 MOV R0,#+4
\ 0000002C 0000C5E5 STRB R0,[R5, #+0]
418 return;
\ 00000030 E40000EA B ??OSMutexPend_0
419 }
420 #endif
421 if (pevent->OSEventType != OS_EVENT_TYPE_MUTEX) { /* Validate event block type */
\ ??OSMutexPend_1:
\ 00000034 0000D4E5 LDRB R0,[R4, #+0]
\ 00000038 040050E3 CMP R0,#+4
\ 0000003C 0200000A BEQ ??OSMutexPend_2
422 *err = OS_ERR_EVENT_TYPE;
\ 00000040 0100A0E3 MOV R0,#+1
\ 00000044 0000C5E5 STRB R0,[R5, #+0]
423 return;
\ 00000048 DE0000EA B ??OSMutexPend_0
424 }
425 if (OSIntNesting > 0) { /* See if called from ISR ... */
\ ??OSMutexPend_2:
\ 0000004C ........ LDR R0,??DataTable47 ;; OSIntNesting
\ 00000050 0000D0E5 LDRB R0,[R0, #+0]
\ 00000054 010050E3 CMP R0,#+1
\ 00000058 0200003A BCC ??OSMutexPend_3
426 *err = OS_ERR_PEND_ISR; /* ... can't PEND from an ISR */
\ 0000005C 0200A0E3 MOV R0,#+2
\ 00000060 0000C5E5 STRB R0,[R5, #+0]
427 return;
\ 00000064 D70000EA B ??OSMutexPend_0
428 }
429 if (OSLockNesting > 0) { /* See if called with scheduler locked ... */
\ ??OSMutexPend_3:
\ 00000068 60039FE5 LDR R0,??OSMutexPend_4 ;; OSLockNesting
\ 0000006C 0000D0E5 LDRB R0,[R0, #+0]
\ 00000070 010050E3 CMP R0,#+1
\ 00000074 0200003A BCC ??OSMutexPend_5
430 *err = OS_ERR_PEND_LOCKED; /* ... can't PEND when locked */
\ 00000078 0D00A0E3 MOV R0,#+13
\ 0000007C 0000C5E5 STRB R0,[R5, #+0]
431 return;
\ 00000080 D00000EA B ??OSMutexPend_0
432 }
433 OS_ENTER_CRITICAL();
\ ??OSMutexPend_5:
\ 00000084 ........ _BLF OS_CPU_SR_Save,??OS_CPU_SR_Save??rA
\ 00000088 00B0B0E1 MOVS R11,R0
434 pip = (INT8U)(pevent->OSEventCnt >> 8); /* Get PIP from mutex */
\ 0000008C B800D4E1 LDRH R0,[R4, #+8]
\ 00000090 2004B0E1 LSRS R0,R0,#+8
\ 00000094 0060B0E1 MOVS R6,R0
435 /* Is Mutex available? */
436 if ((INT8U)(pevent->OSEventCnt & OS_MUTEX_KEEP_LOWER_8) == OS_MUTEX_AVAILABLE) {
\ 00000098 B800D4E1 LDRH R0,[R4, #+8]
\ 0000009C FF0010E2 ANDS R0,R0,#0xFF ;; Zero extend
\ 000000A0 FF0050E3 CMP R0,#+255
\ 000000A4 1B00001A BNE ??OSMutexPend_6
437 pevent->OSEventCnt &= OS_MUTEX_KEEP_UPPER_8; /* Yes, Acquire the resource */
\ 000000A8 B800D4E1 LDRH R0,[R4, #+8]
\ 000000AC FF0C10E2 ANDS R0,R0,#0xFF00
\ 000000B0 B800C4E1 STRH R0,[R4, #+8]
438 pevent->OSEventCnt |= OSTCBCur->OSTCBPrio; /* Save priority of owning task */
\ 000000B4 B800D4E1 LDRH R0,[R4, #+8]
\ 000000B8 ........ LDR R1,??DataTable44 ;; OSTCBCur
\ 000000BC 001091E5 LDR R1,[R1, #+0]
\ 000000C0 2E10D1E5 LDRB R1,[R1, #+46]
\ 000000C4 000091E1 ORRS R0,R1,R0
\ 000000C8 B800C4E1 STRH R0,[R4, #+8]
439 pevent->OSEventPtr = (void *)OSTCBCur; /* Point to owning task's OS_TCB */
\ 000000CC ........ LDR R0,??DataTable44 ;; OSTCBCur
\ 000000D0 000090E5 LDR R0,[R0, #+0]
\ 000000D4 040084E5 STR R0,[R4, #+4]
440 if (OSTCBCur->OSTCBPrio <= pip) { /* PIP 'must' have a SMALLER prio ... */
\ 000000D8 ........ LDR R0,??DataTable44 ;; OSTCBCur
\ 000000DC 000090E5 LDR R0,[R0, #+0]
\ 000000E0 2E00D0E5 LDRB R0,[R0, #+46]
\ 000000E4 FF6016E2 ANDS R6,R6,#0xFF ;; Zero extend
\ 000000E8 000056E1 CMP R6,R0
\ 000000EC 0400003A BCC ??OSMutexPend_7
441 OS_EXIT_CRITICAL(); /* ... than current task! */
\ 000000F0 0B00B0E1 MOVS R0,R11
\ 000000F4 ........ _BLF OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rA
442 *err = OS_ERR_PIP_LOWER;
\ 000000F8 7800A0E3 MOV R0,#+120
\ 000000FC 0000C5E5 STRB R0,[R5, #+0]
\ 00000100 B00000EA B ??OSMutexPend_0
443 } else {
444 OS_EXIT_CRITICAL();
\ ??OSMutexPend_7:
\ 00000104 0B00B0E1 MOVS R0,R11
\ 00000108 ........ _BLF OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rA
445 *err = OS_ERR_NONE;
\ 0000010C 0000A0E3 MOV R0,#+0
\ 00000110 0000C5E5 STRB R0,[R5, #+0]
\ 00000114 AB0000EA B ??OSMutexPend_0
446 }
447 return;
448 }
449 mprio = (INT8U)(pevent->OSEventCnt & OS_MUTEX_KEEP_LOWER_8); /* No, Get priority of mutex owner */
\ ??OSMutexPend_6:
\ 00000118 B810D4E1 LDRH R1,[R4, #+8]
\ 0000011C 0010CDE5 STRB R1,[SP, #+0]
450 ptcb = (OS_TCB *)(pevent->OSEventPtr); /* Point to TCB of mutex owner */
\ 00000120 040094E5 LDR R0,[R4, #+4]
\ 00000124 0080B0E1 MOVS R8,R0
451 if (ptcb->OSTCBPrio > pip) { /* Need to promote prio of owner?*/
\ 00000128 2E00D8E5 LDRB R0,[R8, #+46]
\ 0000012C FF6016E2 ANDS R6,R6,#0xFF ;; Zero extend
\ 00000130 000056E1 CMP R6,R0
\ 00000134 6F00002A BCS ??OSMutexPend_8
452 if (mprio > OSTCBCur->OSTCBPrio) {
\ 00000138 ........ LDR R0,??DataTable44 ;; OSTCBCur
\ 0000013C 000090E5 LDR R0,[R0, #+0]
\ 00000140 2E00D0E5 LDRB R0,[R0, #+46]
\ 00000144 0010DDE5 LDRB R1,[SP, #+0]
\ 00000148 010050E1 CMP R0,R1
\ 0000014C 6900002A BCS ??OSMutexPend_8
453 y = ptcb->OSTCBY;
\ 00000150 3000D8E5 LDRB R0,[R8, #+48]
\ 00000154 00A0B0E1 MOVS R10,R0
454 if ((OSRdyTbl[y] & ptcb->OSTCBBitX) != 0) { /* See if mutex owner is ready */
\ 00000158 0A00B0E1 MOVS R0,R10
\ 0000015C ........ LDR R1,??DataTable56 ;; OSRdyTbl
\ 00000160 0100D0E7 LDRB R0,[R0, +R1]
\ 00000164 3110D8E5 LDRB R1,[R8, #+49]
\ 00000168 000011E1 TST R1,R0
\ 0000016C 1500000A BEQ ??OSMutexPend_9
455 OSRdyTbl[y] &= ~ptcb->OSTCBBitX; /* Yes, Remove owner from Rdy ...*/
\ 00000170 0A00B0E1 MOVS R0,R10
\ 00000174 ........ LDR R1,??DataTable56 ;; OSRdyTbl
\ 00000178 0A20B0E1 MOVS R2,R10
\ 0000017C ........ LDR R3,??DataTable56 ;; OSRdyTbl
\ 00000180 0320D2E7 LDRB R2,[R2, +R3]
\ 00000184 3130D8E5 LDRB R3,[R8, #+49]
\ 00000188 0320D2E1 BICS R2,R2,R3
\ 0000018C 0120C0E7 STRB R2,[R0, +R1]
456 if (OSRdyTbl[y] == 0) { /* ... list at current prio */
\ 00000190 0A00B0E1 MOVS R0,R10
\ 00000194 ........ LDR R1,??DataTable56 ;; OSRdyTbl
\ 00000198 0100D0E7 LDRB R0,[R0, +R1]
\ 0000019C 000050E3 CMP R0,#+0
\ 000001A0 0500001A BNE ??OSMutexPend_10
457 OSRdyGrp &= ~ptcb->OSTCBBitY;
\ 000001A4 ........ LDR R0,??DataTable54 ;; OSRdyGrp
\ 000001A8 ........ LDR R1,??DataTable54 ;; OSRdyGrp
\ 000001AC 0010D1E5 LDRB R1,[R1, #+0]
\ 000001B0 3220D8E5 LDRB R2,[R8, #+50]
\ 000001B4 0210D1E1 BICS R1,R1,R2
\ 000001B8 0010C0E5 STRB R1,[R0, #+0]
458 }
459 rdy = OS_TRUE;
\ ??OSMutexPend_10:
\ 000001BC 0100A0E3 MOV R0,#+1
\ 000001C0 0070B0E1 MOVS R7,R0
\ 000001C4 140000EA B ??OSMutexPend_11
460 } else {
461 pevent2 = ptcb->OSTCBEventPtr;
\ ??OSMutexPend_9:
\ 000001C8 1C0098E5 LDR R0,[R8, #+28]
\ 000001CC 0090B0E1 MOVS R9,R0
462 if (pevent2 != (OS_EVENT *)0) { /* Remove from event wait list */
\ 000001D0 000059E3 CMP R9,#+0
\ 000001D4 0E00000A BEQ ??OSMutexPend_12
463 if ((pevent2->OSEventTbl[ptcb->OSTCBY] &= ~ptcb->OSTCBBitX) == 0) {
\ 000001D8 3000D8E5 LDRB R0,[R8, #+48]
\ 000001DC 090090E0 ADDS R0,R0,R9
\ 000001E0 0B00D0E5 LDRB R0,[R0, #+11]
\ 000001E4 3110D8E5 LDRB R1,[R8, #+49]
\ 000001E8 0100D0E1 BICS R0,R0,R1
\ 000001EC 3010D8E5 LDRB R1,[R8, #+48]
\ 000001F0 091091E0 ADDS R1,R1,R9
\ 000001F4 0B00C1E5 STRB R0,[R1, #+11]
\ 000001F8 FF0010E2 ANDS R0,R0,#0xFF ;; Zero extend
\ 000001FC 000050E3 CMP R0,#+0
\ 00000200 0300001A BNE ??OSMutexPend_12
464 pevent2->OSEventGrp &= ~ptcb->OSTCBBitY;
\ 00000204 0A00D9E5 LDRB R0,[R9, #+10]
\ 00000208 3210D8E5 LDRB R1,[R8, #+50]
\ 0000020C 0100D0E1 BICS R0,R0,R1
\ 00000210 0A00C9E5 STRB R0,[R9, #+10]
465 }
466 }
467 rdy = OS_FALSE; /* No */
\ ??OSMutexPend_12:
\ 00000214 0000A0E3 MOV R0,#+0
\ 00000218 0070B0E1 MOVS R7,R0
468 }
469 ptcb->OSTCBPrio = pip;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -