📄 os_mutex.lst
字号:
\ 00000032 F0E7 B.N ??OSMutexPend_0
428 }
429 if (OSLockNesting > 0) { /* See if called with scheduler locked ... */
\ ??OSMutexPend_3:
\ 00000034 6C48 LDR.N R0,??OSMutexPend_4 ;; OSLockNesting
\ 00000036 0078 LDRB R0,[R0, #+0]
\ 00000038 0028 CMP R0,#+0
\ 0000003A 02D0 BEQ.N ??OSMutexPend_5
430 *perr = OS_ERR_PEND_LOCKED; /* ... can't PEND when locked */
\ 0000003C 0D20 MOVS R0,#+13
\ 0000003E 2870 STRB R0,[R5, #+0]
431 return;
\ 00000040 E9E7 B.N ??OSMutexPend_0
432 }
433 OS_ENTER_CRITICAL();
\ ??OSMutexPend_5:
\ 00000042 ........ _BLF OS_CPU_SR_Save,??OS_CPU_SR_Save??rT
\ 00000046 0600 MOVS R6,R0
434 pip = (INT8U)(pevent->OSEventCnt >> 8); /* Get PIP from mutex */
\ 00000048 2089 LDRH R0,[R4, #+8]
\ 0000004A 000A LSRS R0,R0,#+8
435 /* Is Mutex available? */
436 if ((INT8U)(pevent->OSEventCnt & OS_MUTEX_KEEP_LOWER_8) == OS_MUTEX_AVAILABLE) {
\ 0000004C .... LDR.N R1,??DataTable15 ;; OSTCBCur
\ 0000004E 8846 MOV R8,R1
\ 00000050 0021 MOVS R1,#+0
\ 00000052 8946 MOV R9,R1
\ 00000054 2189 LDRH R1,[R4, #+8]
\ 00000056 C9B2 UXTB R1,R1
\ 00000058 FF29 CMP R1,#+255
\ 0000005A 19D1 BNE.N ??OSMutexPend_6
437 pevent->OSEventCnt &= OS_MUTEX_KEEP_UPPER_8; /* Yes, Acquire the resource */
\ 0000005C 2189 LDRH R1,[R4, #+8]
\ 0000005E 11F47F41 ANDS R1,R1,#0xFF00
\ 00000062 2181 STRH R1,[R4, #+8]
438 pevent->OSEventCnt |= OSTCBCur->OSTCBPrio; /* Save priority of owning task */
\ 00000064 D8F80020 LDR R2,[R8, #+0]
\ 00000068 2E32 ADDS R2,R2,#+46
\ 0000006A 1278 LDRB R2,[R2, #+0]
\ 0000006C 0A43 ORRS R2,R2,R1
\ 0000006E 2281 STRH R2,[R4, #+8]
439 pevent->OSEventPtr = (void *)OSTCBCur; /* Point to owning task's OS_TCB */
\ 00000070 D8F80010 LDR R1,[R8, #+0]
\ 00000074 6160 STR R1,[R4, #+4]
440 if (OSTCBCur->OSTCBPrio <= pip) { /* PIP 'must' have a SMALLER prio ... */
\ 00000076 D8F80010 LDR R1,[R8, #+0]
\ 0000007A 2E31 ADDS R1,R1,#+46
\ 0000007C 0978 LDRB R1,[R1, #+0]
\ 0000007E 8842 CMP R0,R1
\ 00000080 C0F0AB80 BCC.W ??OSMutexPend_7
441 OS_EXIT_CRITICAL(); /* ... than current task! */
\ 00000084 3000 MOVS R0,R6
\ 00000086 ........ _BLF OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rT
442 *perr = OS_ERR_PIP_LOWER;
\ 0000008A 7820 MOVS R0,#+120
\ 0000008C 2870 STRB R0,[R5, #+0]
\ 0000008E C2E7 B.N ??OSMutexPend_0
443 } else {
444 OS_EXIT_CRITICAL();
445 *perr = OS_ERR_NONE;
446 }
447 return;
448 }
449 mprio = (INT8U)(pevent->OSEventCnt & OS_MUTEX_KEEP_LOWER_8); /* No, Get priority of mutex owner */
450 ptcb = (OS_TCB *)(pevent->OSEventPtr); /* Point to TCB of mutex owner */
\ ??OSMutexPend_6:
\ 00000090 6168 LDR R1,[R4, #+4]
\ 00000092 8A46 MOV R10,R1
451 if (ptcb->OSTCBPrio > pip) { /* Need to promote prio of owner?*/
\ 00000094 2E31 ADDS R1,R1,#+46
\ 00000096 0200 MOVS R2,R0
\ 00000098 0B78 LDRB R3,[R1, #+0]
\ 0000009A 9A42 CMP R2,R3
\ 0000009C 68D2 BCS.N ??OSMutexPend_8
452 if (mprio > OSTCBCur->OSTCBPrio) {
\ 0000009E D8F80020 LDR R2,[R8, #+0]
\ 000000A2 2E32 ADDS R2,R2,#+46
\ 000000A4 1278 LDRB R2,[R2, #+0]
\ 000000A6 2389 LDRH R3,[R4, #+8]
\ 000000A8 DBB2 UXTB R3,R3
\ 000000AA 9A42 CMP R2,R3
\ 000000AC 60D2 BCS.N ??OSMutexPend_8
453 y = ptcb->OSTCBY;
\ 000000AE 8A78 LDRB R2,[R1, #+2]
\ 000000B0 .... LDR.N R3,??DataTable18 ;; OSRdyTbl
\ 000000B2 9A18 ADDS R2,R3,R2
\ 000000B4 1378 LDRB R3,[R2, #+0]
\ 000000B6 .... LDR.N R7,??DataTable19 ;; OSRdyGrp
\ 000000B8 BB46 MOV R11,R7
\ 000000BA CF78 LDRB R7,[R1, #+3]
\ 000000BC 3B42 TST R3,R7
\ 000000BE 0AD0 BEQ.N ??OSMutexPend_9
454 if ((OSRdyTbl[y] & ptcb->OSTCBBitX) != 0) { /* See if mutex owner is ready */
455 OSRdyTbl[y] &= ~ptcb->OSTCBBitX; /* Yes, Remove owner from Rdy ...*/
\ 000000C0 BB43 BICS R3,R3,R7
\ 000000C2 1370 STRB R3,[R2, #+0]
456 if (OSRdyTbl[y] == 0) { /* ... list at current prio */
\ 000000C4 05D1 BNE.N ??OSMutexPend_10
457 OSRdyGrp &= ~ptcb->OSTCBBitY;
\ 000000C6 9BF80020 LDRB R2,[R11, #+0]
\ 000000CA 0B79 LDRB R3,[R1, #+4]
\ 000000CC 9A43 BICS R2,R2,R3
\ 000000CE 8BF80020 STRB R2,[R11, #+0]
458 }
459 rdy = OS_TRUE;
\ ??OSMutexPend_10:
\ 000000D2 0122 MOVS R2,#+1
\ 000000D4 17E0 B.N ??OSMutexPend_11
460 } else {
461 pevent2 = ptcb->OSTCBEventPtr;
\ ??OSMutexPend_9:
\ 000000D6 DAF81C20 LDR R2,[R10, #+28]
462 if (pevent2 != (OS_EVENT *)0) { /* Remove from event wait list */
\ 000000DA 002A CMP R2,#+0
\ 000000DC 12D0 BEQ.N ??OSMutexPend_12
463 if ((pevent2->OSEventTbl[ptcb->OSTCBY] &= ~ptcb->OSTCBBitX) == 0) {
\ 000000DE 8B78 LDRB R3,[R1, #+2]
\ 000000E0 D318 ADDS R3,R2,R3
\ 000000E2 9C46 MOV R12,R3
\ 000000E4 8B78 LDRB R3,[R1, #+2]
\ 000000E6 D318 ADDS R3,R2,R3
\ 000000E8 DF7A LDRB R7,[R3, #+11]
\ 000000EA CB78 LDRB R3,[R1, #+3]
\ 000000EC 9F43 BICS R7,R7,R3
\ 000000EE 6346 MOV R3,R12
\ 000000F0 DF72 STRB R7,[R3, #+11]
\ 000000F2 8B78 LDRB R3,[R1, #+2]
\ 000000F4 D318 ADDS R3,R2,R3
\ 000000F6 DB7A LDRB R3,[R3, #+11]
\ 000000F8 002B CMP R3,#+0
\ 000000FA 03D1 BNE.N ??OSMutexPend_12
464 pevent2->OSEventGrp &= ~ptcb->OSTCBBitY;
\ 000000FC 937A LDRB R3,[R2, #+10]
\ 000000FE 0F79 LDRB R7,[R1, #+4]
\ 00000100 BB43 BICS R3,R3,R7
\ 00000102 9372 STRB R3,[R2, #+10]
465 }
466 }
467 rdy = OS_FALSE; /* No */
\ ??OSMutexPend_12:
\ 00000104 4A46 MOV R2,R9
468 }
469 ptcb->OSTCBPrio = pip; /* Change owner task prio to PIP */
\ ??OSMutexPend_11:
\ 00000106 0300 MOVS R3,R0
\ 00000108 0B70 STRB R3,[R1, #+0]
470 #if OS_LOWEST_PRIO <= 63
471 ptcb->OSTCBY = (INT8U)( ptcb->OSTCBPrio >> 3);
\ 0000010A DB08 LSRS R3,R3,#+3
\ 0000010C 8B70 STRB R3,[R1, #+2]
472 ptcb->OSTCBX = (INT8U)( ptcb->OSTCBPrio & 0x07);
\ 0000010E 0346 MOV R3,R0
\ 00000110 5B07 LSLS R3,R3,#+29
\ 00000112 5B0F LSRS R3,R3,#+29
\ 00000114 4B70 STRB R3,[R1, #+1]
473 ptcb->OSTCBBitY = (INT8U)(1 << ptcb->OSTCBY);
\ 00000116 0123 MOVS R3,#+1
\ 00000118 8F78 LDRB R7,[R1, #+2]
\ 0000011A BB40 LSLS R3,R3,R7
\ 0000011C 0B71 STRB R3,[R1, #+4]
474 ptcb->OSTCBBitX = (INT8U)(1 << ptcb->OSTCBX);
\ 0000011E 0123 MOVS R3,#+1
\ 00000120 4F78 LDRB R7,[R1, #+1]
\ 00000122 BB40 LSLS R3,R3,R7
\ 00000124 CB70 STRB R3,[R1, #+3]
475 #else
476 ptcb->OSTCBY = (INT8U)((ptcb->OSTCBPrio >> 4) & 0xFF);
477 ptcb->OSTCBX = (INT8U)( ptcb->OSTCBPrio & 0x0F);
478 ptcb->OSTCBBitY = (INT16U)(1 << ptcb->OSTCBY);
479 ptcb->OSTCBBitX = (INT16U)(1 << ptcb->OSTCBX);
480 #endif
481 if (rdy == OS_TRUE) { /* If task was ready at owner's priority ...*/
\ 00000126 012A CMP R2,#+1
\ 00000128 0FD1 BNE.N ??OSMutexPend_13
482 OSRdyGrp |= ptcb->OSTCBBitY; /* ... make it ready at new priority. */
\ 0000012A 9BF80020 LDRB R2,[R11, #+0]
\ 0000012E 0B79 LDRB R3,[R1, #+4]
\ 00000130 1343 ORRS R3,R3,R2
\ 00000132 8BF80030 STRB R3,[R11, #+0]
483 OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
\ 00000136 8F78 LDRB R7,[R1, #+2]
\ 00000138 .... LDR.N R2,??DataTable18 ;; OSRdyTbl
\ 0000013A 9446 MOV R12,R2
\ 0000013C 3B46 MOV R3,R7
\ 0000013E D25C LDRB R2,[R2, R3]
\ 00000140 C978 LDRB R1,[R1, #+3]
\ 00000142 1143 ORRS R1,R1,R2
\ 00000144 6246 MOV R2,R12
\ 00000146 D155 STRB R1,[R2, R7]
\ 00000148 0FE0 B.N ??OSMutexPend_14
484 } else {
485 pevent2 = ptcb->OSTCBEventPtr;
\ ??OSMutexPend_13:
\ 0000014A DAF81C20 LDR R2,[R10, #+28]
486 if (pevent2 != (OS_EVENT *)0) { /* Add to event wait list */
\ 0000014E 002A CMP R2,#+0
\ 00000150 0BD0 BEQ.N ??OSMutexPend_14
487 pevent2->
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -