os_mutex.txt
来自「针对STM32F103的UCOS移植」· 文本 代码 · 共 1,096 行 · 第 1/5 页
TXT
1,096 行
; generated by ARM/Thumb C/C++ Compiler with , RVCT3.1 [Build 942] for uVision
; commandline ArmCC [--debug -c --asm --interleave -o.\rvmdk\os_mutex.o --depend=.\rvmdk\os_mutex.d --device=DARMSTM --apcs=interwork -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 -IC:\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 ;98
000010 7020 STRB r0,[r4,#0] ;98
000012 2000 MOVS r0,#0 ;99
000014 bd70 POP {r4-r6,pc}
|L1.22|
000016 7828 LDRB r0,[r5,#0] ;102
000018 2804 CMP r0,#4 ;102
00001a d003 BEQ |L1.36|
00001c 2001 MOVS r0,#1 ;103
00001e 7020 STRB r0,[r4,#0] ;103
000020 2000 MOVS r0,#0 ;104
000022 bd70 POP {r4-r6,pc}
|L1.36|
000024 48f8 LDR r0,|L1.1032|
000026 7800 LDRB r0,[r0,#0] ;106 ; OSIntNesting
000028 b118 CBZ r0,|L1.50|
00002a 2002 MOVS r0,#2 ;107
00002c 7020 STRB r0,[r4,#0] ;107
00002e 2000 MOVS r0,#0 ;108
000030 bd70 POP {r4-r6,pc}
|L1.50|
000032 f7fffffe BL OS_CPU_SR_Save
000036 8929 LDRH r1,[r5,#8] ;111
000038 0a0b LSRS r3,r1,#8 ;111
00003a 43ca MVNS r2,r1 ;112
00003c f0120fff TST r2,#0xff ;112
000040 f04f0600 MOV r6,#0 ;112
000044 d118 BNE |L1.120|
000046 f401427f AND r2,r1,#0xff00 ;113
00004a 812a STRH r2,[r5,#8] ;113
00004c 49ef LDR r1,|L1.1036|
00004e 6809 LDR r1,[r1,#0] ;114 ; OSTCBCur
000050 f891c02e LDRB r12,[r1,#0x2e] ;114
000054 ea42020c ORR r2,r2,r12 ;114
000058 812a STRH r2,[r5,#8] ;114
00005a 6069 STR r1,[r5,#4] ;115
00005c f891102e LDRB r1,[r1,#0x2e] ;116
000060 4299 CMP r1,r3 ;116
000062 d804 BHI |L1.110|
000064 f7fffffe BL OS_CPU_SR_Restore
000068 2078 MOVS r0,#0x78 ;118
00006a 7020 STRB r0,[r4,#0] ;118
00006c e002 B |L1.116|
|L1.110|
00006e f7fffffe BL OS_CPU_SR_Restore
000072 7026 STRB r6,[r4,#0] ;121
|L1.116|
000074 2001 MOVS r0,#1 ;123
000076 bd70 POP {r4-r6,pc}
|L1.120|
000078 f7fffffe BL OS_CPU_SR_Restore
00007c 7026 STRB r6,[r4,#0] ;126
00007e 2000 MOVS r0,#0 ;127
000080 bd70 POP {r4-r6,pc}
;;;129 #endif
ENDP
OSMutexCreate PROC
;;;166 OS_EVENT *OSMutexCreate (INT8U prio, INT8U *perr)
;;;167 {
000082 e92d41f0 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
;;;178 }
;;;179 if (prio >= OS_LOWEST_PRIO) { /* Validate PIP */
;;;180 *perr = OS_ERR_PRIO_INVALID;
;;;181 return ((OS_EVENT *)0);
;;;182 }
;;;183 #endif
;;;184 if (OSIntNesting > 0) { /* See if called from ISR ... */
;;;185 *perr = OS_ERR_CREATE_ISR; /* ... can't CREATE mutex from an ISR */
;;;186 return ((OS_EVENT *)0);
;;;187 }
;;;188 OS_ENTER_CRITICAL();
;;;189 if (OSTCBPrioTbl[prio] != (OS_TCB *)0) { /* Mutex priority must not already exist */
;;;190 OS_EXIT_CRITICAL(); /* Task already exist at priority ... */
;;;191 *perr = OS_ERR_PRIO_EXIST; /* ... inheritance priority */
;;;192 return ((OS_EVENT *)0);
;;;193 }
;;;194 OSTCBPrioTbl[prio] = OS_TCB_RESERVED; /* Reserve the table entry */
;;;195 pevent = OSEventFreeList; /* Get next free event control block */
;;;196 if (pevent == (OS_EVENT *)0) { /* See if an ECB was available */
;;;197 OSTCBPrioTbl[prio] = (OS_TCB *)0; /* No, Release the table entry */
;;;198 OS_EXIT_CRITICAL();
;;;199 *perr = OS_ERR_PEVENT_NULL; /* No more event control blocks */
;;;200 return (pevent);
;;;201 }
;;;202 OSEventFreeList = (OS_EVENT *)OSEventFreeList->OSEventPtr; /* Adjust the free list */
;;;203 OS_EXIT_CRITICAL();
;;;204 pevent->OSEventType = OS_EVENT_TYPE_MUTEX;
;;;205 pevent->OSEventCnt = (INT16U)((INT16U)prio << 8) | OS_MUTEX_AVAILABLE; /* Resource is avail. */
;;;206 pevent->OSEventPtr = (void *)0; /* No task owning the mutex */
;;;207 #if OS_EVENT_NAME_SIZE > 1
;;;208 pevent->OSEventName[0] = '?';
;;;209 pevent->OSEventName[1] = OS_ASCII_NUL;
;;;210 #endif
;;;211 OS_EventWaitListInit(pevent);
;;;212 *perr = OS_ERR_NONE;
;;;213 return (pevent);
;;;214 }
00008e e8bd81f0 POP {r4-r8,pc}
|L1.146|
000092 2e1f CMP r6,#0x1f ;179
000094 d304 BCC |L1.160|
000096 202a MOVS r0,#0x2a ;180
000098 7028 STRB r0,[r5,#0] ;180
00009a 2000 MOVS r0,#0 ;181
00009c e8bd81f0 POP {r4-r8,pc}
|L1.160|
0000a0 48d9 LDR r0,|L1.1032|
0000a2 7800 LDRB r0,[r0,#0] ;184 ; OSIntNesting
0000a4 b120 CBZ r0,|L1.176|
0000a6 2010 MOVS r0,#0x10 ;185
0000a8 7028 STRB r0,[r5,#0] ;185
0000aa 2000 MOVS r0,#0 ;186
0000ac e8bd81f0 POP {r4-r8,pc}
|L1.176|
0000b0 f7fffffe BL OS_CPU_SR_Save
0000b4 49d6 LDR r1,|L1.1040|
0000b6 f8512026 LDR r2,[r1,r6,LSL #2] ;189
0000ba b132 CBZ r2,|L1.202|
0000bc f7fffffe BL OS_CPU_SR_Restore
0000c0 2028 MOVS r0,#0x28 ;191
0000c2 7028 STRB r0,[r5,#0] ;191
0000c4 2000 MOVS r0,#0 ;192
0000c6 e8bd81f0 POP {r4-r8,pc}
|L1.202|
0000ca 2201 MOVS r2,#1 ;194
0000cc f8412026 STR r2,[r1,r6,LSL #2] ;194
0000d0 4ad0 LDR r2,|L1.1044|
0000d2 6814 LDR r4,[r2,#0] ;195 ; OSEventFreeList
0000d4 2700 MOVS r7,#0 ;196
0000d6 f04f0804 MOV r8,#4 ;196
0000da b944 CBNZ r4,|L1.238|
0000dc f8417026 STR r7,[r1,r6,LSL #2] ;197
0000e0 f7fffffe BL OS_CPU_SR_Restore
0000e4 f8858000 STRB r8,[r5,#0] ;199
0000e8 4638 MOV r0,r7 ;200
0000ea e8bd81f0 POP {r4-r8,pc}
|L1.238|
0000ee 6861 LDR r1,[r4,#4] ;202
0000f0 6011 STR r1,[r2,#0] ;202 ; OSEventFreeList
0000f2 f7fffffe BL OS_CPU_SR_Restore
0000f6 f8848000 STRB r8,[r4,#0] ;204
0000fa 20ff MOVS r0,#0xff ;205
0000fc ea402006 ORR r0,r0,r6,LSL #8 ;205
000100 8120 STRH r0,[r4,#8] ;205
000102 6067 STR r7,[r4,#4] ;206
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?