📄 os_mutex.s79
字号:
CFI R4 Frame(CFA, -20)
CFI CFA R13+24
MOVS R4,R0
MOVS R5,R2
// 322 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
// 323 OS_CPU_SR cpu_sr;
// 324 #endif
// 325 INT8U pip; /* Priority Inheritance Priority (PIP) */
// 326 INT8U mprio; /* Mutex owner priority */
// 327 BOOLEAN rdy; /* Flag indicating task was ready */
// 328 OS_TCB *ptcb;
// 329 OS_EVENT *pevent2;
// 330 INT8U y;
// 331
// 332
// 333 if (OSIntNesting > 0) { /* See if called from ISR ... */
LDR R0,??DataTable17 ;; OSIntNesting
LDRB R0,[R0, #+0]
CMP R0,#+1
BCC ??OSMutexPend_0
// 334 *err = OS_ERR_PEND_ISR; /* ... can't PEND from an ISR */
MOVS R0,#+2
STRB R0,[R5, #+0]
// 335 return;
B ??OSMutexPend_1
// 336 }
// 337 #if OS_ARG_CHK_EN > 0
// 338 if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
??OSMutexPend_0:
CMP R4,#+0
BNE ??OSMutexPend_2
// 339 *err = OS_ERR_PEVENT_NULL;
MOVS R0,#+4
STRB R0,[R5, #+0]
// 340 return;
B ??OSMutexPend_1
// 341 }
// 342 #endif
// 343 if (pevent->OSEventType != OS_EVENT_TYPE_MUTEX) { /* Validate event block type */
??OSMutexPend_2:
LDRB R0,[R4, #+0]
CMP R0,#+4
BEQ ??OSMutexPend_3
// 344 *err = OS_ERR_EVENT_TYPE;
MOVS R0,#+1
STRB R0,[R5, #+0]
// 345 return;
B ??OSMutexPend_1
// 346 }
// 347 OS_ENTER_CRITICAL(); /* Is Mutex available? */
??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 ;; ZeroExtS R0,R0,#+24,#+24
LSRS R0,R0,#+24
CMP R0,#+255
BNE ??OSMutexPend_4
// 349 pevent->OSEventCnt &= OS_MUTEX_KEEP_UPPER_8; /* Yes, Acquire the resource */
LDRH R0,[R4, #+2]
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 */
LDRH R0,[R4, #+2]
LDR R1,??DataTable38 ;; 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,??DataTable38 ;; 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
STRB R0,[R5, #+0]
// 354 return;
B ??OSMutexPend_1
// 355 }
// 356 pip = (INT8U)(pevent->OSEventCnt >> 8); /* No, Get PIP from mutex */
??OSMutexPend_4:
LDRH R0,[R4, #+2]
LSLS R0,R0,#+16 ;; ZeroExtS R0,R0,#+16,#+16
LSRS R0,R0,#+16
LSRS R0,R0,#+8
// 357 mprio = (INT8U)(pevent->OSEventCnt & OS_MUTEX_KEEP_LOWER_8); /* Get priority of mutex owner */
LDRH R2,[R4, #+2]
// 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]
LSLS R0,R0,#+24 ;; ZeroExtS R0,R0,#+24,#+24
LSRS R0,R0,#+24
CMP R3,R0
BNE .+5
B ??OSMutexPend_5
LDR R3,??DataTable38 ;; OSTCBCur
LDR R3,[R3, #+0]
ADDS R3,R3,#+45
LDRB R3,[R3, #+0]
LSLS R2,R2,#+24 ;; ZeroExtS R2,R2,#+24,#+24
LSRS R2,R2,#+24
CMP R3,R2
BCC .+5
B ??OSMutexPend_5
// 360 y = ptcb->OSTCBY;
MOVS R2,#+47
LDRB R2,[R1, R2]
// 361 if ((OSRdyTbl[y] & ptcb->OSTCBBitX) != 0x00) { /* See if mutex owner is ready */
LSLS R2,R2,#+24 ;; ZeroExtS R2,R2,#+24,#+24
LSRS R2,R2,#+24
LDR R3,??DataTable46 ;; OSRdyTbl
LDRB R3,[R3, R2]
MOVS R7,#+48
LDRB R7,[R1, R7]
TST R3,R7
BEQ ??OSMutexPend_6
// 362 OSRdyTbl[y] &= ~ptcb->OSTCBBitX; /* Yes, Remove owner from Rdy ...*/
LSLS R2,R2,#+24 ;; ZeroExtS R2,R2,#+24,#+24
LSRS R2,R2,#+24
LDR R3,??DataTable46 ;; OSRdyTbl
MOV R12,R3
LSLS R2,R2,#+24 ;; ZeroExtS R2,R2,#+24,#+24
LSRS R2,R2,#+24
LDR R3,??DataTable46 ;; OSRdyTbl
LDRB R7,[R3, R2]
MOVS R3,#+48
LDRB R3,[R1, R3]
BICS R7,R7,R3
MOV R3,R12
STRB R7,[R3, R2]
// 363 if (OSRdyTbl[y] == 0x00) { /* ... list at current prio */
LDR R3,??DataTable46 ;; OSRdyTbl
LDRB R2,[R3, R2]
CMP R2,#+0
BNE ??OSMutexPend_7
// 364 OSRdyGrp &= ~ptcb->OSTCBBitY;
LDR R2,??DataTable60 ;; OSRdyGrp
LDR R3,??DataTable60 ;; 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 R3,[R1, #+28]
// 369 if (pevent2 != (OS_EVENT *)0) { /* Remove from event wait list */
CMP R3,#+0
BEQ ??OSMutexPend_9
// 370 if ((pevent2->OSEventTbl[ptcb->OSTCBY] &= ~ptcb->OSTCBBitX) == 0) {
MOVS R2,#+47
LDRB R2,[R1, R2]
ADDS R2,R3,R2
LDRB R2,[R2, #+8]
MOVS R7,#+48
LDRB R7,[R1, R7]
BICS R2,R2,R7
MOVS R7,#+47
LDRB R7,[R1, R7]
ADDS R7,R3,R7
STRB R2,[R7, #+8]
LSLS R2,R2,#+24 ;; ZeroExtS R2,R2,#+24,#+24
LSRS R2,R2,#+24
CMP R2,#+0
BNE ??OSMutexPend_9
// 371 pevent2->OSEventGrp &= ~ptcb->OSTCBBitY;
LDRB R2,[R3, #+1]
MOVS R7,#+49
LDRB R7,[R1, R7]
BICS R2,R2,R7
STRB R2,[R3, #+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
MOVS R7,#+45
LDRB R7,[R1, R7]
LSLS R7,R7,#+24 ;; ZeroExtS R7,R7,#+24,#+24
LSRS R7,R7,#+24
LSRS R7,R7,#+3
STRB R7,[R1, R3]
// 378 ptcb->OSTCBBitY = OSMapTbl[ptcb->OSTCBY];
MOVS R7,#+49
MOV R12,R7
MOVS R3,#+47
LDRB R7,[R1, R3]
LDR R3,??DataTable58 ;; OSMapTbl
LDRB R3,[R3, R7]
MOV R7,R12
STRB R3,[R1, R7]
// 379 ptcb->OSTCBX = ptcb->OSTCBPrio & 0x07;
MOVS R3,#+46
MOVS R7,#+45
LDRB R7,[R1, R7]
LSLS R7,R7,#+29 ;; ZeroExtS R7,R7,#+29,#+29
LSRS R7,R7,#+29
STRB R7,[R1, R3]
// 380 ptcb->OSTCBBitX = OSMapTbl[ptcb->OSTCBX];
MOVS R7,#+48
MOV R12,R7
MOVS R3,#+46
LDRB R7,[R1, R3]
LDR R3,??DataTable58 ;; OSMapTbl
LDRB R3,[R3, R7]
MOV R7,R12
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,??DataTable60 ;; OSRdyGrp
LDR R3,??DataTable60 ;; 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,??DataTable46 ;; OSRdyTbl
MOV R12,R2
MOVS R2,#+47
LDRB R3,[R1, R2]
LDR R2,??DataTable46 ;; 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 R3,[R1, #+28]
// 386 if (pevent2 != (OS_EVENT *)0) { /* Remove from event wait list */
CMP R3,#+0
BEQ ??OSMutexPend_11
// 387 pevent2->OSEventGrp |= ptcb->OSTCBBitY;
LDRB R2,[R3, #+1]
MOVS R7,#+49
LDRB R7,[R1, R7]
ORRS R7,R7,R2
STRB R7,[R3, #+1]
// 388 pevent2->OSEventTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
MOVS R2,#+47
LDRB R2,[R1, R2]
ADDS R2,R3,R2
MOVS R7,#+47
LDRB R7,[R1, R7]
ADDS R3,R3,R7
LDRB R7,[R3, #+8]
MOVS R3,#+48
LDRB R3,[R1, R3]
ORRS R3,R3,R7
STRB R3,[R2, #+8]
// 389 }
// 390 }
// 391 OSTCBPrioTbl[pip] = (OS_TCB *)ptcb;
??OSMutexPend_11:
LSLS R0,R0,#+24 ;; ZeroExtS R0,R0,#+24,#+24
LSRS R0,R0,#+24
MOVS R2,#+4
MULS R0,R2,R0
LDR R2,??DataTable70 ;; OSTCBPrioTbl
STR R1,[R2, R0]
// 392 }
// 393 OSTCBCur->OSTCBStat |= OS_STAT_MUTEX; /* Mutex not available, pend current task */
??OSMutexPend_5:
LDR R0,??DataTable38 ;; OSTCBCur
LDR R0,[R0, #+0]
ADDS R0,R0,#+44
LDR R1,??DataTable38 ;; 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,??DataTable38 ;; OSTCBCur
LDR R0,[R0, #+0]
MOV R1,SP
LDRH R1,[R1, #+0]
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();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -