📄 os_mutex.txt
字号:
00049a e8bde8bd POP {r4-r11,pc}
|L1.1182|
;;;509 break;
;;;510
;;;511 case OS_STAT_PEND_ABORT:
;;;512 *perr = OS_ERR_PEND_ABORT; /* Indicate that we aborted getting mutex */
00049e 200e MOVS r0,#0xe
0004a0 7020 STRB r0,[r4,#0]
0004a2 b005 ADD sp,sp,#0x14
0004a4 e8bde8bd POP {r4-r11,pc}
|L1.1192|
;;;513 break;
;;;514 }
;;;515 return;
;;;516 }
;;;517 OSTCBCur->OSTCBEventPtr = (OS_EVENT *)0;
0004a8 61cf STR r7,[r1,#0x1c]
;;;518 OS_EXIT_CRITICAL();
0004aa 4640 MOV r0,r8
0004ac f7fff7ff BL OS_CPU_SR_Restore
;;;519 *perr = OS_ERR_NONE;
0004b0 7027 STRB r7,[r4,#0]
;;;520 }
0004b2 b005 ADD sp,sp,#0x14
0004b4 e8bde8bd POP {r4-r11,pc}
;;;521 /*$PAGE*/
ENDP
OSMutexPost PROC
;;;546 INT8U OSMutexPost (OS_EVENT *pevent)
;;;547 {
0004b8 e92de92d PUSH {r4-r8,lr}
0004bc 4604 MOV r4,r0
;;;548 INT8U pip; /* Priority inheritance priority */
;;;549 INT8U prio;
;;;550 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;551 OS_CPU_SR cpu_sr = 0;
;;;552 #endif
;;;553
;;;554
;;;555
;;;556 if (OSIntNesting > 0) { /* See if called from ISR ... */
0004be 4847 LDR r0,|L1.1500|
0004c0 7800 LDRB r0,[r0,#0] ; OSIntNesting
0004c2 b110 CBZ r0,|L1.1226|
;;;557 return (OS_ERR_POST_ISR); /* ... can't POST mutex from an ISR */
0004c4 2005 MOVS r0,#5
0004c6 e8bde8bd POP {r4-r8,pc}
|L1.1226|
;;;558 }
;;;559 #if OS_ARG_CHK_EN > 0
;;;560 if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
0004ca b914 CBNZ r4,|L1.1234|
;;;561 return (OS_ERR_PEVENT_NULL);
0004cc 2004 MOVS r0,#4
0004ce e8bde8bd POP {r4-r8,pc}
|L1.1234|
;;;562 }
;;;563 #endif
;;;564 if (pevent->OSEventType != OS_EVENT_TYPE_MUTEX) { /* Validate event block type */
0004d2 7820 LDRB r0,[r4,#0]
0004d4 2804 CMP r0,#4
0004d6 d002 BEQ |L1.1246|
;;;565 return (OS_ERR_EVENT_TYPE);
0004d8 2001 MOVS r0,#1
0004da e8bde8bd POP {r4-r8,pc}
|L1.1246|
;;;566 }
;;;567 OS_ENTER_CRITICAL();
0004de f7fff7ff BL OS_CPU_SR_Save
0004e2 4606 MOV r6,r0
;;;568 pip = (INT8U)(pevent->OSEventCnt >> 8); /* Get priority inheritance priority of mutex */
0004e4 8920 LDRH r0,[r4,#8]
0004e6 0a05 LSRS r5,r0,#8
;;;569 prio = (INT8U)(pevent->OSEventCnt & OS_MUTEX_KEEP_LOWER_8); /* Get owner's original priority */
0004e8 b2c1 UXTB r1,r0
;;;570 if (OSTCBCur != (OS_TCB *)pevent->OSEventPtr) { /* See if posting task owns the MUTEX */
0004ea 483d LDR r0,|L1.1504|
0004ec 6862 LDR r2,[r4,#4]
0004ee 6800 LDR r0,[r0,#0] ; OSTCBCur
0004f0 4282 CMP r2,r0
0004f2 d005 BEQ |L1.1280|
;;;571 OS_EXIT_CRITICAL();
0004f4 4630 MOV r0,r6
0004f6 f7fff7ff BL OS_CPU_SR_Restore
;;;572 return (OS_ERR_NOT_MUTEX_OWNER);
0004fa 2064 MOVS r0,#0x64
0004fc e8bde8bd POP {r4-r8,pc}
|L1.1280|
;;;573 }
;;;574 if (OSTCBCur->OSTCBPrio == pip) { /* Did we have to raise current task's priority? */
000500 f890f890 LDRB r2,[r0,#0x2e]
000504 42aa CMP r2,r5
000506 d101 BNE |L1.1292|
;;;575 OSMutex_RdyAtPrio(OSTCBCur, prio); /* Restore the task's original priority */
000508 f7fff7ff BL OSMutex_RdyAtPrio
|L1.1292|
;;;576 }
;;;577 OSTCBPrioTbl[pip] = OS_TCB_RESERVED; /* Reserve table entry */
00050c 4f32 LDR r7,|L1.1496|
00050e 2001 MOVS r0,#1
000510 f847f847 STR r0,[r7,r5,LSL #2]
;;;578 if (pevent->OSEventGrp != 0) { /* Any task waiting for the mutex? */
000514 7aa0 LDRB r0,[r4,#0xa]
000516 b1f8 CBZ r0,|L1.1368|
;;;579 /* Yes, Make HPT waiting for mutex ready */
;;;580 prio = OS_EventTaskRdy(pevent, (void *)0, OS_STAT_MUTEX, OS_STAT_PEND_OK);
000518 2300 MOVS r3,#0
00051a 2210 MOVS r2,#0x10
00051c 4619 MOV r1,r3
00051e 4620 MOV r0,r4
000520 f7fff7ff BL OS_EventTaskRdy
;;;581 pevent->OSEventCnt &= OS_MUTEX_KEEP_UPPER_8; /* Save priority of mutex's new owner */
000524 8921 LDRH r1,[r4,#8]
000526 f401f401 AND r1,r1,#0xff00
;;;582 pevent->OSEventCnt |= prio;
00052a 4301 ORRS r1,r1,r0
00052c 8121 STRH r1,[r4,#8]
;;;583 pevent->OSEventPtr = OSTCBPrioTbl[prio]; /* Link to new mutex owner's OS_TCB */
00052e f857f857 LDR r1,[r7,r0,LSL #2]
000532 6061 STR r1,[r4,#4]
;;;584 if (prio <= pip) { /* PIP 'must' have a SMALLER prio ... */
000534 42a8 CMP r0,r5
000536 d807 BHI |L1.1352|
;;;585 OS_EXIT_CRITICAL(); /* ... than current task! */
000538 4630 MOV r0,r6
00053a f7fff7ff BL OS_CPU_SR_Restore
;;;586 OS_Sched(); /* Find highest priority task ready to run */
00053e f7fff7ff BL OS_Sched
;;;587 return (OS_ERR_PIP_LOWER);
000542 2078 MOVS r0,#0x78
000544 e8bde8bd POP {r4-r8,pc}
|L1.1352|
;;;588 } else {
;;;589 OS_EXIT_CRITICAL();
000548 4630 MOV r0,r6
00054a f7fff7ff BL OS_CPU_SR_Restore
;;;590 OS_Sched(); /* Find highest priority task ready to run */
00054e f7fff7ff BL OS_Sched
;;;591 return (OS_ERR_NONE);
000552 2000 MOVS r0,#0
000554 e8bde8bd POP {r4-r8,pc}
|L1.1368|
;;;592 }
;;;593 }
;;;594 pevent->OSEventCnt |= OS_MUTEX_AVAILABLE; /* No, Mutex is now available */
000558 8920 LDRH r0,[r4,#8]
00055a f040f040 ORR r0,r0,#0xff
00055e 8120 STRH r0,[r4,#8]
;;;595 pevent->OSEventPtr = (void *)0;
000560 2000 MOVS r0,#0
000562 6060 STR r0,[r4,#4]
;;;596 OS_EXIT_CRITICAL();
000564 4630 MOV r0,r6
000566 f7fff7ff BL OS_CPU_SR_Restore
;;;597 return (OS_ERR_NONE);
00056a 2000 MOVS r0,#0
;;;598 }
00056c e8bde8bd POP {r4-r8,pc}
;;;599 /*$PAGE*/
ENDP
OSMutexQuery PROC
;;;619 INT8U OSMutexQuery (OS_EVENT *pevent, OS_MUTEX_DATA *p_mutex_data)
;;;620 {
000570 b570 PUSH {r4-r6,lr}
000572 4605 MOV r5,r0
000574 460c MOV r4,r1
;;;621 INT8U i;
;;;622 #if OS_LOWEST_PRIO <= 63
;;;623 INT8U *psrc;
;;;624 INT8U *pdest;
;;;625 #else
;;;626 INT16U *psrc;
;;;627 INT16U *pdest;
;;;628 #endif
;;;629 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;630 OS_CPU_SR cpu_sr = 0;
;;;631 #endif
;;;632
;;;633
;;;634
;;;635 if (OSIntNesting > 0) { /* See if called from ISR ... */
000576 4819 LDR r0,|L1.1500|
000578 7800 LDRB r0,[r0,#0] ; OSIntNesting
00057a b108 CBZ r0,|L1.1408|
;;;636 return (OS_ERR_QUERY_ISR); /* ... can't QUERY mutex from an ISR */
00057c 2006 MOVS r0,#6
;;;637 }
;;;638 #if OS_ARG_CHK_EN > 0
;;;639 if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
;;;640 return (OS_ERR_PEVENT_NULL);
;;;641 }
;;;642 if (p_mutex_data == (OS_MUTEX_DATA *)0) { /* Validate 'p_mutex_data' */
;;;643 return (OS_ERR_PDATA_NULL);
;;;644 }
;;;645 #endif
;;;646 if (pevent->OSEventType != OS_EVENT_TYPE_MUTEX) { /* Validate event block type */
;;;647 return (OS_ERR_EVENT_TYPE);
;;;648 }
;;;649 OS_ENTER_CRITICAL();
;;;650 p_mutex_data->OSMutexPIP = (INT8U)(pevent->OSEventCnt >> 8);
;;;651 p_mutex_data->OSOwnerPrio = (INT8U)(pevent->OSEventCnt & OS_MUTEX_KEEP_LOWER_8);
;;;652 if (p_mutex_data->OSOwnerPrio == 0xFF) {
;;;653 p_mutex_data->OSValue = OS_TRUE;
;;;654 } else {
;;;655 p_mutex_data->OSValue = OS_FALSE;
;;;656 }
;;;657 p_mutex_data->OSEventGrp = pevent->OSEventGrp; /* Copy wait list */
;;;658 psrc = &pevent->OSEventTbl[0];
;;;659 pdest = &p_mutex_data->OSEventTbl[0];
;;;660 for (i = 0; i < OS_EVENT_TBL_SIZE; i++) {
;;;661 *pdest++ = *psrc++;
;;;662 }
;;;663 OS_EXIT_CRITICAL();
;;;664 return (OS_ERR_NONE);
;;;665 }
00057e bd70 POP {r4-r6,pc}
|L1.1408|
000580 b90d CBNZ r5,|L1.1414|
000582 2004 MOVS r0,#4
000584 bd70 POP {r4-r6,pc}
|L1.1414|
000586 b90c CBNZ r4,|L1.1420|
000588 2009 MOVS r0,#9
00058a bd70 POP {r4-r6,pc}
|L1.1420|
00058c 7828 LDRB r0,[r5,#0]
00058e 2804 CMP r0,#4
000590 d001 BEQ |L1.1430|
000592 2001 MOVS r0,#1
000594 bd70 POP {r4-r6,pc}
|L1.1430|
000596 f7fff7ff BL OS_CPU_SR_Save
00059a 8929 LDRH r1,[r5,#8]
00059c 0a09 LSRS r1,r1,#8
00059e 71e1 STRB r1,[r4,#7]
0005a0 8929 LDRH r1,[r5,#8]
0005a2 b2c9 UXTB r1,r1
0005a4 71a1 STRB r1,[r4,#6]
0005a6 29ff CMP r1,#0xff
0005a8 d102 BNE |L1.1456|
0005aa 2101 MOVS r1,#1
0005ac 7161 STRB r1,[r4,#5]
0005ae e001 B |L1.1460|
|L1.1456|
0005b0 2100 MOVS r1,#0
0005b2 7161 STRB r1,[r4,#5]
|L1.1460|
0005b4 7aa9 LDRB r1,[r5,#0xa]
0005b6 7121 STRB r1,[r4,#4]
0005b8 f105f105 ADD r1,r5,#0xb
0005bc 2200 MOVS r2,#0
|L1.1470|
0005be f811f811 LDRB r3,[r1],#1
0005c2 f804f804 STRB r3,[r4],#1
0005c6 1c52 ADDS r2,r2,#1
0005c8 b2d2 UXTB r2,r2
0005ca 2a04 CMP r2,#4
0005cc d3f7 BCC |L1.1470|
0005ce f7fff7ff BL OS_CPU_SR_Restore
0005d2 2000 MOVS r0,#0
0005d4 bd70 POP {r4-r6,pc}
;;;666 #endif /* OS_MUTEX_QUERY_EN */
ENDP
0005d6 0000 DCW 0x0000
|L1.1496|
0005d8 00000000 DCD OSTCBPrioTbl
|L1.1500|
0005dc 00000000 DCD OSIntNesting
|L1.1504|
0005e0 00000000 DCD OSTCBCur
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -