📄 os_mutex.txt
字号:
;;;518 OS_EXIT_CRITICAL();
;;;519 *perr = OS_ERR_NONE;
;;;520 }
000590 e8bd4ffe POP {r1-r11,lr}
000594 e12fff1e BX lr
|L1.1432|
000598 e1a00008 MOV r0,r8 ;518
00059c e581901c STR r9,[r1,#0x1c] ;518
|L1.1440|
0005a0 ebfffffe BL OS_CPU_SR_Restore
0005a4 e5c49000 STRB r9,[r4,#0] ;445
0005a8 eafffff8 B |L1.1424|
;;;521 /*$PAGE*/
ENDP
OSMutexPost PROC
;;;546 INT8U OSMutexPost (OS_EVENT *pevent)
;;;547 {
0005ac e92d41f0 PUSH {r4-r8,lr}
0005b0 e1a04000 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 ... */
0005b4 e59f0188 LDR r0,|L1.1860|
0005b8 e5d00000 LDRB r0,[r0,#0] ; OSIntNesting
0005bc e3500000 CMP r0,#0
;;;557 return (OS_ERR_POST_ISR); /* ... can't POST mutex from an ISR */
0005c0 13a00005 MOVNE r0,#5
0005c4 1a000010 BNE |L1.1548|
;;;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 */
0005c8 e5d40000 LDRB r0,[r4,#0]
0005cc e3500004 CMP r0,#4
;;;565 return (OS_ERR_EVENT_TYPE);
0005d0 13a00001 MOVNE r0,#1
0005d4 1a00000c BNE |L1.1548|
;;;566 }
;;;567 OS_ENTER_CRITICAL();
0005d8 ebfffffe BL OS_CPU_SR_Save
0005dc e1a06000 MOV r6,r0
;;;568 pip = (INT8U)(pevent->OSEventCnt >> 8); /* Get priority inheritance priority of mutex */
0005e0 e1d400b8 LDRH r0,[r4,#8]
;;;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 */
0005e4 e5942004 LDR r2,[r4,#4]
0005e8 e1a05420 LSR r5,r0,#8 ;568
0005ec e20010ff AND r1,r0,#0xff ;569
0005f0 e59f0150 LDR r0,|L1.1864|
0005f4 e5900000 LDR r0,[r0,#0] ; OSTCBCur
0005f8 e1520000 CMP r2,r0
0005fc 0a000004 BEQ |L1.1556|
;;;571 OS_EXIT_CRITICAL();
000600 e1a00006 MOV r0,r6
000604 ebfffffe BL OS_CPU_SR_Restore
;;;572 return (OS_ERR_NOT_MUTEX_OWNER);
000608 e3a00064 MOV r0,#0x64
|L1.1548|
00060c e8bd41f0 POP {r4-r8,lr}
;;;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_RESERVED; /* 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 }
000610 e12fff1e BX lr
|L1.1556|
000614 e5d0202e LDRB r2,[r0,#0x2e] ;574
000618 e1520005 CMP r2,r5 ;574
00061c 0bfffffe BLEQ OSMutex_RdyAtPrio
000620 e59f7124 LDR r7,|L1.1868|
000624 e3a00001 MOV r0,#1 ;577
000628 e7870105 STR r0,[r7,r5,LSL #2] ;577
00062c e5d4000a LDRB r0,[r4,#0xa] ;578
000630 e3500000 CMP r0,#0 ;578
000634 0a000015 BEQ |L1.1680|
000638 e3a03000 MOV r3,#0 ;580
00063c e3a02010 MOV r2,#0x10 ;580
000640 e1a01003 MOV r1,r3 ;580
000644 e1a00004 MOV r0,r4 ;580
000648 ebfffffe BL OS_EventTaskRdy
00064c e1d410b8 LDRH r1,[r4,#8] ;581
000650 e1500005 CMP r0,r5 ;584
000654 e2011cff AND r1,r1,#0xff00 ;581
000658 e1811000 ORR r1,r1,r0 ;582
00065c e1c410b8 STRH r1,[r4,#8] ;582
000660 e7971100 LDR r1,[r7,r0,LSL #2] ;583
000664 e1a00006 MOV r0,r6 ;585
000668 e5841004 STR r1,[r4,#4] ;585
00066c 8a000003 BHI |L1.1664|
000670 ebfffffe BL OS_CPU_SR_Restore
000674 ebfffffe BL OS_Sched
000678 e3a00078 MOV r0,#0x78 ;587
00067c eaffffe2 B |L1.1548|
|L1.1664|
000680 ebfffffe BL OS_CPU_SR_Restore
000684 ebfffffe BL OS_Sched
|L1.1672|
000688 e3a00000 MOV r0,#0 ;597
00068c eaffffde B |L1.1548|
|L1.1680|
000690 e1d400b8 LDRH r0,[r4,#8] ;594
000694 e38000ff ORR r0,r0,#0xff ;594
000698 e1c400b8 STRH r0,[r4,#8] ;594
00069c e3a00000 MOV r0,#0 ;595
0006a0 e5840004 STR r0,[r4,#4] ;595
0006a4 e1a00006 MOV r0,r6 ;596
0006a8 ebfffffe BL OS_CPU_SR_Restore
0006ac eafffff5 B |L1.1672|
;;;599 /*$PAGE*/
ENDP
OSMutexQuery PROC
;;;619 INT8U OSMutexQuery (OS_EVENT *pevent, OS_MUTEX_DATA *p_mutex_data)
;;;620 {
0006b0 e92d4070 PUSH {r4-r6,lr}
0006b4 e1a05000 MOV r5,r0
;;;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 ... */
0006b8 e59f0084 LDR r0,|L1.1860|
0006bc e1a04001 MOV r4,r1 ;620
0006c0 e5d00000 LDRB r0,[r0,#0] ; OSIntNesting
0006c4 e3500000 CMP r0,#0
;;;636 return (OS_ERR_QUERY_ISR); /* ... can't QUERY mutex from an ISR */
0006c8 13a00006 MOVNE r0,#6
0006cc 1a00001a BNE |L1.1852|
;;;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 */
0006d0 e5d50000 LDRB r0,[r5,#0]
0006d4 e3500004 CMP r0,#4
;;;647 return (OS_ERR_EVENT_TYPE);
0006d8 13a00001 MOVNE r0,#1
0006dc 1a000016 BNE |L1.1852|
;;;648 }
;;;649 OS_ENTER_CRITICAL();
0006e0 ebfffffe BL OS_CPU_SR_Save
;;;650 p_mutex_data->OSMutexPIP = (INT8U)(pevent->OSEventCnt >> 8);
0006e4 e1d510b8 LDRH r1,[r5,#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++) {
0006e8 e3a02000 MOV r2,#0
0006ec e1a01421 LSR r1,r1,#8 ;650
0006f0 e5c41007 STRB r1,[r4,#7] ;650
0006f4 e1d510b8 LDRH r1,[r5,#8] ;651
0006f8 e20110ff AND r1,r1,#0xff ;651
0006fc e35100ff CMP r1,#0xff ;652
000700 e5c41006 STRB r1,[r4,#6] ;651
000704 13a01000 MOVNE r1,#0 ;655
000708 03a01001 MOVEQ r1,#1 ;653
00070c e5c41005 STRB r1,[r4,#5] ;655
000710 e5d5100a LDRB r1,[r5,#0xa] ;657
000714 e5c41004 STRB r1,[r4,#4] ;657
000718 e285100b ADD r1,r5,#0xb ;658
|L1.1820|
;;;661 *pdest++ = *psrc++;
00071c e4d13001 LDRB r3,[r1],#1
000720 e2822001 ADD r2,r2,#1 ;660
000724 e20220ff AND r2,r2,#0xff ;660
000728 e3520004 CMP r2,#4 ;660
00072c e4c43001 STRB r3,[r4],#1
000730 3afffff9 BCC |L1.1820|
;;;662 }
;;;663 OS_EXIT_CRITICAL();
000734 ebfffffe BL OS_CPU_SR_Restore
;;;664 return (OS_ERR_NONE);
000738 e3a00000 MOV r0,#0
|L1.1852|
00073c e8bd4070 POP {r4-r6,lr}
;;;665 }
000740 e12fff1e BX lr
;;;666 #endif /* OS_MUTEX_QUERY_EN */
ENDP
|L1.1860|
000744 00000000 DCD OSIntNesting
|L1.1864|
000748 00000000 DCD OSTCBCur
|L1.1868|
00074c 00000000 DCD OSTCBPrioTbl
|L1.1872|
000750 00000000 DCD OSEventFreeList
|L1.1876|
000754 00000000 DCD OSRdyTbl
|L1.1880|
000758 00000000 DCD OSRdyGrp
|L1.1884|
00075c 00000000 DCD OSLockNesting
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -