📄 os_mutex.s79
字号:
??OSMutexPend_3:
_BLF OS_CPU_SR_Save,??OS_CPU_SR_Save??rT
MOVS R6,R0
// 348 if ((INT8U)(pevent->OSEventCnt & OS_MUTEX_KEEP_LOWER_8) == OS_MUTEX_AVAILABLE) {
LDRH R0,[R4, #+2]
LSLS R0,R0,#+24
LSRS R0,R0,#+24
CMP R0,#+255
LDRH R0,[R4, #+2]
BNE ??OSMutexPend_4
// 349 pevent->OSEventCnt &= OS_MUTEX_KEEP_UPPER_8; /* Yes, Acquire the resource */
MOVS R1,#+255
LSLS R1,R1,#+8 ;; #+65280
ANDS R1,R1,R0
STRH R1,[R4, #+2]
// 350 pevent->OSEventCnt |= OSTCBCur->OSTCBPrio; /* Save priority of owning task */
MOVS R0,R1
LDR R1,??DataTable49 ;; OSTCBCur
LDR R1,[R1, #+0]
ADDS R1,R1,#+45
LDRB R1,[R1, #+0]
ORRS R1,R1,R0
STRH R1,[R4, #+2]
// 351 pevent->OSEventPtr = (void *)OSTCBCur; /* Point to owning task's OS_TCB */
LDR R0,??DataTable49 ;; OSTCBCur
LDR R0,[R0, #+0]
STR R0,[R4, #+4]
// 352 OS_EXIT_CRITICAL();
MOVS R0,R6
_BLF OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rT
// 353 *err = OS_NO_ERR;
MOVS R0,#+0
B.N ??OSMutexPend_1
// 354 return;
// 355 }
// 356 pip = (INT8U)(pevent->OSEventCnt >> 8); /* No, Get PIP from mutex */
??OSMutexPend_4:
LSRS R0,R0,#+8
// 357 mprio = (INT8U)(pevent->OSEventCnt & OS_MUTEX_KEEP_LOWER_8); /* Get priority of mutex owner */
LDRH R2,[R4, #+2]
LSLS R2,R2,#+24
LSRS R2,R2,#+24
// 358 ptcb = (OS_TCB *)(pevent->OSEventPtr); /* Point to TCB of mutex owner */
LDR R1,[R4, #+4]
// 359 if (ptcb->OSTCBPrio != pip && mprio > OSTCBCur->OSTCBPrio) { /* Need to promote prio of owner?*/
MOVS R3,#+45
LDRB R3,[R1, R3]
CMP R3,R0
BNE .+5
B ??OSMutexPend_5
LDR R3,??DataTable49 ;; OSTCBCur
LDR R3,[R3, #+0]
ADDS R3,R3,#+45
LDRB R3,[R3, #+0]
CMP R3,R2
BCC .+5
B ??OSMutexPend_5
// 360 y = ptcb->OSTCBY;
MOVS R2,#+47
LDRB R2,[R1, R2]
STR R2,[SP, #+0]
// 361 if ((OSRdyTbl[y] & ptcb->OSTCBBitX) != 0x00) { /* See if mutex owner is ready */
LDR R3,??DataTable58 ;; OSRdyTbl
LDRB R2,[R3, R2]
MOVS R3,#+48
LDRB R3,[R1, R3]
TST R2,R3
BEQ ??OSMutexPend_6
// 362 OSRdyTbl[y] &= ~ptcb->OSTCBBitX; /* Yes, Remove owner from Rdy ...*/
LDR R3,[SP, #+0]
LSLS R3,R3,#+24
LSRS R3,R3,#+24
LDR R7,??DataTable58 ;; OSRdyTbl
MOV R12,R3
LDR R2,??DataTable58 ;; OSRdyTbl
LDRB R2,[R2, R3]
MOVS R3,#+48
LDRB R3,[R1, R3]
BICS R2,R2,R3
MOV R3,R12
STRB R2,[R7, R3]
// 363 if (OSRdyTbl[y] == 0x00) { /* ... list at current prio */
LDR R2,[SP, #+0]
LSLS R2,R2,#+24
LSRS R2,R2,#+24
LDR R3,??DataTable58 ;; OSRdyTbl
LDRB R2,[R3, R2]
CMP R2,#+0
BNE ??OSMutexPend_7
// 364 OSRdyGrp &= ~ptcb->OSTCBBitY;
LDR R2,??DataTable55 ;; OSRdyGrp
LDR R3,??DataTable55 ;; OSRdyGrp
LDRB R3,[R3, #+0]
MOVS R7,#+49
LDRB R7,[R1, R7]
BICS R3,R3,R7
STRB R3,[R2, #+0]
// 365 }
// 366 rdy = TRUE;
??OSMutexPend_7:
MOVS R2,#+1
B ??OSMutexPend_8
// 367 } else {
// 368 pevent2 = ptcb->OSTCBEventPtr;
??OSMutexPend_6:
LDR R2,[R1, #+28]
// 369 if (pevent2 != (OS_EVENT *)0) { /* Remove from event wait list */
CMP R2,#+0
BEQ ??OSMutexPend_9
// 370 if ((pevent2->OSEventTbl[ptcb->OSTCBY] &= ~ptcb->OSTCBBitX) == 0) {
MOVS R3,#+47
LDRB R3,[R1, R3]
ADDS R3,R2,R3
MOV R12,R3
MOVS R3,#+47
LDRB R3,[R1, R3]
ADDS R3,R2,R3
LDRB R7,[R3, #+8]
MOVS R3,#+48
LDRB R3,[R1, R3]
BICS R7,R7,R3
MOV R3,R12
STRB R7,[R3, #+8]
MOVS R3,#+47
LDRB R3,[R1, R3]
ADDS R3,R2,R3
LDRB R3,[R3, #+8]
CMP R3,#+0
BNE ??OSMutexPend_9
// 371 pevent2->OSEventGrp &= ~ptcb->OSTCBBitY;
LDRB R3,[R2, #+1]
MOVS R7,#+49
LDRB R7,[R1, R7]
BICS R3,R3,R7
STRB R3,[R2, #+1]
// 372 }
// 373 }
// 374 rdy = FALSE; /* No */
??OSMutexPend_9:
MOVS R2,#+0
// 375 }
// 376 ptcb->OSTCBPrio = pip; /* Change owner task prio to PIP */
??OSMutexPend_8:
MOVS R3,#+45
STRB R0,[R1, R3]
// 377 ptcb->OSTCBY = ptcb->OSTCBPrio >> 3;
MOVS R3,#+47
LSRS R7,R0,#+3
STRB R7,[R1, R3]
// 378 ptcb->OSTCBBitY = OSMapTbl[ptcb->OSTCBY];
LDR R3,??DataTable50 ;; OSMapTbl
LDRB R3,[R3, R7]
MOVS R7,#+49
STRB R3,[R1, R7]
// 379 ptcb->OSTCBX = ptcb->OSTCBPrio & 0x07;
MOVS R3,#+46
LSLS R7,R0,#+29
LSRS R7,R7,#+29
STRB R7,[R1, R3]
// 380 ptcb->OSTCBBitX = OSMapTbl[ptcb->OSTCBX];
LDRB R7,[R1, R3]
LDR R3,??DataTable50 ;; OSMapTbl
LDRB R3,[R3, R7]
MOVS R7,#+48
STRB R3,[R1, R7]
// 381 if (rdy == TRUE) { /* If task was ready at owner's priority ...*/
CMP R2,#+1
BNE ??OSMutexPend_10
// 382 OSRdyGrp |= ptcb->OSTCBBitY; /* ... make it ready at new priority. */
LDR R2,??DataTable55 ;; OSRdyGrp
LDR R3,??DataTable55 ;; OSRdyGrp
LDRB R3,[R3, #+0]
MOVS R7,#+49
LDRB R7,[R1, R7]
ORRS R7,R7,R3
STRB R7,[R2, #+0]
// 383 OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
MOVS R2,#+47
LDRB R2,[R1, R2]
LDR R7,??DataTable58 ;; OSRdyTbl
MOV R12,R2
MOV R3,R12
LDR R2,??DataTable58 ;; OSRdyTbl
LDRB R2,[R2, R3]
MOVS R3,#+48
LDRB R3,[R1, R3]
ORRS R3,R3,R2
MOV R2,R12
STRB R3,[R7, R2]
B ??OSMutexPend_11
// 384 } else {
// 385 pevent2 = ptcb->OSTCBEventPtr;
??OSMutexPend_10:
LDR R2,[R1, #+28]
// 386 if (pevent2 != (OS_EVENT *)0) { /* Remove from event wait list */
CMP R2,#+0
BEQ ??OSMutexPend_11
// 387 pevent2->OSEventGrp |= ptcb->OSTCBBitY;
LDRB R3,[R2, #+1]
MOVS R7,#+49
LDRB R7,[R1, R7]
ORRS R7,R7,R3
STRB R7,[R2, #+1]
// 388 pevent2->OSEventTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
MOVS R3,#+47
LDRB R3,[R1, R3]
ADDS R3,R2,R3
MOVS R7,#+47
LDRB R7,[R1, R7]
ADDS R2,R2,R7
LDRB R7,[R2, #+8]
MOVS R2,#+48
LDRB R2,[R1, R2]
ORRS R2,R2,R7
STRB R2,[R3, #+8]
// 389 }
// 390 }
// 391 OSTCBPrioTbl[pip] = (OS_TCB *)ptcb;
??OSMutexPend_11:
LSLS R0,R0,#+2
LDR R2,??DataTable63 ;; OSTCBPrioTbl
STR R1,[R2, R0]
// 392 }
// 393 OSTCBCur->OSTCBStat |= OS_STAT_MUTEX; /* Mutex not available, pend current task */
??OSMutexPend_5:
LDR R0,??DataTable49 ;; OSTCBCur
LDR R0,[R0, #+0]
ADDS R0,R0,#+44
LDR R1,??DataTable49 ;; OSTCBCur
LDR R1,[R1, #+0]
ADDS R1,R1,#+44
LDRB R1,[R1, #+0]
MOVS R2,#+16
ORRS R2,R2,R1
STRB R2,[R0, #+0]
// 394 OSTCBCur->OSTCBDly = timeout; /* Store timeout in current task's TCB */
LDR R0,??DataTable49 ;; OSTCBCur
LDR R0,[R0, #+0]
MOV R1,SP
LDRH R1,[R1, #+4]
STRH R1,[R0, #+42]
// 395 OS_EventTaskWait(pevent); /* Suspend task until event or timeout occurs */
MOVS R0,R4
_BLF OS_EventTaskWait,??OS_EventTaskWait??rT
// 396 OS_EXIT_CRITICAL();
MOVS R0,R6
_BLF OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rT
// 397 OS_Sched(); /* Find next highest priority task ready */
_BLF OS_Sched,??OS_Sched??rT
// 398 OS_ENTER_CRITICAL();
_BLF OS_CPU_SR_Save,??OS_CPU_SR_Save??rT
MOVS R6,R0
// 399 if (OSTCBCur->OSTCBStat & OS_STAT_MUTEX) { /* Must have timed out if still waiting for event*/
LDR R0,??DataTable49 ;; OSTCBCur
LDR R0,[R0, #+0]
ADDS R0,R0,#+44
LDRB R0,[R0, #+0]
LSLS R0,R0,#+27
BPL ??OSMutexPend_12
// 400 OS_EventTO(pevent);
MOVS R0,R4
_BLF OS_EventTO,??OS_EventTO??rT
// 401 OS_EXIT_CRITICAL();
MOVS R0,R6
_BLF OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rT
// 402 *err = OS_TIMEOUT; /* Indicate that we didn't get mutex within TO */
MOVS R0,#+10
B.N ??OSMutexPend_1
// 403 return;
// 404 }
// 405 OSTCBCur->OSTCBEventPtr = (OS_EVENT *)0;
??OSMutexPend_12:
LDR R0,??DataTable49 ;; OSTCBCur
LDR R0,[R0, #+0]
MOVS R1,#+0
STR R1,[R0, #+28]
// 406 OS_EXIT_CRITICAL();
MOVS R0,R6
_BLF OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rT
// 407 *err = OS_NO_ERR;
MOVS R0,#+0
??OSMutexPend_1:
STRB R0,[R5, #+0]
// 408 }
ADD SP,SP,#+8
CFI CFA R13+20
POP {R4-R7}
POP {R0}
BX R0 ;; return
CFI EndBlock cfiBlock7
RSEG CODE:CODE:NOROOT(2)
DATA
??DataTable13:
DC32 OSIntNesting
RSEG CODE:CODE:NOROOT(2)
CFI Block cfiBlock8 Using cfiCommon0
CFI NoFunction
ARM
??OSMutexPost??rA:
ADD R12,PC,#+1
BX R12
CFI EndBlock cfiBlock8
REQUIRE OSMutexPost
// 409 /*$PAGE*/
// 410 /*
// 411 *********************************************************************************************************
// 412 * POST TO A MUTUAL EXCLUSION SEMAPHORE
// 413 *
// 414 * Description: This function signals a mutual exclusion semaphore
// 415 *
// 416 * Arguments : pevent is a pointer to the event control block associated with the desired
// 417 * mutex.
// 418 *
// 419 * Returns : OS_NO_ERR The call was successful and the mutex was signaled.
// 420 * OS_ERR_EVENT_TYPE If you didn't pass a pointer to a mutex
// 421 * OS_ERR_PEVENT_NULL 'pevent' is a NULL pointer
// 422 * OS_ERR_POST_ISR Attempted to post from an ISR (not valid for MUTEXes)
// 423 * OS_ERR_NOT_MUTEX_OWNER The task that did the post is NOT the owner of the MUTEX.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -