📄 os_mutex.lst
字号:
321 {
\ OSMutexPend:
\ 00000000 F2B5 PUSH {R1,R4-R7,LR}
\ 00000002 81B0 SUB SP,SP,#+4
\ 00000004 0400 MOVS R4,R0
\ 00000006 1500 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 ... */
\ 00000008 .... LDR R0,??DataTable13 ;; OSIntNesting
\ 0000000A 0078 LDRB R0,[R0, #+0]
\ 0000000C 0028 CMP R0,#+0
\ 0000000E 01D0 BEQ ??OSMutexPend_0
334 *err = OS_ERR_PEND_ISR; /* ... can't PEND from an ISR */
\ 00000010 0220 MOVS R0,#+2
\ 00000012 E4E0 B.N ??OSMutexPend_1
335 return;
336 }
337 #if OS_ARG_CHK_EN > 0
338 if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
\ ??OSMutexPend_0:
\ 00000014 002C CMP R4,#+0
\ 00000016 01D1 BNE ??OSMutexPend_2
339 *err = OS_ERR_PEVENT_NULL;
\ 00000018 0420 MOVS R0,#+4
\ 0000001A E0E0 B.N ??OSMutexPend_1
340 return;
341 }
342 #endif
343 if (pevent->OSEventType != OS_EVENT_TYPE_MUTEX) { /* Validate event block type */
\ ??OSMutexPend_2:
\ 0000001C 2078 LDRB R0,[R4, #+0]
\ 0000001E 0428 CMP R0,#+4
\ 00000020 01D0 BEQ ??OSMutexPend_3
344 *err = OS_ERR_EVENT_TYPE;
\ 00000022 0120 MOVS R0,#+1
\ 00000024 DBE0 B.N ??OSMutexPend_1
345 return;
346 }
347 OS_ENTER_CRITICAL(); /* Is Mutex available? */
\ ??OSMutexPend_3:
\ 00000026 ........ _BLF OS_CPU_SR_Save,??OS_CPU_SR_Save??rT
\ 0000002A 0600 MOVS R6,R0
348 if ((INT8U)(pevent->OSEventCnt & OS_MUTEX_KEEP_LOWER_8) == OS_MUTEX_AVAILABLE) {
\ 0000002C 6088 LDRH R0,[R4, #+2]
\ 0000002E 0006 LSLS R0,R0,#+24
\ 00000030 000E LSRS R0,R0,#+24
\ 00000032 FF28 CMP R0,#+255
\ 00000034 6088 LDRH R0,[R4, #+2]
\ 00000036 12D1 BNE ??OSMutexPend_4
349 pevent->OSEventCnt &= OS_MUTEX_KEEP_UPPER_8; /* Yes, Acquire the resource */
\ 00000038 FF21 MOVS R1,#+255
\ 0000003A 0902 LSLS R1,R1,#+8 ;; #+65280
\ 0000003C 0140 ANDS R1,R1,R0
\ 0000003E 6180 STRH R1,[R4, #+2]
350 pevent->OSEventCnt |= OSTCBCur->OSTCBPrio; /* Save priority of owning task */
\ 00000040 0800 MOVS R0,R1
\ 00000042 .... LDR R1,??DataTable49 ;; OSTCBCur
\ 00000044 0968 LDR R1,[R1, #+0]
\ 00000046 2D31 ADDS R1,R1,#+45
\ 00000048 0978 LDRB R1,[R1, #+0]
\ 0000004A 0143 ORRS R1,R1,R0
\ 0000004C 6180 STRH R1,[R4, #+2]
351 pevent->OSEventPtr = (void *)OSTCBCur; /* Point to owning task's OS_TCB */
\ 0000004E .... LDR R0,??DataTable49 ;; OSTCBCur
\ 00000050 0068 LDR R0,[R0, #+0]
\ 00000052 6060 STR R0,[R4, #+4]
352 OS_EXIT_CRITICAL();
\ 00000054 3000 MOVS R0,R6
\ 00000056 ........ _BLF OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rT
353 *err = OS_NO_ERR;
\ 0000005A 0020 MOVS R0,#+0
\ 0000005C BFE0 B.N ??OSMutexPend_1
354 return;
355 }
356 pip = (INT8U)(pevent->OSEventCnt >> 8); /* No, Get PIP from mutex */
\ ??OSMutexPend_4:
\ 0000005E 000A LSRS R0,R0,#+8
357 mprio = (INT8U)(pevent->OSEventCnt & OS_MUTEX_KEEP_LOWER_8); /* Get priority of mutex owner */
\ 00000060 6288 LDRH R2,[R4, #+2]
\ 00000062 1206 LSLS R2,R2,#+24
\ 00000064 120E LSRS R2,R2,#+24
358 ptcb = (OS_TCB *)(pevent->OSEventPtr); /* Point to TCB of mutex owner */
\ 00000066 6168 LDR R1,[R4, #+4]
359 if (ptcb->OSTCBPrio != pip && mprio > OSTCBCur->OSTCBPrio) { /* Need to promote prio of owner?*/
\ 00000068 2D23 MOVS R3,#+45
\ 0000006A CB5C LDRB R3,[R1, R3]
\ 0000006C 8342 CMP R3,R0
\ 0000006E .... BNE .+5
\ 00000070 85E0 B ??OSMutexPend_5
\ 00000072 .... LDR R3,??DataTable49 ;; OSTCBCur
\ 00000074 1B68 LDR R3,[R3, #+0]
\ 00000076 2D33 ADDS R3,R3,#+45
\ 00000078 1B78 LDRB R3,[R3, #+0]
\ 0000007A 9342 CMP R3,R2
\ 0000007C .... BCC .+5
\ 0000007E 7EE0 B ??OSMutexPend_5
360 y = ptcb->OSTCBY;
\ 00000080 2F22 MOVS R2,#+47
\ 00000082 8A5C LDRB R2,[R1, R2]
\ 00000084 0092 STR R2,[SP, #+0]
361 if ((OSRdyTbl[y] & ptcb->OSTCBBitX) != 0x00) { /* See if mutex owner is ready */
\ 00000086 .... LDR R3,??DataTable58 ;; OSRdyTbl
\ 00000088 9A5C LDRB R2,[R3, R2]
\ 0000008A 3023 MOVS R3,#+48
\ 0000008C CB5C LDRB R3,[R1, R3]
\ 0000008E 1A42 TST R2,R3
\ 00000090 1BD0 BEQ ??OSMutexPend_6
362 OSRdyTbl[y] &= ~ptcb->OSTCBBitX; /* Yes, Remove owner from Rdy ...*/
\ 00000092 009B LDR R3,[SP, #+0]
\ 00000094 1B06 LSLS R3,R3,#+24
\ 00000096 1B0E LSRS R3,R3,#+24
\ 00000098 .... LDR R7,??DataTable58 ;; OSRdyTbl
\ 0000009A 9C46 MOV R12,R3
\ 0000009C .... LDR R2,??DataTable58 ;; OSRdyTbl
\ 0000009E D25C LDRB R2,[R2, R3]
\ 000000A0 3023 MOVS R3,#+48
\ 000000A2 CB5C LDRB R3,[R1, R3]
\ 000000A4 9A43 BICS R2,R2,R3
\ 000000A6 6346 MOV R3,R12
\ 000000A8 FA54 STRB R2,[R7, R3]
363 if (OSRdyTbl[y] == 0x00) { /* ... list at current prio */
\ 000000AA 009A LDR R2,[SP, #+0]
\ 000000AC 1206 LSLS R2,R2,#+24
\ 000000AE 120E LSRS R2,R2,#+24
\ 000000B0 .... LDR R3,??DataTable58 ;; OSRdyTbl
\ 000000B2 9A5C LDRB R2,[R3, R2]
\ 000000B4 002A CMP R2,#+0
\ 000000B6 06D1 BNE ??OSMutexPend_7
364 OSRdyGrp &= ~ptcb->OSTCBBitY;
\ 000000B8 .... LDR R2,??DataTable55 ;; OSRdyGrp
\ 000000BA .... LDR R3,??DataTable55 ;; OSRdyGrp
\ 000000BC 1B78 LDRB R3,[R3, #+0]
\ 000000BE 3127 MOVS R7,#+49
\ 000000C0 CF5D LDRB R7,[R1, R7]
\ 000000C2 BB43 BICS R3,R3,R7
\ 000000C4 1370 STRB R3,[R2, #+0]
365 }
366 rdy = TRUE;
\ ??OSMutexPend_7:
\ 000000C6 0122 MOVS R2,#+1
\ 000000C8 1BE0 B ??OSMutexPend_8
367 } else {
368 pevent2 = ptcb->OSTCBEventPtr;
\ ??OSMutexPend_6:
\ 000000CA CA69 LDR R2,[R1, #+28]
369 if (pevent2 != (OS_EVENT *)0) { /* Remove from event wait list */
\ 000000CC 002A CMP R2,#+0
\ 000000CE 17D0 BEQ ??OSMutexPend_9
370 if ((pevent2->OSEventTbl[ptcb->OSTCBY] &= ~ptcb->OSTCBBitX) == 0) {
\ 000000D0 2F23 MOVS R3,#+47
\ 000000D2 CB5C LDRB R3,[R1, R3]
\ 000000D4 D318 ADDS R3,R2,R3
\ 000000D6 9C46 MOV R12,R3
\ 000000D8 2F23 MOVS R3,#+47
\ 000000DA CB5C LDRB R3,[R1, R3]
\ 000000DC D318 ADDS R3,R2,R3
\ 000000DE 1F7A LDRB R7,[R3, #+8]
\ 000000E0 3023 MOVS R3,#+48
\ 000000E2 CB5C LDRB R3,[R1, R3]
\ 000000E4 9F43 BICS R7,R7,R3
\ 000000E6 6346 MOV R3,R12
\ 000000E8 1F72 STRB R7,[R3, #+8]
\ 000000EA 2F23 MOVS R3,#+47
\ 000000EC CB5C LDRB R3,[R1, R3]
\ 000000EE D318 ADDS R3,R2,R3
\ 000000F0 1B7A LDRB R3,[R3, #+8]
\ 000000F2 002B CMP R3,#+0
\ 000000F4 04D1 BNE ??OSMutexPend_9
371 pevent2->OSEventGrp &= ~ptcb->OSTCBBitY;
\ 000000F6 5378 LDRB R3,[R2, #+1]
\ 000000F8 3127 MOVS R7,#+49
\ 000000FA CF5D LDRB R7,[R1, R7]
\ 000000FC BB43 BICS R3,R3,R7
\ 000000FE 5370 STRB R3,[R2, #+1]
372 }
373 }
374 rdy = FALSE; /* No */
\ ??OSMutexPend_9:
\ 00000100 0022 MOVS R2,#+0
375 }
376 ptcb->OSTCBPrio = pip; /* Change owner task prio to PIP */
\ ??OSMutexPend_8:
\ 00000102 2D23 MOVS R3,#+45
\ 00000104 C854 STRB R0,[R1, R3]
377 ptcb->OSTCBY = ptcb->OSTCBPrio >> 3;
\ 00000106 2F23 MOVS R3,#+47
\ 00000108 C708 LSRS R7,R0,#+3
\ 0000010A CF54 STRB R7,[R1, R3]
378 ptcb->OSTCBBitY = OSMapTbl[ptcb->OSTCBY];
\ 0000010C .... LDR R3,??DataTable50 ;; OSMapTbl
\ 0000010E DB5D LDRB R3,[R3, R7]
\ 00000110 3127 MOVS R7,#+49
\ 00000112 CB55 STRB R3,[R1, R7]
379 ptcb->OSTCBX = ptcb->OSTCBPrio & 0x07;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -