📄 os_mutex.lst
字号:
406 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
407 OS_CPU_SR cpu_sr = 0;
\ 00000010 0070A0E3 MOV R7,#+0
408 #endif
409
410
411
412 #if OS_ARG_CHK_EN > 0
413 if (err == (INT8U *)0) { /* Validate 'err' */
\ 00000014 000056E3 CMP R6,#+0
\ 00000018 DC00000A BEQ ??OSMutexPend_0
414 return;
415 }
416 if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
\ 0000001C 000054E3 CMP R4,#+0
\ 00000020 0200001A BNE ??OSMutexPend_1
417 *err = OS_ERR_PEVENT_NULL;
\ 00000024 0400A0E3 MOV R0,#+4
\ 00000028 0000C6E5 STRB R0,[R6, #+0]
418 return;
\ 0000002C D70000EA B ??OSMutexPend_0
419 }
420 #endif
421 if (pevent->OSEventType != OS_EVENT_TYPE_MUTEX) { /* Validate event block type */
\ ??OSMutexPend_1:
\ 00000030 0000D4E5 LDRB R0,[R4, #+0]
\ 00000034 040050E3 CMP R0,#+4
\ 00000038 0200000A BEQ ??OSMutexPend_2
422 *err = OS_ERR_EVENT_TYPE;
\ 0000003C 0100A0E3 MOV R0,#+1
\ 00000040 0000C6E5 STRB R0,[R6, #+0]
423 return;
\ 00000044 D10000EA B ??OSMutexPend_0
424 }
425 if (OSIntNesting > 0) { /* See if called from ISR ... */
\ ??OSMutexPend_2:
\ 00000048 ........ LDR R0,??DataTable47 ;; OSIntNesting
\ 0000004C 0000D0E5 LDRB R0,[R0, #+0]
\ 00000050 010050E3 CMP R0,#+1
\ 00000054 0200003A BCC ??OSMutexPend_3
426 *err = OS_ERR_PEND_ISR; /* ... can't PEND from an ISR */
\ 00000058 0200A0E3 MOV R0,#+2
\ 0000005C 0000C6E5 STRB R0,[R6, #+0]
427 return;
\ 00000060 CA0000EA B ??OSMutexPend_0
428 }
429 if (OSLockNesting > 0) { /* See if called with scheduler locked ... */
\ ??OSMutexPend_3:
\ 00000064 28039FE5 LDR R0,??OSMutexPend_4 ;; OSLockNesting
\ 00000068 0000D0E5 LDRB R0,[R0, #+0]
\ 0000006C 010050E3 CMP R0,#+1
\ 00000070 0200003A BCC ??OSMutexPend_5
430 *err = OS_ERR_PEND_LOCKED; /* ... can't PEND when locked */
\ 00000074 0D00A0E3 MOV R0,#+13
\ 00000078 0000C6E5 STRB R0,[R6, #+0]
431 return;
\ 0000007C C30000EA B ??OSMutexPend_0
432 }
433 OS_ENTER_CRITICAL();
\ ??OSMutexPend_5:
\ 00000080 ........ _BLF OS_CPU_SR_Save,??OS_CPU_SR_Save??rA
\ 00000084 0070B0E1 MOVS R7,R0
434 pip = (INT8U)(pevent->OSEventCnt >> 8); /* Get PIP from mutex */
\ 00000088 B800D4E1 LDRH R0,[R4, #+8]
\ 0000008C 2004B0E1 LSRS R0,R0,#+8
435 /* Is Mutex available? */
436 if ((INT8U)(pevent->OSEventCnt & OS_MUTEX_KEEP_LOWER_8) == OS_MUTEX_AVAILABLE) {
\ 00000090 B810D4E1 LDRH R1,[R4, #+8]
\ 00000094 FF1011E2 ANDS R1,R1,#0xFF ;; Zero extend
\ 00000098 FF0051E3 CMP R1,#+255
\ 0000009C 1B00001A BNE ??OSMutexPend_6
437 pevent->OSEventCnt &= OS_MUTEX_KEEP_UPPER_8; /* Yes, Acquire the resource */
\ 000000A0 B810D4E1 LDRH R1,[R4, #+8]
\ 000000A4 FF1C11E2 ANDS R1,R1,#0xFF00
\ 000000A8 B810C4E1 STRH R1,[R4, #+8]
438 pevent->OSEventCnt |= OSTCBCur->OSTCBPrio; /* Save priority of owning task */
\ 000000AC B810D4E1 LDRH R1,[R4, #+8]
\ 000000B0 ........ LDR R2,??DataTable44 ;; OSTCBCur
\ 000000B4 002092E5 LDR R2,[R2, #+0]
\ 000000B8 2E20D2E5 LDRB R2,[R2, #+46]
\ 000000BC 011092E1 ORRS R1,R2,R1
\ 000000C0 B810C4E1 STRH R1,[R4, #+8]
439 pevent->OSEventPtr = (void *)OSTCBCur; /* Point to owning task's OS_TCB */
\ 000000C4 ........ LDR R1,??DataTable44 ;; OSTCBCur
\ 000000C8 001091E5 LDR R1,[R1, #+0]
\ 000000CC 041084E5 STR R1,[R4, #+4]
440 if (OSTCBCur->OSTCBPrio <= pip) { /* PIP 'must' have a SMALLER prio ... */
\ 000000D0 ........ LDR R1,??DataTable44 ;; OSTCBCur
\ 000000D4 001091E5 LDR R1,[R1, #+0]
\ 000000D8 2E10D1E5 LDRB R1,[R1, #+46]
\ 000000DC FF0010E2 ANDS R0,R0,#0xFF ;; Zero extend
\ 000000E0 010050E1 CMP R0,R1
\ 000000E4 0400003A BCC ??OSMutexPend_7
441 OS_EXIT_CRITICAL(); /* ... than current task! */
\ 000000E8 0700B0E1 MOVS R0,R7
\ 000000EC ........ _BLF OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rA
442 *err = OS_ERR_PIP_LOWER;
\ 000000F0 7800A0E3 MOV R0,#+120
\ 000000F4 0000C6E5 STRB R0,[R6, #+0]
\ 000000F8 A40000EA B ??OSMutexPend_0
443 } else {
444 OS_EXIT_CRITICAL();
\ ??OSMutexPend_7:
\ 000000FC 0700B0E1 MOVS R0,R7
\ 00000100 ........ _BLF OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rA
445 *err = OS_ERR_NONE;
\ 00000104 0000A0E3 MOV R0,#+0
\ 00000108 0000C6E5 STRB R0,[R6, #+0]
\ 0000010C 9F0000EA 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:
\ 00000110 B820D4E1 LDRH R2,[R4, #+8]
450 ptcb = (OS_TCB *)(pevent->OSEventPtr); /* Point to TCB of mutex owner */
\ 00000114 041094E5 LDR R1,[R4, #+4]
451 if (ptcb->OSTCBPrio > pip) { /* Need to promote prio of owner?*/
\ 00000118 2E30D1E5 LDRB R3,[R1, #+46]
\ 0000011C FF0010E2 ANDS R0,R0,#0xFF ;; Zero extend
\ 00000120 030050E1 CMP R0,R3
\ 00000124 6800002A BCS ??OSMutexPend_8
452 if (mprio > OSTCBCur->OSTCBPrio) {
\ 00000128 ........ LDR R3,??DataTable44 ;; OSTCBCur
\ 0000012C 003093E5 LDR R3,[R3, #+0]
\ 00000130 2E30D3E5 LDRB R3,[R3, #+46]
\ 00000134 FF2012E2 ANDS R2,R2,#0xFF ;; Zero extend
\ 00000138 020053E1 CMP R3,R2
\ 0000013C 6200002A BCS ??OSMutexPend_8
453 y = ptcb->OSTCBY;
\ 00000140 3020D1E5 LDRB R2,[R1, #+48]
454 if ((OSRdyTbl[y] & ptcb->OSTCBBitX) != 0) { /* See if mutex owner is ready */
\ 00000144 0230B0E1 MOVS R3,R2
\ 00000148 ........ LDR R12,??DataTable56 ;; OSRdyTbl
\ 0000014C 0C30D3E7 LDRB R3,[R3, +R12]
\ 00000150 31C0D1E5 LDRB R12,[R1, #+49]
\ 00000154 03001CE1 TST R12,R3
\ 00000158 1300000A BEQ ??OSMutexPend_9
455 OSRdyTbl[y] &= ~ptcb->OSTCBBitX; /* Yes, Remove owner from Rdy ...*/
\ 0000015C 0230B0E1 MOVS R3,R2
\ 00000160 ........ LDR R12,??DataTable56 ;; OSRdyTbl
\ 00000164 02E0B0E1 MOVS LR,R2
\ 00000168 ........ LDR R8,??DataTable56 ;; OSRdyTbl
\ 0000016C 0880DEE7 LDRB R8,[LR, +R8]
\ 00000170 31E0D1E5 LDRB LR,[R1, #+49]
\ 00000174 0E80D8E1 BICS R8,R8,LR
\ 00000178 0C80C3E7 STRB R8,[R3, +R12]
456 if (OSRdyTbl[y] == 0) { /* ... list at current prio */
\ 0000017C ........ LDR R3,??DataTable56 ;; OSRdyTbl
\ 00000180 0320D2E7 LDRB R2,[R2, +R3]
\ 00000184 000052E3 CMP R2,#+0
\ 00000188 0500001A BNE ??OSMutexPend_10
457 OSRdyGrp &= ~ptcb->OSTCBBitY;
\ 0000018C ........ LDR R2,??DataTable54 ;; OSRdyGrp
\ 00000190 ........ LDR R3,??DataTable54 ;; OSRdyGrp
\ 00000194 0030D3E5 LDRB R3,[R3, #+0]
\ 00000198 3280D1E5 LDRB R8,[R1, #+50]
\ 0000019C 0830D3E1 BICS R3,R3,R8
\ 000001A0 0030C2E5 STRB R3,[R2, #+0]
458 }
459 rdy = OS_TRUE;
\ ??OSMutexPend_10:
\ 000001A4 0120A0E3 MOV R2,#+1
\ 000001A8 120000EA B ??OSMutexPend_11
460 } else {
461 pevent2 = ptcb->OSTCBEventPtr;
\ ??OSMutexPend_9:
\ 000001AC 1C2091E5 LDR R2,[R1, #+28]
462 if (pevent2 != (OS_EVENT *)0) { /* Remove from event wait list */
\ 000001B0 000052E3 CMP R2,#+0
\ 000001B4 0E00000A BEQ ??OSMutexPend_12
463 if ((pevent2->OSEventTbl[ptcb->OSTCBY] &= ~ptcb->OSTCBBitX) == 0) {
\ 000001B8 3030D1E5 LDRB R3,[R1, #+48]
\ 000001BC 023093E0 ADDS R3,R3,R2
\ 000001C0 0B30D3E5 LDRB R3,[R3, #+11]
\ 000001C4 3180D1E5 LDRB R8,[R1, #+49]
\ 000001C8 0830D3E1 BICS R3,R3,R8
\ 000001CC 3080D1E5 LDRB R8,[R1, #+48]
\ 000001D0 028098E0 ADDS R8,R8,R2
\ 000001D4 0B30C8E5 STRB R3,[R8, #+11]
\ 000001D8 FF3013E2 ANDS R3,R3,#0xFF ;; Zero extend
\ 000001DC 000053E3 CMP R3,#+0
\ 000001E0 0300001A BNE ??OSMutexPend_12
464 pevent2->OSEventGrp &= ~ptcb->OSTCBBitY;
\ 000001E4 0A30D2E5 LDRB R3,[R2, #+10]
\ 000001E8 3280D1E5 LDRB R8,[R1, #+50]
\ 000001EC 0830D3E1 BICS R3,R3,R8
\ 000001F0 0A30C2E5 STRB R3,[R2, #+10]
465 }
466 }
467 rdy = OS_FALSE; /* No */
\ ??OSMutexPend_12:
\ 000001F4 0020A0E3 MOV R2,#+0
468 }
469 ptcb->OSTCBPrio = pip; /* Change owner task prio to PIP */
\ ??OSM
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -