📄 os_mutex.txt
字号:
;;;416 if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
;;;417 *perr = OS_ERR_PEVENT_NULL;
;;;418 return;
;;;419 }
;;;420 #endif
;;;421 if (pevent->OSEventType != OS_EVENT_TYPE_MUTEX) { /* Validate event block type */
000368 e5d00000 LDRB r0,[r0,#0]
00036c e1a04002 MOV r4,r2 ;398
000370 e3a08001 MOV r8,#1
000374 e3500004 CMP r0,#4
;;;422 *perr = OS_ERR_EVENT_TYPE;
000378 15c48000 STRBNE r8,[r4,#0]
;;;423 return;
00037c 1a000083 BNE |L1.1424|
;;;424 }
;;;425 if (OSIntNesting > 0) { /* See if called from ISR ... */
000380 e59f03bc LDR r0,|L1.1860|
000384 e5d00000 LDRB r0,[r0,#0] ; OSIntNesting
000388 e3500000 CMP r0,#0
;;;426 *perr = OS_ERR_PEND_ISR; /* ... can't PEND from an ISR */
00038c 13a00002 MOVNE r0,#2
;;;427 return;
000390 1a00007d BNE |L1.1420|
;;;428 }
;;;429 if (OSLockNesting > 0) { /* See if called with scheduler locked ... */
000394 e59f03c0 LDR r0,|L1.1884|
000398 e5d00000 LDRB r0,[r0,#0] ; OSLockNesting
00039c e3500000 CMP r0,#0
;;;430 *perr = OS_ERR_PEND_LOCKED; /* ... can't PEND when locked */
0003a0 13a0000d MOVNE r0,#0xd
;;;431 return;
0003a4 1a000078 BNE |L1.1420|
;;;432 }
;;;433 OS_ENTER_CRITICAL();
0003a8 ebfffffe BL OS_CPU_SR_Save
0003ac e1a06000 MOV r6,r0
;;;434 pip = (INT8U)(pevent->OSEventCnt >> 8); /* Get PIP from mutex */
0003b0 e1d500b8 LDRH r0,[r5,#8]
;;;435 /* Is Mutex available? */
;;;436 if ((INT8U)(pevent->OSEventCnt & OS_MUTEX_KEEP_LOWER_8) == OS_MUTEX_AVAILABLE) {
0003b4 e59f738c LDR r7,|L1.1864|
0003b8 e3a09000 MOV r9,#0
0003bc e1e01000 MVN r1,r0
0003c0 e31100ff TST r1,#0xff
0003c4 e1a02420 LSR r2,r0,#8 ;434
0003c8 1a00000d BNE |L1.1028|
;;;437 pevent->OSEventCnt &= OS_MUTEX_KEEP_UPPER_8; /* Yes, Acquire the resource */
0003cc e2001cff AND r1,r0,#0xff00
0003d0 e1c510b8 STRH r1,[r5,#8]
;;;438 pevent->OSEventCnt |= OSTCBCur->OSTCBPrio; /* Save priority of owning task */
0003d4 e5970000 LDR r0,[r7,#0] ; OSTCBCur
0003d8 e5d0302e LDRB r3,[r0,#0x2e]
0003dc e1811003 ORR r1,r1,r3
0003e0 e1c510b8 STRH r1,[r5,#8]
;;;439 pevent->OSEventPtr = (void *)OSTCBCur; /* Point to owning task's OS_TCB */
0003e4 e5850004 STR r0,[r5,#4]
;;;440 if (OSTCBCur->OSTCBPrio <= pip) { /* PIP 'must' have a SMALLER prio ... */
0003e8 e5d0002e LDRB r0,[r0,#0x2e]
0003ec e1500002 CMP r0,r2
;;;441 OS_EXIT_CRITICAL(); /* ... than current task! */
0003f0 e1a00006 MOV r0,r6
;;;442 *perr = OS_ERR_PIP_LOWER;
;;;443 } else {
;;;444 OS_EXIT_CRITICAL();
;;;445 *perr = OS_ERR_NONE;
0003f4 8a000069 BHI |L1.1440|
0003f8 ebfffffe BL OS_CPU_SR_Restore
0003fc e3a00078 MOV r0,#0x78 ;442
000400 ea000061 B |L1.1420|
|L1.1028|
;;;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 */
000404 e5951004 LDR r1,[r5,#4]
000408 e20000ff AND r0,r0,#0xff ;449
;;;451 if (ptcb->OSTCBPrio > pip) { /* Need to promote prio of owner?*/
00040c e5d1302e LDRB r3,[r1,#0x2e]
000410 e1530002 CMP r3,r2
000414 9a000043 BLS |L1.1320|
;;;452 if (mprio > OSTCBCur->OSTCBPrio) {
000418 e5973000 LDR r3,[r7,#0] ; OSTCBCur
00041c e5d3302e LDRB r3,[r3,#0x2e]
000420 e1530000 CMP r3,r0
000424 2a00003f BCS |L1.1320|
;;;453 y = ptcb->OSTCBY;
000428 e5d1c030 LDRB r12,[r1,#0x30]
;;;454 if ((OSRdyTbl[y] & ptcb->OSTCBBitX) != 0) { /* See if mutex owner is ready */
00042c e59fa320 LDR r10,|L1.1876|
000430 e5d13031 LDRB r3,[r1,#0x31]
000434 e7da000c LDRB r0,[r10,r12]
000438 e59fb318 LDR r11,|L1.1880|
00043c e1100003 TST r0,r3
000440 0a000009 BEQ |L1.1132|
;;;455 OSRdyTbl[y] &= ~ptcb->OSTCBBitX; /* Yes, Remove owner from Rdy ...*/
000444 e1c00003 BIC r0,r0,r3
000448 e7ca000c STRB r0,[r10,r12]
;;;456 if (OSRdyTbl[y] == 0) { /* ... list at current prio */
00044c e7da000c LDRB r0,[r10,r12]
000450 e3500000 CMP r0,#0
;;;457 OSRdyGrp &= ~ptcb->OSTCBBitY;
000454 05d10032 LDRBEQ r0,[r1,#0x32]
000458 05db3000 LDRBEQ r3,[r11,#0] ; OSRdyGrp
00045c 01c30000 BICEQ r0,r3,r0
000460 05cb0000 STRBEQ r0,[r11,#0] ; OSRdyGrp
;;;458 }
;;;459 rdy = OS_TRUE;
000464 e3a00001 MOV r0,#1
000468 ea00000b B |L1.1180|
|L1.1132|
;;;460 } else {
;;;461 pevent2 = ptcb->OSTCBEventPtr;
00046c e591001c LDR r0,[r1,#0x1c]
;;;462 if (pevent2 != (OS_EVENT *)0) { /* Remove from event wait list */
000470 e3500000 CMP r0,#0
000474 0a000007 BEQ |L1.1176|
;;;463 if ((pevent2->OSEventTbl[ptcb->OSTCBY] &= ~ptcb->OSTCBBitX) == 0) {
000478 e08cc000 ADD r12,r12,r0
00047c e5dce00b LDRB lr,[r12,#0xb]
000480 e1de3003 BICS r3,lr,r3
000484 e5cc300b STRB r3,[r12,#0xb]
;;;464 pevent2->OSEventGrp &= ~ptcb->OSTCBBitY;
000488 05d0300a LDRBEQ r3,[r0,#0xa]
00048c 05d1c032 LDRBEQ r12,[r1,#0x32]
000490 01c3300c BICEQ r3,r3,r12
000494 05c0300a STRBEQ r3,[r0,#0xa]
|L1.1176|
;;;465 }
;;;466 }
;;;467 rdy = OS_FALSE; /* No */
000498 e3a00000 MOV r0,#0
|L1.1180|
;;;468 }
;;;469 ptcb->OSTCBPrio = pip; /* Change owner task prio to PIP */
;;;470 #if OS_LOWEST_PRIO <= 63
;;;471 ptcb->OSTCBY = (INT8U)( ptcb->OSTCBPrio >> 3);
00049c e20230ff AND r3,r2,#0xff
0004a0 e1a0c1a3 LSR r12,r3,#3
;;;472 ptcb->OSTCBX = (INT8U)( ptcb->OSTCBPrio & 0x07);
0004a4 e203e007 AND lr,r3,#7
0004a8 e5c1202e STRB r2,[r1,#0x2e] ;469
0004ac e5c1c030 STRB r12,[r1,#0x30] ;471
;;;473 ptcb->OSTCBBitY = (INT8U)(1 << ptcb->OSTCBY);
0004b0 e20c30ff AND r3,r12,#0xff
0004b4 e5c1e02f STRB lr,[r1,#0x2f] ;472
0004b8 e1a0c318 LSL r12,r8,r3
;;;474 ptcb->OSTCBBitX = (INT8U)(1 << ptcb->OSTCBX);
0004bc e1a0ee18 LSL lr,r8,lr
0004c0 e20cc0ff AND r12,r12,#0xff ;473
0004c4 e20ee0ff AND lr,lr,#0xff
0004c8 e5c1c032 STRB r12,[r1,#0x32] ;473
;;;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 ...*/
0004cc e3500001 CMP r0,#1
0004d0 e5c1e031 STRB lr,[r1,#0x31] ;474
;;;482 OSRdyGrp |= ptcb->OSTCBBitY; /* ... make it ready at new priority. */
0004d4 05db0000 LDRBEQ r0,[r11,#0] ; OSRdyGrp
0004d8 0180000c ORREQ r0,r0,r12
0004dc 05cb0000 STRBEQ r0,[r11,#0] ; OSRdyGrp
;;;483 OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
0004e0 07da0003 LDRBEQ r0,[r10,r3]
0004e4 0180000e ORREQ r0,r0,lr
0004e8 07ca0003 STRBEQ r0,[r10,r3]
0004ec 0a00000b BEQ |L1.1312|
;;;484 } else {
;;;485 pevent2 = ptcb->OSTCBEventPtr;
0004f0 e591001c LDR r0,[r1,#0x1c]
;;;486 if (pevent2 != (OS_EVENT *)0) { /* Add to event wait list */
0004f4 e3500000 CMP r0,#0
0004f8 0a000008 BEQ |L1.1312|
;;;487 pevent2->OSEventGrp |= ptcb->OSTCBBitY;
0004fc e5d0300a LDRB r3,[r0,#0xa]
000500 e183300c ORR r3,r3,r12
000504 e5c0300a STRB r3,[r0,#0xa]
;;;488 pevent2->OSEventTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
000508 e5d13030 LDRB r3,[r1,#0x30]
00050c e5d1c031 LDRB r12,[r1,#0x31]
000510 e0800003 ADD r0,r0,r3
000514 e5d0300b LDRB r3,[r0,#0xb]
000518 e183300c ORR r3,r3,r12
00051c e5c0300b STRB r3,[r0,#0xb]
|L1.1312|
;;;489 }
;;;490 }
;;;491 OSTCBPrioTbl[pip] = ptcb;
000520 e59f0224 LDR r0,|L1.1868|
000524 e7801102 STR r1,[r0,r2,LSL #2]
|L1.1320|
;;;492 }
;;;493 }
;;;494 OSTCBCur->OSTCBStat |= OS_STAT_MUTEX; /* Mutex not available, pend current task */
000528 e5970000 LDR r0,[r7,#0] ; OSTCBCur
00052c e5d0102c LDRB r1,[r0,#0x2c]
000530 e3811010 ORR r1,r1,#0x10
000534 e5c0102c STRB r1,[r0,#0x2c]
;;;495 OSTCBCur->OSTCBStatPend = OS_STAT_PEND_OK;
000538 e5c0902d STRB r9,[r0,#0x2d]
;;;496 OSTCBCur->OSTCBDly = timeout; /* Store timeout in current task's TCB */
00053c e59d1004 LDR r1,[sp,#4]
000540 e1c012ba STRH r1,[r0,#0x2a]
;;;497 OS_EventTaskWait(pevent); /* Suspend task until event or timeout occurs */
000544 e1a00005 MOV r0,r5
000548 ebfffffe BL OS_EventTaskWait
;;;498 OS_EXIT_CRITICAL();
00054c e1a00006 MOV r0,r6
000550 ebfffffe BL OS_CPU_SR_Restore
;;;499 OS_Sched(); /* Find next highest priority task ready */
000554 ebfffffe BL OS_Sched
;;;500 OS_ENTER_CRITICAL();
000558 ebfffffe BL OS_CPU_SR_Save
;;;501 if (OSTCBCur->OSTCBStatPend != OS_STAT_PEND_OK) { /* See if we timed out during the pend */
00055c e5971000 LDR r1,[r7,#0] ; OSTCBCur
000560 e1a08000 MOV r8,r0 ;500
000564 e5d1602d LDRB r6,[r1,#0x2d]
000568 e3560000 CMP r6,#0
00056c 0a000009 BEQ |L1.1432|
;;;502 pend_stat = OSTCBCur->OSTCBStatPend;
;;;503 OS_EventTOAbort(pevent);
000570 e1a00005 MOV r0,r5
000574 ebfffffe BL OS_EventTOAbort
;;;504 OS_EXIT_CRITICAL();
000578 e1a00008 MOV r0,r8
00057c ebfffffe BL OS_CPU_SR_Restore
;;;505 switch (pend_stat) {
000580 e3560002 CMP r6,#2
;;;506 case OS_STAT_PEND_TO:
;;;507 default:
;;;508 *perr = OS_ERR_TIMEOUT; /* Indicate that we didn't get mutex within TO */
;;;509 break;
;;;510
;;;511 case OS_STAT_PEND_ABORT:
;;;512 *perr = OS_ERR_PEND_ABORT; /* Indicate that we aborted getting mutex */
000584 03a0000e MOVEQ r0,#0xe
000588 13a0000a MOVNE r0,#0xa ;508
|L1.1420|
00058c e5c40000 STRB r0,[r4,#0]
|L1.1424|
;;;513 break;
;;;514 }
;;;515 return;
;;;516 }
;;;517 OSTCBCur->OSTCBEventPtr = (OS_EVENT *)0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -