📄 os_mutex.s79
字号:
_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,??DataTable38 ;; 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
STRB R0,[R5, #+0]
// 403 return;
B ??OSMutexPend_1
// 404 }
// 405 OSTCBCur->OSTCBEventPtr = (OS_EVENT *)0;
??OSMutexPend_12:
LDR R0,??DataTable38 ;; 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
STRB R0,[R5, #+0]
// 408 }
??OSMutexPend_1:
ADD SP,SP,#+4
CFI CFA R13+20
POP {R4-R7}
POP {R0}
BX R0 ;; return
CFI EndBlock cfiBlock7
RSEG CODE:CODE:NOROOT(2)
DATA
??DataTable17:
DC32 OSIntNesting
RSEG CODE:CODE:NOROOT(2)
DATA
??DataTable38:
DC32 OSTCBCur
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.
// 424 *********************************************************************************************************
// 425 */
// 426
RSEG CODE:CODE:NOROOT(2)
CFI Block cfiBlock9 Using cfiCommon1
CFI Function OSMutexPost
THUMB
// 427 INT8U OSMutexPost (OS_EVENT *pevent)
// 428 {
OSMutexPost:
PUSH {R4-R7,LR}
CFI ?RET Frame(CFA, -4)
CFI R7 Frame(CFA, -8)
CFI R6 Frame(CFA, -12)
CFI R5 Frame(CFA, -16)
CFI R4 Frame(CFA, -20)
CFI CFA R13+20
MOVS R4,R0
// 429 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
// 430 OS_CPU_SR cpu_sr;
// 431 #endif
// 432 INT8U pip; /* Priority inheritance priority */
// 433 INT8U prio;
// 434 INT8U y;
// 435
// 436
// 437 if (OSIntNesting > 0) { /* See if called from ISR ... */
LDR R0,??DataTable71 ;; OSIntNesting
LDRB R0,[R0, #+0]
CMP R0,#+1
BCC ??OSMutexPost_0
// 438 return (OS_ERR_POST_ISR); /* ... can't POST mutex from an ISR */
MOVS R0,#+5
B ??OSMutexPost_1
// 439 }
// 440 #if OS_ARG_CHK_EN > 0
// 441 if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
??OSMutexPost_0:
CMP R4,#+0
BNE ??OSMutexPost_2
// 442 return (OS_ERR_PEVENT_NULL);
MOVS R0,#+4
B ??OSMutexPost_1
// 443 }
// 444 #endif
// 445 if (pevent->OSEventType != OS_EVENT_TYPE_MUTEX) { /* Validate event block type */
??OSMutexPost_2:
LDRB R0,[R4, #+0]
CMP R0,#+4
BEQ ??OSMutexPost_3
// 446 return (OS_ERR_EVENT_TYPE);
MOVS R0,#+1
B ??OSMutexPost_1
// 447 }
// 448 OS_ENTER_CRITICAL();
??OSMutexPost_3:
_BLF OS_CPU_SR_Save,??OS_CPU_SR_Save??rT
MOVS R5,R0
// 449 pip = (INT8U)(pevent->OSEventCnt >> 8); /* Get priority inheritance priority of mutex */
LDRH R0,[R4, #+2]
MOVS R2,R0
LSLS R2,R2,#+16 ;; ZeroExtS R2,R2,#+16,#+16
LSRS R2,R2,#+16
LSRS R2,R2,#+8
// 450 prio = (INT8U)(pevent->OSEventCnt & OS_MUTEX_KEEP_LOWER_8); /* Get owner's original priority */
LDRH R1,[R4, #+2]
// 451 if (OSTCBCur != (OS_TCB *)pevent->OSEventPtr) { /* See if posting task owns the MUTEX */
LDR R0,??DataTable68 ;; OSTCBCur
LDR R0,[R0, #+0]
LDR R3,[R4, #+4]
CMP R0,R3
BEQ ??OSMutexPost_4
// 452 OS_EXIT_CRITICAL();
MOVS R0,R5
_BLF OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rT
// 453 return (OS_ERR_NOT_MUTEX_OWNER);
MOVS R0,#+120
B ??OSMutexPost_1
// 454 }
// 455 if (OSTCBCur->OSTCBPrio == pip) { /* Did we have to raise current task's priority? */
??OSMutexPost_4:
LDR R0,??DataTable68 ;; OSTCBCur
LDR R0,[R0, #+0]
ADDS R0,R0,#+45
LDRB R0,[R0, #+0]
LSLS R2,R2,#+24 ;; ZeroExtS R2,R2,#+24,#+24
LSRS R2,R2,#+24
CMP R0,R2
BNE ??OSMutexPost_5
// 456 y = OSTCBCur->OSTCBY; /* Yes, Return to original priority */
LDR R0,??DataTable68 ;; OSTCBCur
LDR R0,[R0, #+0]
ADDS R0,R0,#+47
LDRB R3,[R0, #+0]
// 457 OSRdyTbl[y] &= ~OSTCBCur->OSTCBBitX; /* Remove owner from ready list at 'pip' */
LSLS R3,R3,#+24 ;; ZeroExtS R3,R3,#+24,#+24
LSRS R3,R3,#+24
LDR R0,??DataTable46 ;; OSRdyTbl
LSLS R3,R3,#+24 ;; ZeroExtS R3,R3,#+24,#+24
LSRS R3,R3,#+24
LDR R6,??DataTable46 ;; OSRdyTbl
LDRB R6,[R6, R3]
LDR R7,??DataTable68 ;; OSTCBCur
LDR R7,[R7, #+0]
ADDS R7,R7,#+48
LDRB R7,[R7, #+0]
BICS R6,R6,R7
STRB R6,[R0, R3]
// 458 if (OSRdyTbl[y] == 0) {
LDR R0,??DataTable46 ;; OSRdyTbl
LDRB R0,[R0, R3]
CMP R0,#+0
BNE ??OSMutexPost_6
// 459 OSRdyGrp &= ~OSTCBCur->OSTCBBitY;
LDR R0,??DataTable60 ;; OSRdyGrp
LDR R3,??DataTable60 ;; OSRdyGrp
LDRB R3,[R3, #+0]
LDR R6,??DataTable68 ;; OSTCBCur
LDR R6,[R6, #+0]
ADDS R6,R6,#+49
LDRB R6,[R6, #+0]
BICS R3,R3,R6
STRB R3,[R0, #+0]
// 460 }
// 461 OSTCBCur->OSTCBPrio = prio;
??OSMutexPost_6:
LDR R0,??DataTable68 ;; OSTCBCur
LDR R0,[R0, #+0]
ADDS R0,R0,#+45
STRB R1,[R0, #+0]
// 462 OSTCBCur->OSTCBY = prio >> 3;
LDR R0,??DataTable68 ;; OSTCBCur
LDR R0,[R0, #+0]
ADDS R0,R0,#+47
MOVS R3,R1
LSLS R3,R3,#+24 ;; ZeroExtS R3,R3,#+24,#+24
LSRS R3,R3,#+24
LSRS R3,R3,#+3
STRB R3,[R0, #+0]
// 463 OSTCBCur->OSTCBBitY = OSMapTbl[OSTCBCur->OSTCBY];
LDR R0,??DataTable68 ;; OSTCBCur
LDR R0,[R0, #+0]
ADDS R0,R0,#+49
LDR R3,??DataTable68 ;; OSTCBCur
LDR R3,[R3, #+0]
ADDS R3,R3,#+47
LDRB R3,[R3, #+0]
LDR R6,??DataTable58 ;; OSMapTbl
LDRB R3,[R6, R3]
STRB R3,[R0, #+0]
// 464 OSTCBCur->OSTCBX = prio & 0x07;
LDR R0,??DataTable68 ;; OSTCBCur
LDR R0,[R0, #+0]
ADDS R0,R0,#+46
LSLS R3,R1,#+29 ;; ZeroExtS R3,R1,#+29,#+29
LSRS R3,R3,#+29
STRB R3,[R0, #+0]
// 465 OSTCBCur->OSTCBBitX = OSMapTbl[OSTCBCur->OSTCBX];
LDR R0,??DataTable68 ;; OSTCBCur
LDR R0,[R0, #+0]
ADDS R0,R0,#+48
LDR R3,??DataTable68 ;; OSTCBCur
LDR R3,[R3, #+0]
ADDS R3,R3,#+46
LDRB R3,[R3, #+0]
LDR R6,??DataTable58 ;; OSMapTbl
LDRB R3,[R6, R3]
STRB R3,[R0, #+0]
// 466 OSRdyGrp |= OSTCBCur->OSTCBBitY;
LDR R0,??DataTable60 ;; OSRdyGrp
LDR R3,??DataTable60 ;; OSRdyGrp
LDRB R3,[R3, #+0]
LDR R6,??DataTable68 ;; OSTCBCur
LDR R6,[R6, #+0]
ADDS R6,R6,#+49
LDRB R6,[R6, #+0]
ORRS R6,R6,R3
STRB R6,[R0, #+0]
// 467 OSRdyTbl[OSTCBCur->OSTCBY] |= OSTCBCur->OSTCBBitX;
LDR R0,??DataTable68 ;; OSTCBCur
LDR R0,[R0, #+0]
ADDS R0,R0,#+47
LDRB R0,[R0, #+0]
LDR R6,??DataTable46 ;; OSRdyTbl
LDR R3,??DataTable68 ;; OSTCBCur
LDR R3,[R3, #+0]
ADDS R3,R3,#+47
LDRB R3,[R3, #+0]
LDR R7,??DataTable46 ;; OSRdyTbl
LDRB R7,[R7, R3]
LDR R3,??DataTable68 ;; OSTCBCur
LDR R3,[R3, #+0]
ADDS R3,R3,#+48
LDRB R3,[R3, #+0]
ORRS R3,R3,R7
STRB R3,[R6, R0]
// 468 OSTCBPrioTbl[prio] = (OS_TCB *)OSTCBCur;
LSLS R1,R1,#+24 ;; ZeroExtS R1,R1,#+24,#+24
LSRS R1,R1,#+24
MOVS R0,#+4
MULS R1,R0,R1
LDR R0,??DataTable70 ;; OSTCBPrioTbl
LDR R3,??DataTable68 ;; OSTCBCur
LDR R3,[R3, #+0]
STR R3,[R0, R1]
// 469 }
// 470 OSTCBPrioTbl[pip] = (OS_TCB *)1; /* Reserve table entry */
??OSMutexPost_5:
LSLS R2,R2,#+24 ;; ZeroExtS R2,R2,#+24,#+24
LSRS R2,R2,#+24
MOVS R0,#+4
MULS R2,R0,R2
LDR R0,??DataTable70 ;; OSTCBPrioTbl
MOVS R1,#+1
STR R1,[R0, R2]
// 471 if (pevent->OSEventGrp != 0x00) { /* Any task waiting for the mutex? */
LDRB R0,[R4, #+1]
CMP R0,#+0
BEQ ??OSMutexPost_7
// 472 /* Yes, Make HPT waiting for mutex ready */
// 473 prio = OS_EventTaskRdy(pevent, (void *)0, OS_STAT_MUTEX);
MOVS R2,#+16
MOVS R1,#+0
MOVS R0,R4
_BLF OS_EventTaskRdy,??OS_EventTaskRdy??rT
MOVS R1,R0
// 474 pevent->OSEventCnt &= OS_MUTEX_KEEP_UPPER_8; /* Save priority of mutex's new owner */
LDRH R0,[R4, #+2]
MOVS R2,#+255
LSLS R2,R2,#+8 ;; #+65280
ANDS R2,R2,R0
STRH R2,[R4, #+2]
// 475 pevent->OSEventCnt |= prio;
LDRH R0,[R4, #+2]
LSLS R1,R1,#+24 ;; ZeroExtS R1,R1,#+24,#+24
LSRS R1,R1,#+24
ORRS R0,R0,R1
STRH R0,[R4, #+2]
// 476 pevent->OSEventPtr = OSTCBPrioTbl[prio]; /*
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -