📄 os_mutex.lst
字号:
438 {
\ OSMutexPend:
\ 00000000 2DE9F24F PUSH {R1,R4-R11,LR}
\ 00000004 82B0 SUB SP,SP,#+8
\ 00000006 0400 MOVS R4,R0
\ 00000008 1500 MOVS R5,R2
439 INT8U pcp; /* Priority Ceiling Priority (PCP) */
440 INT8U mprio; /* Mutex owner priority */
441 BOOLEAN rdy; /* Flag indicating task was ready */
442 OS_TCB *ptcb;
443 OS_EVENT *pevent2;
444 INT8U y;
445 #if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */
446 OS_CPU_SR cpu_sr = 0u;
\ 0000000A 5FF0000B MOVS R11,#+0
447 #endif
448
449
450
451 #ifdef OS_SAFETY_CRITICAL
452 if (perr == (INT8U *)0) {
453 OS_SAFETY_CRITICAL_EXCEPTION();
454 return;
455 }
456 #endif
457
458 #if OS_ARG_CHK_EN > 0u
459 if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
460 *perr = OS_ERR_PEVENT_NULL;
461 return;
462 }
463 #endif
464 if (pevent->OSEventType != OS_EVENT_TYPE_MUTEX) { /* Validate event block type */
\ 0000000E 2078 LDRB R0,[R4, #+0]
\ 00000010 0428 CMP R0,#+4
\ 00000012 02D0 BEQ.N ??OSMutexPend_0
465 *perr = OS_ERR_EVENT_TYPE;
\ 00000014 0120 MOVS R0,#+1
\ 00000016 2870 STRB R0,[R5, #+0]
466 return;
\ 00000018 49E1 B.N ??OSMutexPend_1
467 }
468 if (OSIntNesting > 0u) { /* See if called from ISR ... */
\ ??OSMutexPend_0:
\ 0000001A ........ LDR.W R0,??DataTable7
\ 0000001E 0078 LDRB R0,[R0, #+0]
\ 00000020 0028 CMP R0,#+0
\ 00000022 02D0 BEQ.N ??OSMutexPend_2
469 *perr = OS_ERR_PEND_ISR; /* ... can't PEND from an ISR */
\ 00000024 0220 MOVS R0,#+2
\ 00000026 2870 STRB R0,[R5, #+0]
470 return;
\ 00000028 41E1 B.N ??OSMutexPend_1
471 }
472 if (OSLockNesting > 0u) { /* See if called with scheduler locked ... */
\ ??OSMutexPend_2:
\ 0000002A ........ LDR.W R0,??DataTable7_4
\ 0000002E 0078 LDRB R0,[R0, #+0]
\ 00000030 0028 CMP R0,#+0
\ 00000032 02D0 BEQ.N ??OSMutexPend_3
473 *perr = OS_ERR_PEND_LOCKED; /* ... can't PEND when locked */
\ 00000034 0D20 MOVS R0,#+13
\ 00000036 2870 STRB R0,[R5, #+0]
474 return;
\ 00000038 39E1 B.N ??OSMutexPend_1
475 }
476 /*$PAGE*/
477 OS_ENTER_CRITICAL();
\ ??OSMutexPend_3:
\ 0000003A ........ BL OS_CPU_SR_Save
\ 0000003E 8346 MOV R11,R0
478 pcp = (INT8U)(pevent->OSEventCnt >> 8u); /* Get PCP from mutex */
\ 00000040 2089 LDRH R0,[R4, #+8]
\ 00000042 80B2 UXTH R0,R0 ;; ZeroExt R0,R0,#+16,#+16
\ 00000044 000A LSRS R0,R0,#+8
\ 00000046 0600 MOVS R6,R0
479 /* Is Mutex available? */
480 if ((INT8U)(pevent->OSEventCnt & OS_MUTEX_KEEP_LOWER_8) == OS_MUTEX_AVAILABLE) {
\ 00000048 2089 LDRH R0,[R4, #+8]
\ 0000004A C0B2 UXTB R0,R0 ;; ZeroExt R0,R0,#+24,#+24
\ 0000004C FF28 CMP R0,#+255
\ 0000004E 26D1 BNE.N ??OSMutexPend_4
481 pevent->OSEventCnt &= OS_MUTEX_KEEP_UPPER_8; /* Yes, Acquire the resource */
\ 00000050 2089 LDRH R0,[R4, #+8]
\ 00000052 10F47F40 ANDS R0,R0,#0xFF00
\ 00000056 2081 STRH R0,[R4, #+8]
482 pevent->OSEventCnt |= OSTCBCur->OSTCBPrio; /* Save priority of owning task */
\ 00000058 2089 LDRH R0,[R4, #+8]
\ 0000005A ........ LDR.W R1,??DataTable7_1
\ 0000005E 0968 LDR R1,[R1, #+0]
\ 00000060 91F83610 LDRB R1,[R1, #+54]
\ 00000064 0843 ORRS R0,R1,R0
\ 00000066 2081 STRH R0,[R4, #+8]
483 pevent->OSEventPtr = (void *)OSTCBCur; /* Point to owning task's OS_TCB */
\ 00000068 ........ LDR.W R0,??DataTable7_1
\ 0000006C 0068 LDR R0,[R0, #+0]
\ 0000006E 6060 STR R0,[R4, #+4]
484 if ((pcp != OS_PRIO_MUTEX_CEIL_DIS) &&
485 (OSTCBCur->OSTCBPrio <= pcp)) { /* PCP 'must' have a SMALLER prio ... */
\ 00000070 F6B2 UXTB R6,R6 ;; ZeroExt R6,R6,#+24,#+24
\ 00000072 FF2E CMP R6,#+255
\ 00000074 0DD0 BEQ.N ??OSMutexPend_5
\ 00000076 ........ LDR.W R0,??DataTable7_1
\ 0000007A 0068 LDR R0,[R0, #+0]
\ 0000007C 90F83600 LDRB R0,[R0, #+54]
\ 00000080 F6B2 UXTB R6,R6 ;; ZeroExt R6,R6,#+24,#+24
\ 00000082 8642 CMP R6,R0
\ 00000084 05D3 BCC.N ??OSMutexPend_5
486 OS_EXIT_CRITICAL(); /* ... than current task! */
\ 00000086 5846 MOV R0,R11
\ 00000088 ........ BL OS_CPU_SR_Restore
487 *perr = OS_ERR_PCP_LOWER;
\ 0000008C 7820 MOVS R0,#+120
\ 0000008E 2870 STRB R0,[R5, #+0]
\ 00000090 04E0 B.N ??OSMutexPend_6
488 } else {
489 OS_EXIT_CRITICAL();
\ ??OSMutexPend_5:
\ 00000092 5846 MOV R0,R11
\ 00000094 ........ BL OS_CPU_SR_Restore
490 *perr = OS_ERR_NONE;
\ 00000098 0020 MOVS R0,#+0
\ 0000009A 2870 STRB R0,[R5, #+0]
491 }
492 return;
\ ??OSMutexPend_6:
\ 0000009C 07E1 B.N ??OSMutexPend_1
493 }
494 if (pcp != OS_PRIO_MUTEX_CEIL_DIS) {
\ ??OSMutexPend_4:
\ 0000009E F6B2 UXTB R6,R6 ;; ZeroExt R6,R6,#+24,#+24
\ 000000A0 FF2E CMP R6,#+255
\ 000000A2 00F0BB80 BEQ.W ??OSMutexPend_7
495 mprio = (INT8U)(pevent->OSEventCnt & OS_MUTEX_KEEP_LOWER_8); /* Get priority of mutex owner */
\ 000000A6 2089 LDRH R0,[R4, #+8]
\ 000000A8 8DF80000 STRB R0,[SP, #+0]
496 ptcb = (OS_TCB *)(pevent->OSEventPtr); /* Point to TCB of mutex owner */
\ 000000AC 6068 LDR R0,[R4, #+4]
\ 000000AE 8046 MOV R8,R0
497 if (ptcb->OSTCBPrio > pcp) { /* Need to promote prio of owner?*/
\ 000000B0 98F83600 LDRB R0,[R8, #+54]
\ 000000B4 F6B2 UXTB R6,R6 ;; ZeroExt R6,R6,#+24,#+24
\ 000000B6 8642 CMP R6,R0
\ 000000B8 80F0B080 BCS.W ??OSMutexPend_7
498 if (mprio > OSTCBCur->OSTCBPrio) {
\ 000000BC ........ LDR.W R0,??DataTable7_1
\ 000000C0 0068 LDR R0,[R0, #+0]
\ 000000C2 90F83600 LDRB R0,[R0, #+54]
\ 000000C6 9DF80010 LDRB R1,[SP, #+0]
\ 000000CA 8842 CMP R0,R1
\ 000000CC 80F0A680 BCS.W ??OSMutexPend_7
499 y = ptcb->OSTCBY;
\ 000000D0 98F83800 LDRB R0,[R8, #+56]
\ 000000D4 8246 MOV R10,R0
500 if ((OSRdyTbl[y] & ptcb->OSTCBBitX) != 0u) { /* See if mutex owner is ready */
\ 000000D6 5FFA8AFA UXTB R10,R10 ;; ZeroExt R10,R10,#+24,#+24
\ 000000DA ........ LDR.W R0,??DataTable7_5
\ 000000DE 1AF80000 LDRB R0,[R10, R0]
\ 000000E2 98F83910 LDRB R1,[R8, #+57]
\ 000000E6 0840 ANDS R0,R1,R0
\ 000000E8 C0B2 UXTB R0,R0 ;; ZeroExt R0,R0,#+24,#+24
\ 000000EA 0028 CMP R0,#+0
\ 000000EC 22D0 BEQ.N ??OSMutexPend_8
501 OSRdyTbl[y] &= (OS_PRIO)~ptcb->OSTCBBitX; /* Yes, Remove owner from Rdy ...*/
\ 000000EE 5FFA8AFA UXTB R10,R10 ;; ZeroExt R10,R10,#+24,#+24
\ 000000F2 ........ LDR.W R0,??DataTable7_5
\ 000000F6 1AF80000 LDRB R0,[R10, R0]
\ 000000FA 98F83910 LDRB R1,[R8, #+57]
\ 000000FE 8843 BICS R0,R0,R1
\ 00000100 5FFA8AFA UXTB R10,R10 ;; ZeroExt R10,R10,#+24,#+24
\ 00000104 ........ LDR.W R1,??DataTable7_5
\ 00000108 0AF80100 STRB R0,[R10, R1]
502 if (OSRdyTbl[y] == 0u) { /* ... list at current prio */
\ 0000010C 5FFA8AFA UXTB R10,R10 ;; ZeroExt R10,R10,#+24,#+24
\ 00000110 ........ LDR.W R0,??DataTable7_5
\ 00000114 1AF80000 LDRB R0,[R10, R0]
\ 00000118 0028 CMP R0,#+0
\ 0000011A 08D1 BNE.N ??OSMutexPend_9
503 OSRdyGrp &= (OS_PRIO)~ptcb->OSTCBBitY;
\ 0000011C ........ LDR.W R0,??DataTable7_6
\ 00000120 0078 LDRB R0,[R0, #+0]
\ 00000122 98F83A10 LDRB R1,[R8, #+58]
\ 00000126 8843 BICS R0,R0,R1
\ 00000128 ........ LDR.W R1,??DataTable7_6
\ 0000012C 0870 STRB R0,[R1, #+0]
504 }
505 rdy = OS_TRUE;
\ ??OSMutexPend_9:
\ 0000012E 0120 MOVS R0,#+1
\ 00000130 0700 MOVS R7,R0
\ 00000132 25E0 B.N ??OSMutexPend_10
506 } else {
507 pevent2 = ptcb->OSTCBEventPtr;
\ ??OSMutexPend_8:
\ 00000134 D8F81C00 LDR R0,[R8, #+28]
\ 00000138 8146 MOV R9,R0
508 if (pevent2 != (OS_EVENT *)0) { /* Remove from event wait list */
\ 0000013A B9F1000F CMP R9,#+0
\ 0000013E 1DD0 BEQ.N ??OSMutexPend_11
509 y = ptcb->OSTCBY;
\
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -