📄 os_mutex.txt
字号:
;;;558 }
;;;559 #if OS_ARG_CHK_EN > 0
;;;560 if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
;;;561 return (OS_ERR_PEVENT_NULL);
;;;562 }
;;;563 #endif
;;;564 if (pevent->OSEventType != OS_EVENT_TYPE_MUTEX) { /* Validate event block type */
;;;565 return (OS_ERR_EVENT_TYPE);
;;;566 }
;;;567 OS_ENTER_CRITICAL();
;;;568 pip = (INT8U)(pevent->OSEventCnt >> 8); /* Get priority inheritance priority of mutex */
;;;569 prio = (INT8U)(pevent->OSEventCnt & OS_MUTEX_KEEP_LOWER_8); /* Get owner's original priority */
;;;570 if (OSTCBCur != (OS_TCB *)pevent->OSEventPtr) { /* See if posting task owns the MUTEX */
;;;571 OS_EXIT_CRITICAL();
;;;572 return (OS_ERR_NOT_MUTEX_OWNER);
;;;573 }
;;;574 if (OSTCBCur->OSTCBPrio == pip) { /* Did we have to raise current task's priority? */
;;;575 OSMutex_RdyAtPrio(OSTCBCur, prio); /* Restore the task's original priority */
;;;576 }
;;;577 OSTCBPrioTbl[pip] = (OS_TCB *)1; /* Reserve table entry */
;;;578 if (pevent->OSEventGrp != 0) { /* Any task waiting for the mutex? */
;;;579 /* Yes, Make HPT waiting for mutex ready */
;;;580 prio = OS_EventTaskRdy(pevent, (void *)0, OS_STAT_MUTEX, OS_STAT_PEND_OK);
;;;581 pevent->OSEventCnt &= OS_MUTEX_KEEP_UPPER_8; /* Save priority of mutex's new owner */
;;;582 pevent->OSEventCnt |= prio;
;;;583 pevent->OSEventPtr = OSTCBPrioTbl[prio]; /* Link to new mutex owner's OS_TCB */
;;;584 if (prio <= pip) { /* PIP 'must' have a SMALLER prio ... */
;;;585 OS_EXIT_CRITICAL(); /* ... than current task! */
;;;586 OS_Sched(); /* Find highest priority task ready to run */
;;;587 return (OS_ERR_PIP_LOWER);
;;;588 } else {
;;;589 OS_EXIT_CRITICAL();
;;;590 OS_Sched(); /* Find highest priority task ready to run */
;;;591 return (OS_ERR_NONE);
;;;592 }
;;;593 }
;;;594 pevent->OSEventCnt |= OS_MUTEX_AVAILABLE; /* No, Mutex is now available */
;;;595 pevent->OSEventPtr = (void *)0;
;;;596 OS_EXIT_CRITICAL();
;;;597 return (OS_ERR_NONE);
;;;598 }
00096c e12fff1e BX lr
|L1.2416|
000970 e3540000 CMP r4,#0
000974 1a000001 BNE |L1.2432|
000978 e3a00004 MOV r0,#4
00097c eafffff9 B |L1.2408|
|L1.2432|
000980 e5d40000 LDRB r0,[r4,#0]
000984 e3500004 CMP r0,#4
000988 0a000001 BEQ |L1.2452|
00098c e3a00001 MOV r0,#1
000990 eafffff4 B |L1.2408|
|L1.2452|
000994 ebfffffe BL OS_CPU_SR_Save
000998 e1a07000 MOV r7,r0
00099c e1d400b8 LDRH r0,[r4,#8]
0009a0 e1a05440 ASR r5,r0,#8
0009a4 e1d400b8 LDRH r0,[r4,#8]
0009a8 e20060ff AND r6,r0,#0xff
0009ac e59f11c8 LDR r1,|L1.2940|
0009b0 e5940004 LDR r0,[r4,#4]
0009b4 e5911000 LDR r1,[r1,#0] ; OSTCBCur
0009b8 e1500001 CMP r0,r1
0009bc 0a000003 BEQ |L1.2512|
0009c0 e1a00007 MOV r0,r7
0009c4 ebfffffe BL OS_CPU_SR_Restore
0009c8 e3a00064 MOV r0,#0x64
0009cc eaffffe5 B |L1.2408|
|L1.2512|
0009d0 e59f01a4 LDR r0,|L1.2940|
0009d4 e5900000 LDR r0,[r0,#0] ; OSTCBCur
0009d8 e5d0002e LDRB r0,[r0,#0x2e]
0009dc e1500005 CMP r0,r5
0009e0 1a000003 BNE |L1.2548|
0009e4 e1a01006 MOV r1,r6
0009e8 e59f018c LDR r0,|L1.2940|
0009ec e5900000 LDR r0,[r0,#0] ; OSTCBCur
0009f0 ebfffffe BL OSMutex_RdyAtPrio
|L1.2548|
0009f4 e3a00001 MOV r0,#1
0009f8 e59f1180 LDR r1,|L1.2944|
0009fc e7810105 STR r0,[r1,r5,LSL #2]
000a00 e5d4000a LDRB r0,[r4,#0xa]
000a04 e3500000 CMP r0,#0
000a08 0a00001a BEQ |L1.2680|
000a0c e3a03000 MOV r3,#0
000a10 e3a02010 MOV r2,#0x10
000a14 e1a01003 MOV r1,r3
000a18 e1a00004 MOV r0,r4
000a1c ebfffffe BL OS_EventTaskRdy
000a20 e1a06000 MOV r6,r0
000a24 e1d400b8 LDRH r0,[r4,#8]
000a28 e2000cff AND r0,r0,#0xff00
000a2c e1c400b8 STRH r0,[r4,#8]
000a30 e1d400b8 LDRH r0,[r4,#8]
000a34 e1800006 ORR r0,r0,r6
000a38 e1c400b8 STRH r0,[r4,#8]
000a3c e59f013c LDR r0,|L1.2944|
000a40 e7900106 LDR r0,[r0,r6,LSL #2]
000a44 e5840004 STR r0,[r4,#4]
000a48 e1560005 CMP r6,r5
000a4c ca000004 BGT |L1.2660|
000a50 e1a00007 MOV r0,r7
000a54 ebfffffe BL OS_CPU_SR_Restore
000a58 ebfffffe BL OS_Sched
000a5c e3a00078 MOV r0,#0x78
000a60 eaffffc0 B |L1.2408|
|L1.2660|
000a64 e1a00007 MOV r0,r7
000a68 ebfffffe BL OS_CPU_SR_Restore
000a6c ebfffffe BL OS_Sched
000a70 e3a00000 MOV r0,#0
000a74 eaffffbb B |L1.2408|
|L1.2680|
000a78 e1d400b8 LDRH r0,[r4,#8]
000a7c e38000ff ORR r0,r0,#0xff
000a80 e1c400b8 STRH r0,[r4,#8]
000a84 e3a00000 MOV r0,#0
000a88 e5840004 STR r0,[r4,#4]
000a8c e1a00007 MOV r0,r7
000a90 ebfffffe BL OS_CPU_SR_Restore
000a94 e3a00000 MOV r0,#0
000a98 eaffffb2 B |L1.2408|
ENDP
OSMutexQuery PROC
;;;619 INT8U OSMutexQuery (OS_EVENT *pevent, OS_MUTEX_DATA *p_mutex_data)
;;;620 {
000a9c e92d47f0 PUSH {r4-r10,lr}
000aa0 e1a04000 MOV r4,r0
000aa4 e1a05001 MOV r5,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;
000aa8 e3a09000 MOV r9,#0
;;;631 #endif
;;;632
;;;633
;;;634
;;;635 if (OSIntNesting > 0) { /* See if called from ISR ... */
000aac e59f00c4 LDR r0,|L1.2936|
000ab0 e5d00000 LDRB r0,[r0,#0] ; OSIntNesting
000ab4 e3500000 CMP r0,#0
000ab8 da000002 BLE |L1.2760|
;;;636 return (OS_ERR_QUERY_ISR); /* ... can't QUERY mutex from an ISR */
000abc e3a00006 MOV r0,#6
|L1.2752|
000ac0 e8bd47f0 POP {r4-r10,lr}
;;;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 = 1;
;;;654 } else {
;;;655 p_mutex_data->OSValue = 0;
;;;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 }
000ac4 e12fff1e BX lr
|L1.2760|
000ac8 e3540000 CMP r4,#0
000acc 1a000001 BNE |L1.2776|
000ad0 e3a00004 MOV r0,#4
000ad4 eafffff9 B |L1.2752|
|L1.2776|
000ad8 e3550000 CMP r5,#0
000adc 1a000001 BNE |L1.2792|
000ae0 e3a00009 MOV r0,#9
000ae4 eafffff5 B |L1.2752|
|L1.2792|
000ae8 e5d40000 LDRB r0,[r4,#0]
000aec e3500004 CMP r0,#4
000af0 0a000001 BEQ |L1.2812|
000af4 e3a00001 MOV r0,#1
000af8 eafffff0 B |L1.2752|
|L1.2812|
000afc ebfffffe BL OS_CPU_SR_Save
000b00 e1a09000 MOV r9,r0
000b04 e1d400b8 LDRH r0,[r4,#8]
000b08 e1a00440 ASR r0,r0,#8
000b0c e5c50007 STRB r0,[r5,#7]
000b10 e1d400b8 LDRH r0,[r4,#8]
000b14 e5c50006 STRB r0,[r5,#6]
000b18 e5d50006 LDRB r0,[r5,#6]
000b1c e35000ff CMP r0,#0xff
000b20 1a000002 BNE |L1.2864|
000b24 e3a00001 MOV r0,#1
000b28 e5c50005 STRB r0,[r5,#5]
000b2c ea000001 B |L1.2872|
|L1.2864|
000b30 e3a00000 MOV r0,#0
000b34 e5c50005 STRB r0,[r5,#5]
|L1.2872|
000b38 e5d4000a LDRB r0,[r4,#0xa]
000b3c e5c50004 STRB r0,[r5,#4]
000b40 e284800b ADD r8,r4,#0xb
000b44 e1a07005 MOV r7,r5
000b48 e3a06000 MOV r6,#0
000b4c ea000003 B |L1.2912|
|L1.2896|
000b50 e4d80001 LDRB r0,[r8],#1
000b54 e4c70001 STRB r0,[r7],#1
000b58 e2860001 ADD r0,r6,#1
000b5c e20060ff AND r6,r0,#0xff
|L1.2912|
000b60 e3560004 CMP r6,#4
000b64 bafffff9 BLT |L1.2896|
000b68 e1a00009 MOV r0,r9
000b6c ebfffffe BL OS_CPU_SR_Restore
000b70 e3a00000 MOV r0,#0
000b74 eaffffd1 B |L1.2752|
ENDP
|L1.2936|
000b78 00000000 DCD OSIntNesting
|L1.2940|
000b7c 00000000 DCD OSTCBCur
|L1.2944|
000b80 00000000 DCD OSTCBPrioTbl
|L1.2948|
000b84 00000000 DCD OSEventFreeList
|L1.2952|
000b88 00000000 DCD OSRdyTbl
|L1.2956|
000b8c 00000000 DCD OSRdyGrp
|L1.2960|
000b90 00000000 DCD OSLockNesting
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -