📄 os_mutex.txt
字号:
0002b6 2004 MOVS r0,#4
0002b8 7020 STRB r0,[r4,#0]
|L1.698|
0002ba b005 ADD sp,sp,#0x14
0002bc e8bde8bd POP {r4-r11,pc}
|L1.704|
;;;418 return;
;;;419 }
;;;420 #endif
;;;421 if (pevent->OSEventType != OS_EVENT_TYPE_MUTEX) { /* Validate event block type */
0002c0 7828 LDRB r0,[r5,#0]
0002c2 f04ff04f MOV r8,#1
0002c6 2804 CMP r0,#4
0002c8 d004 BEQ |L1.724|
;;;422 *perr = OS_ERR_EVENT_TYPE;
0002ca f884f884 STRB r8,[r4,#0]
0002ce b005 ADD sp,sp,#0x14
0002d0 e8bde8bd POP {r4-r11,pc}
|L1.724|
;;;423 return;
;;;424 }
;;;425 if (OSIntNesting > 0) { /* See if called from ISR ... */
0002d4 484c LDR r0,|L1.1032|
0002d6 7800 LDRB r0,[r0,#0] ; OSIntNesting
0002d8 b120 CBZ r0,|L1.740|
;;;426 *perr = OS_ERR_PEND_ISR; /* ... can't PEND from an ISR */
0002da 2002 MOVS r0,#2
0002dc 7020 STRB r0,[r4,#0]
0002de b005 ADD sp,sp,#0x14
0002e0 e8bde8bd POP {r4-r11,pc}
|L1.740|
;;;427 return;
;;;428 }
;;;429 if (OSLockNesting > 0) { /* See if called with scheduler locked ... */
0002e4 484e LDR r0,|L1.1056|
0002e6 7800 LDRB r0,[r0,#0] ; OSLockNesting
0002e8 b120 CBZ r0,|L1.756|
;;;430 *perr = OS_ERR_PEND_LOCKED; /* ... can't PEND when locked */
0002ea 200d MOVS r0,#0xd
0002ec 7020 STRB r0,[r4,#0]
0002ee b005 ADD sp,sp,#0x14
0002f0 e8bde8bd POP {r4-r11,pc}
|L1.756|
;;;431 return;
;;;432 }
;;;433 OS_ENTER_CRITICAL();
0002f4 f7fff7ff BL OS_CPU_SR_Save
0002f8 9001 STR r0,[sp,#4]
;;;434 pip = (INT8U)(pevent->OSEventCnt >> 8); /* Get PIP from mutex */
0002fa 8928 LDRH r0,[r5,#8]
0002fc 0a01 LSRS r1,r0,#8
;;;435 /* Is Mutex available? */
;;;436 if ((INT8U)(pevent->OSEventCnt & OS_MUTEX_KEEP_LOWER_8) == OS_MUTEX_AVAILABLE) {
0002fe 43c2 MVNS r2,r0
000300 4e42 LDR r6,|L1.1036|
000302 f012f012 TST r2,#0xff
000306 f04ff04f MOV r7,#0
00030a d11b BNE |L1.836|
;;;437 pevent->OSEventCnt &= OS_MUTEX_KEEP_UPPER_8; /* Yes, Acquire the resource */
00030c f400f400 AND r2,r0,#0xff00
000310 812a STRH r2,[r5,#8]
;;;438 pevent->OSEventCnt |= OSTCBCur->OSTCBPrio; /* Save priority of owning task */
000312 6830 LDR r0,[r6,#0] ; OSTCBCur
000314 f890f890 LDRB r3,[r0,#0x2e]
000318 431a ORRS r2,r2,r3
00031a 812a STRH r2,[r5,#8]
;;;439 pevent->OSEventPtr = (void *)OSTCBCur; /* Point to owning task's OS_TCB */
00031c 6068 STR r0,[r5,#4]
;;;440 if (OSTCBCur->OSTCBPrio <= pip) { /* PIP 'must' have a SMALLER prio ... */
00031e f890f890 LDRB r0,[r0,#0x2e]
000322 4288 CMP r0,r1
000324 d807 BHI |L1.822|
;;;441 OS_EXIT_CRITICAL(); /* ... than current task! */
000326 9801 LDR r0,[sp,#4]
000328 f7fff7ff BL OS_CPU_SR_Restore
;;;442 *perr = OS_ERR_PIP_LOWER;
00032c 2078 MOVS r0,#0x78
00032e 7020 STRB r0,[r4,#0]
000330 b005 ADD sp,sp,#0x14
000332 e8bde8bd POP {r4-r11,pc}
|L1.822|
;;;443 } else {
;;;444 OS_EXIT_CRITICAL();
000336 9801 LDR r0,[sp,#4]
000338 f7fff7ff BL OS_CPU_SR_Restore
;;;445 *perr = OS_ERR_NONE;
00033c 7027 STRB r7,[r4,#0]
00033e b005 ADD sp,sp,#0x14
000340 e8bde8bd POP {r4-r11,pc}
|L1.836|
;;;446 }
;;;447 return;
;;;448 }
;;;449 mprio = (INT8U)(pevent->OSEventCnt & OS_MUTEX_KEEP_LOWER_8); /* No, Get priority of mutex owner */
000344 b2c2 UXTB r2,r0
;;;450 ptcb = (OS_TCB *)(pevent->OSEventPtr); /* Point to TCB of mutex owner */
000346 6868 LDR r0,[r5,#4]
;;;451 if (ptcb->OSTCBPrio > pip) { /* Need to promote prio of owner?*/
000348 f890f890 LDRB r3,[r0,#0x2e]
00034c 428b CMP r3,r1
00034e d97f BLS |L1.1104|
;;;452 if (mprio > OSTCBCur->OSTCBPrio) {
000350 6833 LDR r3,[r6,#0] ; OSTCBCur
000352 f893f893 LDRB r3,[r3,#0x2e]
000356 4293 CMP r3,r2
000358 d27a BCS |L1.1104|
;;;453 y = ptcb->OSTCBY;
00035a f890f890 LDRB r3,[r0,#0x30]
;;;454 if ((OSRdyTbl[y] & ptcb->OSTCBBitX) != 0) { /* See if mutex owner is ready */
00035e f8dff8df LDR lr,|L1.1048|
000362 f890f890 LDRB r12,[r0,#0x31]
000366 f81ef81e LDRB r2,[lr,r3]
00036a f8dff8df LDR r9,|L1.1052|
00036e ea12ea12 TST r2,r12
000372 d010 BEQ |L1.918|
;;;455 OSRdyTbl[y] &= ~ptcb->OSTCBBitX; /* Yes, Remove owner from Rdy ...*/
000374 ea22ea22 BIC r2,r2,r12
000378 f80ef80e STRB r2,[lr,r3]
;;;456 if (OSRdyTbl[y] == 0) { /* ... list at current prio */
00037c f81ef81e LDRB r2,[lr,r3]
000380 b93a CBNZ r2,|L1.914|
;;;457 OSRdyGrp &= ~ptcb->OSTCBBitY;
000382 f890f890 LDRB r2,[r0,#0x32]
000386 f899f899 LDRB r3,[r9,#0] ; OSRdyGrp
00038a ea23ea23 BIC r2,r3,r2
00038e f889f889 STRB r2,[r9,#0] ; OSRdyGrp
|L1.914|
;;;458 }
;;;459 rdy = OS_TRUE;
000392 2201 MOVS r2,#1
000394 e011 B |L1.954|
|L1.918|
;;;460 } else {
;;;461 pevent2 = ptcb->OSTCBEventPtr;
000396 69c2 LDR r2,[r0,#0x1c]
;;;462 if (pevent2 != (OS_EVENT *)0) { /* Remove from event wait list */
000398 b172 CBZ r2,|L1.952|
;;;463 if ((pevent2->OSEventTbl[ptcb->OSTCBY] &= ~ptcb->OSTCBBitX) == 0) {
00039a f102f102 ADD r10,r2,#0xb
00039e f813f813 LDRB r11,[r3,r10]
0003a2 ea3bea3b BICS r12,r11,r12
0003a6 f803f803 STRB r12,[r3,r10]
0003aa d105 BNE |L1.952|
;;;464 pevent2->OSEventGrp &= ~ptcb->OSTCBBitY;
0003ac 7a93 LDRB r3,[r2,#0xa]
0003ae f890f890 LDRB r12,[r0,#0x32]
0003b2 ea23ea23 BIC r3,r3,r12
0003b6 7293 STRB r3,[r2,#0xa]
|L1.952|
;;;465 }
;;;466 }
;;;467 rdy = OS_FALSE; /* No */
0003b8 2200 MOVS r2,#0
|L1.954|
;;;468 }
;;;469 ptcb->OSTCBPrio = pip; /* Change owner task prio to PIP */
0003ba f880f880 STRB r1,[r0,#0x2e]
;;;470 #if OS_LOWEST_PRIO <= 63
;;;471 ptcb->OSTCBY = (INT8U)( ptcb->OSTCBPrio >> 3);
0003be f890f890 LDRB r3,[r0,#0x2e]
0003c2 ea4fea4f LSR r12,r3,#3
0003c6 f880f880 STRB r12,[r0,#0x30]
;;;472 ptcb->OSTCBX = (INT8U)( ptcb->OSTCBPrio & 0x07);
0003ca f003f003 AND r10,r3,#7
0003ce f880f880 STRB r10,[r0,#0x2f]
;;;473 ptcb->OSTCBBitY = (INT8U)(1 << ptcb->OSTCBY);
0003d2 f890f890 LDRB r12,[r0,#0x30]
0003d6 fa08fa08 LSL r3,r8,r12
0003da b2db UXTB r3,r3
0003dc f880f880 STRB r3,[r0,#0x32]
;;;474 ptcb->OSTCBBitX = (INT8U)(1 << ptcb->OSTCBX);
0003e0 fa08fa08 LSL r8,r8,r10
0003e4 f008f008 AND r8,r8,#0xff
0003e8 f880f880 STRB r8,[r0,#0x31]
;;;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 ...*/
0003ec 2a01 CMP r2,#1
0003ee d11a BNE |L1.1062|
;;;482 OSRdyGrp |= ptcb->OSTCBBitY; /* ... make it ready at new priority. */
0003f0 f899f899 LDRB r2,[r9,#0] ; OSRdyGrp
0003f4 431a ORRS r2,r2,r3
0003f6 f889f889 STRB r2,[r9,#0] ; OSRdyGrp
;;;483 OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
0003fa f81ef81e LDRB r2,[lr,r12]
0003fe ea42ea42 ORR r2,r2,r8
000402 f80ef80e STRB r2,[lr,r12]
000406 e020 B |L1.1098|
|L1.1032|
000408 00000000 DCD OSIntNesting
|L1.1036|
00040c 00000000 DCD OSTCBCur
|L1.1040|
000410 00000000 DCD OSTCBPrioTbl
|L1.1044|
000414 00000000 DCD OSEventFreeList
|L1.1048|
000418 00000000 DCD OSRdyTbl
|L1.1052|
00041c 00000000 DCD OSRdyGrp
|L1.1056|
000420 00000000 DCD OSLockNesting
000424 e014 B |L1.1104|
|L1.1062|
;;;484 } else {
;;;485 pevent2 = ptcb->OSTCBEventPtr;
000426 69c2 LDR r2,[r0,#0x1c]
;;;486 if (pevent2 != (OS_EVENT *)0) { /* Add to event wait list */
000428 b17a CBZ r2,|L1.1098|
;;;487 pevent2->OSEventGrp |= ptcb->OSTCBBitY;
00042a f892f892 LDRB r12,[r2,#0xa]
00042e ea4cea4c ORR r3,r12,r3
000432 7293 STRB r3,[r2,#0xa]
;;;488 pevent2->OSEventTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
000434 f890f890 LDRB r3,[r0,#0x30]
000438 320b ADDS r2,r2,#0xb
00043a f813f813 LDRB r12,[r3,r2]
00043e f890f890 LDRB lr,[r0,#0x31]
000442 ea4cea4c ORR r12,r12,lr
000446 f803f803 STRB r12,[r3,r2]
|L1.1098|
;;;489 }
;;;490 }
;;;491 OSTCBPrioTbl[pip] = ptcb;
00044a 4a63 LDR r2,|L1.1496|
00044c f842f842 STR r0,[r2,r1,LSL #2]
|L1.1104|
;;;492 }
;;;493 }
;;;494 OSTCBCur->OSTCBStat |= OS_STAT_MUTEX; /* Mutex not available, pend current task */
000450 6830 LDR r0,[r6,#0] ; OSTCBCur
000452 f890f890 LDRB r1,[r0,#0x2c]
000456 f041f041 ORR r1,r1,#0x10
00045a f880f880 STRB r1,[r0,#0x2c]
;;;495 OSTCBCur->OSTCBStatPend = OS_STAT_PEND_OK;
00045e f880f880 STRB r7,[r0,#0x2d]
;;;496 OSTCBCur->OSTCBDly = timeout; /* Store timeout in current task's TCB */
000462 9903 LDR r1,[sp,#0xc]
000464 8541 STRH r1,[r0,#0x2a]
;;;497 OS_EventTaskWait(pevent); /* Suspend task until event or timeout occurs */
000466 4628 MOV r0,r5
000468 f7fff7ff BL OS_EventTaskWait
;;;498 OS_EXIT_CRITICAL();
00046c 9801 LDR r0,[sp,#4]
00046e f7fff7ff BL OS_CPU_SR_Restore
;;;499 OS_Sched(); /* Find next highest priority task ready */
000472 f7fff7ff BL OS_Sched
;;;500 OS_ENTER_CRITICAL();
000476 f7fff7ff BL OS_CPU_SR_Save
00047a 4680 MOV r8,r0
;;;501 if (OSTCBCur->OSTCBStatPend != OS_STAT_PEND_OK) { /* See if we timed out during the pend */
00047c 6831 LDR r1,[r6,#0] ; OSTCBCur
00047e f891f891 LDRB r6,[r1,#0x2d]
000482 b18e CBZ r6,|L1.1192|
;;;502 pend_stat = OSTCBCur->OSTCBStatPend;
;;;503 OS_EventTOAbort(pevent);
000484 4628 MOV r0,r5
000486 f7fff7ff BL OS_EventTOAbort
;;;504 OS_EXIT_CRITICAL();
00048a 4640 MOV r0,r8
00048c f7fff7ff BL OS_CPU_SR_Restore
;;;505 switch (pend_stat) {
000490 2e02 CMP r6,#2
000492 d004 BEQ |L1.1182|
;;;506 case OS_STAT_PEND_TO:
;;;507 default:
;;;508 *perr = OS_ERR_TIMEOUT; /* Indicate that we didn't get mutex within TO */
000494 200a MOVS r0,#0xa
000496 7020 STRB r0,[r4,#0]
000498 b005 ADD sp,sp,#0x14
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -