📄 os_mutex.txt
字号:
; generated by ARM/Thumb C/C++ Compiler with , RVCT3.1 [Build 914] for uVision
; commandline ArmCC [--debug -c --asm --interleave -o.\rvmdk\os_mutex.o --depend=.\rvmdk\os_mutex.d --device=DARMSTM -O1 -Otime -I. -I..\BSP -I..\..\..\..\..\uCOS-II\Ports\arm-cortex-m3\Generic\RealView -I..\..\..\..\..\uCOS-II\Source -I..\..\..\..\..\CPU\ST\STM32\inc -I..\..\..\..\..\uC-CPU -I..\..\..\..\..\uC-CPU\Arm-Cortex-M3\RealView -I..\..\..\..\..\uC-LIB -I..\..\..\..\..\uC-Probe\Target\Plugins\uCOS-II -I..\..\..\..\..\uC-Probe\Target\Communication\Generic\Source -I..\..\..\..\..\uC-Probe\Target\Communication\Generic\RS-232\Ports\ST\STM32 -I..\..\..\..\..\uC-Probe\Target\Communication\Generic\RS-232\Source -ID:\Keil\ARM\INC\ST\STM32F10x ..\..\..\..\..\uCOS-II\Source\os_mutex.c]
THUMB
AREA ||.text||, CODE, READONLY, ALIGN=2
OSMutexAccept PROC
;;;84 BOOLEAN OSMutexAccept (OS_EVENT *pevent, INT8U *perr)
;;;85 {
000000 b570 PUSH {r4-r6,lr}
000002 4605 MOV r5,r0
000004 460c MOV r4,r1
;;;86 INT8U pip; /* Priority Inheritance Priority (PIP) */
;;;87 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;88 OS_CPU_SR cpu_sr = 0;
;;;89 #endif
;;;90
;;;91
;;;92
;;;93 #if OS_ARG_CHK_EN > 0
;;;94 if (perr == (INT8U *)0) { /* Validate 'perr' */
000006 b90c CBNZ r4,|L1.12|
;;;95 return (OS_FALSE);
000008 2000 MOVS r0,#0
;;;96 }
;;;97 if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
;;;98 *perr = OS_ERR_PEVENT_NULL;
;;;99 return (OS_FALSE);
;;;100 }
;;;101 #endif
;;;102 if (pevent->OSEventType != OS_EVENT_TYPE_MUTEX) { /* Validate event block type */
;;;103 *perr = OS_ERR_EVENT_TYPE;
;;;104 return (OS_FALSE);
;;;105 }
;;;106 if (OSIntNesting > 0) { /* Make sure it's not called from an ISR */
;;;107 *perr = OS_ERR_PEND_ISR;
;;;108 return (OS_FALSE);
;;;109 }
;;;110 OS_ENTER_CRITICAL(); /* Get value (0 or 1) of Mutex */
;;;111 pip = (INT8U)(pevent->OSEventCnt >> 8); /* Get PIP from mutex */
;;;112 if ((pevent->OSEventCnt & OS_MUTEX_KEEP_LOWER_8) == OS_MUTEX_AVAILABLE) {
;;;113 pevent->OSEventCnt &= OS_MUTEX_KEEP_UPPER_8; /* Mask off LSByte (Acquire Mutex) */
;;;114 pevent->OSEventCnt |= OSTCBCur->OSTCBPrio; /* Save current task priority in LSByte */
;;;115 pevent->OSEventPtr = (void *)OSTCBCur; /* Link TCB of task owning Mutex */
;;;116 if (OSTCBCur->OSTCBPrio <= pip) { /* PIP 'must' have a SMALLER prio ... */
;;;117 OS_EXIT_CRITICAL(); /* ... than current task! */
;;;118 *perr = OS_ERR_PIP_LOWER;
;;;119 } else {
;;;120 OS_EXIT_CRITICAL();
;;;121 *perr = OS_ERR_NONE;
;;;122 }
;;;123 return (OS_TRUE);
;;;124 }
;;;125 OS_EXIT_CRITICAL();
;;;126 *perr = OS_ERR_NONE;
;;;127 return (OS_FALSE);
;;;128 }
00000a bd70 POP {r4-r6,pc}
|L1.12|
00000c b91d CBNZ r5,|L1.22|
00000e 2004 MOVS r0,#4
000010 7020 STRB r0,[r4,#0]
000012 2000 MOVS r0,#0
000014 bd70 POP {r4-r6,pc}
|L1.22|
000016 7828 LDRB r0,[r5,#0]
000018 2804 CMP r0,#4
00001a d003 BEQ |L1.36|
00001c 2001 MOVS r0,#1
00001e 7020 STRB r0,[r4,#0]
000020 2000 MOVS r0,#0
000022 bd70 POP {r4-r6,pc}
|L1.36|
000024 48f8 LDR r0,|L1.1032|
000026 7800 LDRB r0,[r0,#0] ; OSIntNesting
000028 b118 CBZ r0,|L1.50|
00002a 2002 MOVS r0,#2
00002c 7020 STRB r0,[r4,#0]
00002e 2000 MOVS r0,#0
000030 bd70 POP {r4-r6,pc}
|L1.50|
000032 f7fff7ff BL OS_CPU_SR_Save
000036 8929 LDRH r1,[r5,#8]
000038 0a0b LSRS r3,r1,#8
00003a 43ca MVNS r2,r1
00003c f012f012 TST r2,#0xff
000040 f04ff04f MOV r6,#0
000044 d118 BNE |L1.120|
000046 f401f401 AND r2,r1,#0xff00
00004a 812a STRH r2,[r5,#8]
00004c 49ef LDR r1,|L1.1036|
00004e 6809 LDR r1,[r1,#0] ; OSTCBCur
000050 f891f891 LDRB r12,[r1,#0x2e]
000054 ea42ea42 ORR r2,r2,r12
000058 812a STRH r2,[r5,#8]
00005a 6069 STR r1,[r5,#4]
00005c f891f891 LDRB r1,[r1,#0x2e]
000060 4299 CMP r1,r3
000062 d804 BHI |L1.110|
000064 f7fff7ff BL OS_CPU_SR_Restore
000068 2078 MOVS r0,#0x78
00006a 7020 STRB r0,[r4,#0]
00006c e002 B |L1.116|
|L1.110|
00006e f7fff7ff BL OS_CPU_SR_Restore
000072 7026 STRB r6,[r4,#0]
|L1.116|
000074 2001 MOVS r0,#1
000076 bd70 POP {r4-r6,pc}
|L1.120|
000078 f7fff7ff BL OS_CPU_SR_Restore
00007c 7026 STRB r6,[r4,#0]
00007e 2000 MOVS r0,#0
000080 bd70 POP {r4-r6,pc}
;;;129 #endif
ENDP
OSMutexCreate PROC
;;;166 OS_EVENT *OSMutexCreate (INT8U prio, INT8U *perr)
;;;167 {
000082 e92de92d PUSH {r4-r8,lr}
000086 4606 MOV r6,r0
000088 460d MOV r5,r1
;;;168 OS_EVENT *pevent;
;;;169 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;170 OS_CPU_SR cpu_sr = 0;
;;;171 #endif
;;;172
;;;173
;;;174
;;;175 #if OS_ARG_CHK_EN > 0
;;;176 if (perr == (INT8U *)0) { /* Validate 'perr' */
00008a b915 CBNZ r5,|L1.146|
;;;177 return ((OS_EVENT *)0);
00008c 2000 MOVS r0,#0
00008e e8bde8bd POP {r4-r8,pc}
|L1.146|
;;;178 }
;;;179 if (prio >= OS_LOWEST_PRIO) { /* Validate PIP */
000092 2e1f CMP r6,#0x1f
000094 d304 BCC |L1.160|
;;;180 *perr = OS_ERR_PRIO_INVALID;
000096 202a MOVS r0,#0x2a
000098 7028 STRB r0,[r5,#0]
;;;181 return ((OS_EVENT *)0);
00009a 2000 MOVS r0,#0
00009c e8bde8bd POP {r4-r8,pc}
|L1.160|
;;;182 }
;;;183 #endif
;;;184 if (OSIntNesting > 0) { /* See if called from ISR ... */
0000a0 48d9 LDR r0,|L1.1032|
0000a2 7800 LDRB r0,[r0,#0] ; OSIntNesting
0000a4 b120 CBZ r0,|L1.176|
;;;185 *perr = OS_ERR_CREATE_ISR; /* ... can't CREATE mutex from an ISR */
0000a6 2010 MOVS r0,#0x10
0000a8 7028 STRB r0,[r5,#0]
;;;186 return ((OS_EVENT *)0);
0000aa 2000 MOVS r0,#0
0000ac e8bde8bd POP {r4-r8,pc}
|L1.176|
;;;187 }
;;;188 OS_ENTER_CRITICAL();
0000b0 f7fff7ff BL OS_CPU_SR_Save
;;;189 if (OSTCBPrioTbl[prio] != (OS_TCB *)0) { /* Mutex priority must not already exist */
0000b4 49d6 LDR r1,|L1.1040|
0000b6 f851f851 LDR r2,[r1,r6,LSL #2]
0000ba b132 CBZ r2,|L1.202|
;;;190 OS_EXIT_CRITICAL(); /* Task already exist at priority ... */
0000bc f7fff7ff BL OS_CPU_SR_Restore
;;;191 *perr = OS_ERR_PRIO_EXIST; /* ... inheritance priority */
0000c0 2028 MOVS r0,#0x28
0000c2 7028 STRB r0,[r5,#0]
;;;192 return ((OS_EVENT *)0);
0000c4 2000 MOVS r0,#0
0000c6 e8bde8bd POP {r4-r8,pc}
|L1.202|
;;;193 }
;;;194 OSTCBPrioTbl[prio] = OS_TCB_RESERVED; /* Reserve the table entry */
0000ca 2201 MOVS r2,#1
0000cc f841f841 STR r2,[r1,r6,LSL #2]
;;;195 pevent = OSEventFreeList; /* Get next free event control block */
0000d0 4ad0 LDR r2,|L1.1044|
0000d2 6814 LDR r4,[r2,#0] ; OSEventFreeList
;;;196 if (pevent == (OS_EVENT *)0) { /* See if an ECB was available */
0000d4 2700 MOVS r7,#0
0000d6 f04ff04f MOV r8,#4
0000da b944 CBNZ r4,|L1.238|
;;;197 OSTCBPrioTbl[prio] = (OS_TCB *)0; /* No, Release the table entry */
0000dc f841f841 STR r7,[r1,r6,LSL #2]
;;;198 OS_EXIT_CRITICAL();
0000e0 f7fff7ff BL OS_CPU_SR_Restore
;;;199 *perr = OS_ERR_PEVENT_NULL; /* No more event control blocks */
0000e4 f885f885 STRB r8,[r5,#0]
;;;200 return (pevent);
0000e8 4638 MOV r0,r7
0000ea e8bde8bd POP {r4-r8,pc}
|L1.238|
;;;201 }
;;;202 OSEventFreeList = (OS_EVENT *)OSEventFreeList->OSEventPtr; /* Adjust the free list */
0000ee 6861 LDR r1,[r4,#4]
0000f0 6011 STR r1,[r2,#0] ; OSEventFreeList
;;;203 OS_EXIT_CRITICAL();
0000f2 f7fff7ff BL OS_CPU_SR_Restore
;;;204 pevent->OSEventType = OS_EVENT_TYPE_MUTEX;
0000f6 f884f884 STRB r8,[r4,#0]
;;;205 pevent->OSEventCnt = (INT16U)((INT16U)prio << 8) | OS_MUTEX_AVAILABLE; /* Resource is avail. */
0000fa 20ff MOVS r0,#0xff
0000fc ea40ea40 ORR r0,r0,r6,LSL #8
000100 8120 STRH r0,[r4,#8]
;;;206 pevent->OSEventPtr = (void *)0; /* No task owning the mutex */
000102 6067 STR r7,[r4,#4]
;;;207 #if OS_EVENT_NAME_SIZE > 1
;;;208 pevent->OSEventName[0] = '?';
000104 203f MOVS r0,#0x3f
000106 73e0 STRB r0,[r4,#0xf]
;;;209 pevent->OSEventName[1] = OS_ASCII_NUL;
000108 7427 STRB r7,[r4,#0x10]
;;;210 #endif
;;;211 OS_EventWaitListInit(pevent);
00010a 4620 MOV r0,r4
00010c f7fff7ff BL OS_EventWaitListInit
;;;212 *perr = OS_ERR_NONE;
000110 702f STRB r7,[r5,#0]
;;;213 return (pevent);
000112 4620 MOV r0,r4
;;;214 }
000114 e8bde8bd POP {r4-r8,pc}
;;;215
ENDP
OSMutex_RdyAtPrio PROC
;;;683 static void OSMutex_RdyAtPrio (OS_TCB *ptcb, INT8U prio)
;;;684 {
000118 b470 PUSH {r4-r6}
;;;685 INT8U y;
;;;686
;;;687
;;;688 y = ptcb->OSTCBY; /* Remove owner from ready list at 'pip' */
00011a f890f890 LDRB r2,[r0,#0x30]
;;;689 OSRdyTbl[y] &= ~ptcb->OSTCBBitX;
00011e 4cbe LDR r4,|L1.1048|
000120 f890f890 LDRB r12,[r0,#0x31]
000124 5ca3 LDRB r3,[r4,r2]
000126 ea23ea23 BIC r3,r3,r12
00012a 54a3 STRB r3,[r4,r2]
;;;690 if (OSRdyTbl[y] == 0) {
00012c 5ca2 LDRB r2,[r4,r2]
00012e 4dbb LDR r5,|L1.1052|
000130 b92a CBNZ r2,|L1.318|
;;;691 OSRdyGrp &= ~ptcb->OSTCBBitY;
000132 f890f890 LDRB r2,[r0,#0x32]
000136 782b LDRB r3,[r5,#0] ; OSRdyGrp
000138 ea23ea23 BIC r2,r3,r2
00013c 702a STRB r2,[r5,#0] ; OSRdyGrp
|L1.318|
;;;692 }
;;;693 ptcb->OSTCBPrio = prio;
00013e f880f880 STRB r1,[r0,#0x2e]
;;;694 #if OS_LOWEST_PRIO <= 63
;;;695 ptcb->OSTCBY = (INT8U)((prio >> (INT8U)3) & (INT8U)0x07);
000142 f3c1f3c1 UBFX r2,r1,#3,#3
000146 f880f880 STRB r2,[r0,#0x30]
;;;696 ptcb->OSTCBX = (INT8U) (prio & (INT8U)0x07);
00014a f001f001 AND r3,r1,#7
00014e f880f880 STRB r3,[r0,#0x2f]
;;;697 ptcb->OSTCBBitY = (INT8U)(1 << ptcb->OSTCBY);
000152 f890f890 LDRB r2,[r0,#0x30]
000156 2601 MOVS r6,#1
000158 fa06fa06 LSL r12,r6,r2
00015c f880f880 STRB r12,[r0,#0x32]
;;;698 ptcb->OSTCBBitX = (INT8U)(1 << ptcb->OSTCBX);
000160 fa06fa06 LSL r3,r6,r3
000164 f880f880 STRB r3,[r0,#0x31]
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -