📄 os_mutex.txt
字号:
000410 e59d0000 LDR r0,[sp,#0]
000414 ebfffffe BL OS_CPU_SR_Restore
000418 e3a00000 MOV r0,#0
00041c e5c60000 STRB r0,[r6,#0]
000420 e3a08000 MOV r8,#0
000424 ea000004 B |L1.1084|
|L1.1064|
000428 e59d0000 LDR r0,[sp,#0]
00042c ebfffffe BL OS_CPU_SR_Restore
000430 e3a00049 MOV r0,#0x49
000434 e5c60000 STRB r0,[r6,#0]
000438 e1a08004 MOV r8,r4
|L1.1084|
00043c ea000037 B |L1.1312|
|L1.1088|
000440 e1a00000 MOV r0,r0
000444 e1d400b8 LDRH r0,[r4,#8]
000448 e1a09440 ASR r9,r0,#8
00044c e1d400b8 LDRH r0,[r4,#8]
000450 e200a0ff AND r10,r0,#0xff
000454 e594b004 LDR r11,[r4,#4]
000458 e35b0000 CMP r11,#0
00045c 0a000005 BEQ |L1.1144|
000460 e5db002e LDRB r0,[r11,#0x2e]
000464 e1500009 CMP r0,r9
000468 1a000002 BNE |L1.1144|
00046c e1a0100a MOV r1,r10
000470 e1a0000b MOV r0,r11
000474 ebfffffe BL OSMutex_RdyAtPrio
|L1.1144|
000478 ea000004 B |L1.1168|
|L1.1148|
00047c e3a03000 MOV r3,#0
000480 e3a02010 MOV r2,#0x10
000484 e1a01003 MOV r1,r3
000488 e1a00004 MOV r0,r4
00048c ebfffffe BL OS_EventTaskRdy
|L1.1168|
000490 e5d4000a LDRB r0,[r4,#0xa]
000494 e3500000 CMP r0,#0
000498 1afffff7 BNE |L1.1148|
00049c e3a0003f MOV r0,#0x3f
0004a0 e5c4000f STRB r0,[r4,#0xf]
0004a4 e3a00000 MOV r0,#0
0004a8 e5c40010 STRB r0,[r4,#0x10]
0004ac e1d400b8 LDRH r0,[r4,#8]
0004b0 e1a09440 ASR r9,r0,#8
0004b4 e3a00000 MOV r0,#0
0004b8 e59f16c0 LDR r1,|L1.2944|
0004bc e7810109 STR r0,[r1,r9,LSL #2]
0004c0 e5c40000 STRB r0,[r4,#0]
0004c4 e59f06b8 LDR r0,|L1.2948|
0004c8 e5900000 LDR r0,[r0,#0] ; OSEventFreeList
0004cc e5840004 STR r0,[r4,#4]
0004d0 e3a00000 MOV r0,#0
0004d4 e1c400b8 STRH r0,[r4,#8]
0004d8 e59f06a4 LDR r0,|L1.2948|
0004dc e5804000 STR r4,[r0,#0] ; OSEventFreeList
0004e0 e59d0000 LDR r0,[sp,#0]
0004e4 ebfffffe BL OS_CPU_SR_Restore
0004e8 e3570001 CMP r7,#1
0004ec 1a000000 BNE |L1.1268|
0004f0 ebfffffe BL OS_Sched
|L1.1268|
0004f4 e3a00000 MOV r0,#0
0004f8 e5c60000 STRB r0,[r6,#0]
0004fc e3a08000 MOV r8,#0
000500 ea000006 B |L1.1312|
|L1.1284|
000504 e1a00000 MOV r0,r0
000508 e59d0000 LDR r0,[sp,#0]
00050c ebfffffe BL OS_CPU_SR_Restore
000510 e3a00007 MOV r0,#7
000514 e5c60000 STRB r0,[r6,#0]
000518 e1a08004 MOV r8,r4
00051c e1a00000 MOV r0,r0
|L1.1312|
000520 e1a00000 MOV r0,r0
000524 e1a00008 MOV r0,r8
000528 eaffff80 B |L1.816|
ENDP
OSMutexPend PROC
;;;397 void OSMutexPend (OS_EVENT *pevent, INT16U timeout, INT8U *err)
;;;398 {
00052c e92d4ffe PUSH {r1-r11,lr}
000530 e1a04000 MOV r4,r0
000534 e1a05001 MOV r5,r1
000538 e1a06002 MOV r6,r2
;;;399 INT8U pip; /* Priority Inheritance Priority (PIP) */
;;;400 INT8U mprio; /* Mutex owner priority */
;;;401 BOOLEAN rdy; /* Flag indicating task was ready */
;;;402 OS_TCB *ptcb;
;;;403 OS_EVENT *pevent2;
;;;404 INT8U y;
;;;405 INT8U pend_stat;
;;;406 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;407 OS_CPU_SR cpu_sr = 0;
00053c e3a00000 MOV r0,#0
000540 e58d0000 STR r0,[sp,#0]
;;;408 #endif
;;;409
;;;410
;;;411
;;;412 #if OS_ARG_CHK_EN > 0
;;;413 if (err == (INT8U *)0) { /* Validate 'err' */
000544 e3560000 CMP r6,#0
000548 1a000001 BNE |L1.1364|
|L1.1356|
;;;414 return;
;;;415 }
;;;416 if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
;;;417 *err = OS_ERR_PEVENT_NULL;
;;;418 return;
;;;419 }
;;;420 #endif
;;;421 if (pevent->OSEventType != OS_EVENT_TYPE_MUTEX) { /* Validate event block type */
;;;422 *err = OS_ERR_EVENT_TYPE;
;;;423 return;
;;;424 }
;;;425 if (OSIntNesting > 0) { /* See if called from ISR ... */
;;;426 *err = OS_ERR_PEND_ISR; /* ... can't PEND from an ISR */
;;;427 return;
;;;428 }
;;;429 if (OSLockNesting > 0) { /* See if called with scheduler locked ... */
;;;430 *err = OS_ERR_PEND_LOCKED; /* ... can't PEND when locked */
;;;431 return;
;;;432 }
;;;433 OS_ENTER_CRITICAL();
;;;434 pip = (INT8U)(pevent->OSEventCnt >> 8); /* Get PIP from mutex */
;;;435 /* Is Mutex available? */
;;;436 if ((INT8U)(pevent->OSEventCnt & OS_MUTEX_KEEP_LOWER_8) == OS_MUTEX_AVAILABLE) {
;;;437 pevent->OSEventCnt &= OS_MUTEX_KEEP_UPPER_8; /* Yes, Acquire the resource */
;;;438 pevent->OSEventCnt |= OSTCBCur->OSTCBPrio; /* Save priority of owning task */
;;;439 pevent->OSEventPtr = (void *)OSTCBCur; /* Point to owning task's OS_TCB */
;;;440 if (OSTCBCur->OSTCBPrio <= pip) { /* PIP 'must' have a SMALLER prio ... */
;;;441 OS_EXIT_CRITICAL(); /* ... than current task! */
;;;442 *err = OS_ERR_PIP_LOWER;
;;;443 } else {
;;;444 OS_EXIT_CRITICAL();
;;;445 *err = 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 */
;;;451 if (ptcb->OSTCBPrio > pip) { /* Need to promote prio of owner?*/
;;;452 if (mprio > OSTCBCur->OSTCBPrio) {
;;;453 y = ptcb->OSTCBY;
;;;454 if ((OSRdyTbl[y] & ptcb->OSTCBBitX) != 0) { /* See if mutex owner is ready */
;;;455 OSRdyTbl[y] &= ~ptcb->OSTCBBitX; /* Yes, Remove owner from Rdy ...*/
;;;456 if (OSRdyTbl[y] == 0) { /* ... list at current prio */
;;;457 OSRdyGrp &= ~ptcb->OSTCBBitY;
;;;458 }
;;;459 rdy = OS_TRUE;
;;;460 } else {
;;;461 pevent2 = ptcb->OSTCBEventPtr;
;;;462 if (pevent2 != (OS_EVENT *)0) { /* Remove from event wait list */
;;;463 if ((pevent2->OSEventTbl[ptcb->OSTCBY] &= ~ptcb->OSTCBBitX) == 0) {
;;;464 pevent2->OSEventGrp &= ~ptcb->OSTCBBitY;
;;;465 }
;;;466 }
;;;467 rdy = OS_FALSE; /* No */
;;;468 }
;;;469 ptcb->OSTCBPrio = pip; /* Change owner task prio to PIP */
;;;470 #if OS_LOWEST_PRIO <= 63
;;;471 ptcb->OSTCBY = (INT8U)( ptcb->OSTCBPrio >> 3);
;;;472 ptcb->OSTCBX = (INT8U)( ptcb->OSTCBPrio & 0x07);
;;;473 ptcb->OSTCBBitY = (INT8U)(1 << ptcb->OSTCBY);
;;;474 ptcb->OSTCBBitX = (INT8U)(1 << ptcb->OSTCBX);
;;;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 ...*/
;;;482 OSRdyGrp |= ptcb->OSTCBBitY; /* ... make it ready at new priority. */
;;;483 OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
;;;484 } else {
;;;485 pevent2 = ptcb->OSTCBEventPtr;
;;;486 if (pevent2 != (OS_EVENT *)0) { /* Add to event wait list */
;;;487 pevent2->OSEventGrp |= ptcb->OSTCBBitY;
;;;488 pevent2->OSEventTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
;;;489 }
;;;490 }
;;;491 OSTCBPrioTbl[pip] = ptcb;
;;;492 }
;;;493 }
;;;494 OSTCBCur->OSTCBStat |= OS_STAT_MUTEX; /* Mutex not available, pend current task */
;;;495 OSTCBCur->OSTCBStatPend = OS_STAT_PEND_OK;
;;;496 OSTCBCur->OSTCBDly = timeout; /* Store timeout in current task's TCB */
;;;497 OS_EventTaskWait(pevent); /* Suspend task until event or timeout occurs */
;;;498 OS_EXIT_CRITICAL();
;;;499 OS_Sched(); /* Find next highest priority task ready */
;;;500 OS_ENTER_CRITICAL();
;;;501 if (OSTCBCur->OSTCBStatPend != OS_STAT_PEND_OK) { /* See if we timed out during the pend */
;;;502 pend_stat = OSTCBCur->OSTCBStatPend;
;;;503 OS_EventTOAbort(pevent);
;;;504 OS_EXIT_CRITICAL();
;;;505 switch (pend_stat) {
;;;506 case OS_STAT_PEND_TO:
;;;507 default:
;;;508 *err = OS_ERR_TIMEOUT; /* Indicate that we didn't get mutex within TO */
;;;509 break;
;;;510
;;;511 case OS_STAT_PEND_ABORT:
;;;512 *err = OS_ERR_PEND_ABORT; /* Indicate that we aborted getting mutex */
;;;513 break;
;;;514 }
;;;515 return;
;;;516 }
;;;517 OSTCBCur->OSTCBEventPtr = (OS_EVENT *)0;
;;;518 OS_EXIT_CRITICAL();
;;;519 *err = OS_ERR_NONE;
;;;520 }
00054c e8bd4ffe POP {r1-r11,lr}
000550 e12fff1e BX lr
|L1.1364|
000554 e3540000 CMP r4,#0
000558 1a000002 BNE |L1.1384|
00055c e3a00004 MOV r0,#4
000560 e5c60000 STRB r0,[r6,#0]
000564 eafffff8 B |L1.1356|
|L1.1384|
000568 e5d40000 LDRB r0,[r4,#0]
00056c e3500004 CMP r0,#4
000570 0a000002 BEQ |L1.1408|
000574 e3a00001 MOV r0,#1
000578 e5c60000 STRB r0,[r6,#0]
00057c eafffff2 B |L1.1356|
|L1.1408|
000580 e59f05f0 LDR r0,|L1.2936|
000584 e5d00000 LDRB r0,[r0,#0] ; OSIntNesting
000588 e3500000 CMP r0,#0
00058c da000002 BLE |L1.1436|
000590 e3a00002 MOV r0,#2
000594 e5c60000 STRB r0,[r6,#0]
000598 eaffffeb B |L1.1356|
|L1.1436|
00059c e59f05ec LDR r0,|L1.2960|
0005a0 e5d00000 LDRB r0,[r0,#0] ; OSLockNesting
0005a4 e3500000 CMP r0,#0
0005a8 da000002 BLE |L1.1464|
0005ac e3a0000d MOV r0,#0xd
0005b0 e5c60000 STRB r0,[r6,#0]
0005b4 eaffffe4 B |L1.1356|
|L1.1464|
0005b8 ebfffffe BL OS_CPU_SR_Save
0005bc e58d0000 STR r0,[sp,#0]
0005c0 e1d400b8 LDRH r0,[r4,#8]
0005c4 e1a07440 ASR r7,r0,#8
0005c8 e1d400b8 LDRH r0,[r4,#8]
0005cc e20000ff AND r0,r0,#0xff
0005d0 e35000ff CMP r0,#0xff
0005d4 1a00001a BNE |L1.1604|
0005d8 e1d400b8 LDRH r0,[r4,#8]
0005dc e2000cff AND r0,r0,#0xff00
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -