📄 os_sem.txt
字号:
; generated by ARM/Thumb C/C++ Compiler with , RVCT3.1 [Build 919] for uVision
; commandline ArmCC [--debug -c --asm --interleave -o.\output\os_sem.o --depend=.\output\os_sem.d --device=DARMSTM --apcs=interwork -O1 -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 -IC:\Keil\ARM\INC\ST\STM32F10x --omf_browse=.\output\os_sem.crf ..\..\..\..\..\uCOS-II\Source\os_sem.c]
THUMB
AREA ||.text||, CODE, READONLY, ALIGN=2
OSSemAccept PROC
;;;49 INT16U OSSemAccept (OS_EVENT *pevent)
;;;50 {
000000 b570 PUSH {r4-r6,lr}
000002 4605 MOV r5,r0
;;;51 INT16U cnt;
;;;52 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;53 OS_CPU_SR cpu_sr = 0;
;;;54 #endif
;;;55
;;;56
;;;57
;;;58 #if OS_ARG_CHK_EN > 0
;;;59 if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
;;;60 return (0);
;;;61 }
;;;62 #endif
;;;63 if (pevent->OSEventType != OS_EVENT_TYPE_SEM) { /* Validate event block type */
000004 7828 LDRB r0,[r5,#0]
000006 2803 CMP r0,#3
000008 d001 BEQ |L1.14|
;;;64 return (0);
00000a 2000 MOVS r0,#0
;;;65 }
;;;66 OS_ENTER_CRITICAL();
;;;67 cnt = pevent->OSEventCnt;
;;;68 if (cnt > 0) { /* See if resource is available */
;;;69 pevent->OSEventCnt--; /* Yes, decrement semaphore and notify caller */
;;;70 }
;;;71 OS_EXIT_CRITICAL();
;;;72 return (cnt); /* Return semaphore count */
;;;73 }
00000c bd70 POP {r4-r6,pc}
|L1.14|
00000e f7fff7ff BL OS_CPU_SR_Save
000012 892c LDRH r4,[r5,#8] ;67
000014 b10c CBZ r4,|L1.26|
000016 1e61 SUBS r1,r4,#1 ;69
000018 8129 STRH r1,[r5,#8] ;69
|L1.26|
00001a f7fff7ff BL OS_CPU_SR_Restore
00001e 4620 MOV r0,r4 ;72
000020 bd70 POP {r4-r6,pc}
;;;74 #endif
ENDP
OSSemCreate PROC
;;;94 OS_EVENT *OSSemCreate (INT16U cnt)
;;;95 {
000022 b570 PUSH {r4-r6,lr}
000024 4605 MOV r5,r0
;;;96 OS_EVENT *pevent;
;;;97 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;98 OS_CPU_SR cpu_sr = 0;
;;;99 #endif
;;;100
;;;101
;;;102
;;;103 if (OSIntNesting > 0) { /* See if called from ISR ... */
000026 48bf LDR r0,|L1.804|
000028 7800 LDRB r0,[r0,#0] ; OSIntNesting
00002a b108 CBZ r0,|L1.48|
;;;104 return ((OS_EVENT *)0); /* ... can't CREATE from an ISR */
00002c 2000 MOVS r0,#0
;;;105 }
;;;106 OS_ENTER_CRITICAL();
;;;107 pevent = OSEventFreeList; /* Get next free event control block */
;;;108 if (OSEventFreeList != (OS_EVENT *)0) { /* See if pool of free ECB pool was empty */
;;;109 OSEventFreeList = (OS_EVENT *)OSEventFreeList->OSEventPtr;
;;;110 }
;;;111 OS_EXIT_CRITICAL();
;;;112 if (pevent != (OS_EVENT *)0) { /* Get an event control block */
;;;113 pevent->OSEventType = OS_EVENT_TYPE_SEM;
;;;114 pevent->OSEventCnt = cnt; /* Set semaphore value */
;;;115 pevent->OSEventPtr = (void *)0; /* Unlink from ECB free list */
;;;116 #if OS_EVENT_NAME_SIZE > 1
;;;117 pevent->OSEventName[0] = '?'; /* Unknown name */
;;;118 pevent->OSEventName[1] = OS_ASCII_NUL;
;;;119 #endif
;;;120 OS_EventWaitListInit(pevent); /* Initialize to 'nobody waiting' on sem. */
;;;121 }
;;;122 return (pevent);
;;;123 }
00002e bd70 POP {r4-r6,pc}
|L1.48|
000030 f7fff7ff BL OS_CPU_SR_Save
000034 49bc LDR r1,|L1.808|
000036 680c LDR r4,[r1,#0] ;107 ; OSEventFreeList
000038 b10c CBZ r4,|L1.62|
00003a 6862 LDR r2,[r4,#4] ;109
00003c 600a STR r2,[r1,#0] ;109 ; OSEventFreeList
|L1.62|
00003e f7fff7ff BL OS_CPU_SR_Restore
000042 b154 CBZ r4,|L1.90|
000044 2003 MOVS r0,#3 ;113
000046 7020 STRB r0,[r4,#0] ;113
000048 8125 STRH r5,[r4,#8] ;114
00004a 2000 MOVS r0,#0 ;115
00004c 6060 STR r0,[r4,#4] ;115
00004e 213f MOVS r1,#0x3f ;117
000050 73e1 STRB r1,[r4,#0xf] ;117
000052 7420 STRB r0,[r4,#0x10] ;118
000054 4620 MOV r0,r4 ;120
000056 f7fff7ff BL OS_EventWaitListInit
|L1.90|
00005a 4620 MOV r0,r4 ;122
00005c bd70 POP {r4-r6,pc}
;;;124
ENDP
OSSemDel PROC
;;;164 OS_EVENT *OSSemDel (OS_EVENT *pevent, INT8U opt, INT8U *perr)
;;;165 {
00005e e92de92d PUSH {r4-r12,lr}
000062 4604 MOV r4,r0
000064 468b MOV r11,r1
000066 4615 MOV r5,r2
;;;166 BOOLEAN tasks_waiting;
;;;167 OS_EVENT *pevent_return;
;;;168 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;169 OS_CPU_SR cpu_sr = 0;
;;;170 #endif
;;;171
;;;172
;;;173
;;;174 #if OS_ARG_CHK_EN > 0
;;;175 if (perr == (INT8U *)0) { /* Validate 'perr' */
;;;176 return (pevent);
;;;177 }
;;;178 if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
;;;179 *perr = OS_ERR_PEVENT_NULL;
;;;180 return (pevent);
;;;181 }
;;;182 #endif
;;;183 if (pevent->OSEventType != OS_EVENT_TYPE_SEM) { /* Validate event block type */
000068 7820 LDRB r0,[r4,#0]
00006a 2803 CMP r0,#3
00006c d004 BEQ |L1.120|
;;;184 *perr = OS_ERR_EVENT_TYPE;
00006e 2001 MOVS r0,#1
000070 7028 STRB r0,[r5,#0]
;;;185 return (pevent);
000072 4620 MOV r0,r4
|L1.116|
;;;186 }
;;;187 if (OSIntNesting > 0) { /* See if called from ISR ... */
;;;188 *perr = OS_ERR_DEL_ISR; /* ... can't DELETE from an ISR */
;;;189 return (pevent);
;;;190 }
;;;191 OS_ENTER_CRITICAL();
;;;192 if (pevent->OSEventGrp != 0) { /* See if any tasks waiting on semaphore */
;;;193 tasks_waiting = OS_TRUE; /* Yes */
;;;194 } else {
;;;195 tasks_waiting = OS_FALSE; /* No */
;;;196 }
;;;197 switch (opt) {
;;;198 case OS_DEL_NO_PEND: /* Delete semaphore only if no task waiting */
;;;199 if (tasks_waiting == OS_FALSE) {
;;;200 #if OS_EVENT_NAME_SIZE > 1
;;;201 pevent->OSEventName[0] = '?'; /* Unknown name */
;;;202 pevent->OSEventName[1] = OS_ASCII_NUL;
;;;203 #endif
;;;204 pevent->OSEventType = OS_EVENT_TYPE_UNUSED;
;;;205 pevent->OSEventPtr = OSEventFreeList; /* Return Event Control Block to free list */
;;;206 pevent->OSEventCnt = 0;
;;;207 OSEventFreeList = pevent; /* Get next free event control block */
;;;208 OS_EXIT_CRITICAL();
;;;209 *perr = OS_ERR_NONE;
;;;210 pevent_return = (OS_EVENT *)0; /* Semaphore has been deleted */
;;;211 } else {
;;;212 OS_EXIT_CRITICAL();
;;;213 *perr = OS_ERR_TASK_WAITING;
;;;214 pevent_return = pevent;
;;;215 }
;;;216 break;
;;;217
;;;218 case OS_DEL_ALWAYS: /* Always delete the semaphore */
;;;219 while (pevent->OSEventGrp != 0) { /* Ready ALL tasks waiting for semaphore */
;;;220 (void)OS_EventTaskRdy(pevent, (void *)0, OS_STAT_SEM, OS_STAT_PEND_OK);
;;;221 }
;;;222 #if OS_EVENT_NAME_SIZE > 1
;;;223 pevent->OSEventName[0] = '?'; /* Unknown name */
;;;224 pevent->OSEventName[1] = OS_ASCII_NUL;
;;;225 #endif
;;;226 pevent->OSEventType = OS_EVENT_TYPE_UNUSED;
;;;227 pevent->OSEventPtr = OSEventFreeList; /* Return Event Control Block to free list */
;;;228 pevent->OSEventCnt = 0;
;;;229 OSEventFreeList = pevent; /* Get next free event control block */
;;;230 OS_EXIT_CRITICAL();
;;;231 if (tasks_waiting == OS_TRUE) { /* Reschedule only if task(s) were waiting */
;;;232 OS_Sched(); /* Find highest priority task ready to run */
;;;233 }
;;;234 *perr = OS_ERR_NONE;
;;;235 pevent_return = (OS_EVENT *)0; /* Semaphore has been deleted */
;;;236 break;
;;;237
;;;238 default:
;;;239 OS_EXIT_CRITICAL();
;;;240 *perr = OS_ERR_INVALID_OPT;
;;;241 pevent_return = pevent;
;;;242 break;
;;;243 }
;;;244 return (pevent_return);
;;;245 }
000074 e8bde8bd POP {r4-r12,pc}
|L1.120|
000078 48aa LDR r0,|L1.804|
00007a 7800 LDRB r0,[r0,#0] ;187 ; OSIntNesting
00007c b118 CBZ r0,|L1.134|
00007e 200f MOVS r0,#0xf ;188
000080 7028 STRB r0,[r5,#0] ;188
000082 4620 MOV r0,r4 ;189
000084 e7f6 B |L1.116|
|L1.134|
000086 f7fff7ff BL OS_CPU_SR_Save
00008a 4607 MOV r7,r0 ;191
00008c 7aa0 LDRB r0,[r4,#0xa] ;192
00008e b108 CBZ r0,|L1.148|
000090 2601 MOVS r6,#1 ;193
000092 e000 B |L1.150|
|L1.148|
000094 2600 MOVS r6,#0 ;195
|L1.150|
000096 f8dff8df LDR r9,|L1.808|
00009a f04ff04f MOV r8,#0x3f ;197
00009e f04ff04f MOV r10,#0 ;197
0000a2 f1bbf1bb CMP r11,#0 ;197
0000a6 d003 BEQ |L1.176|
0000a8 f1bbf1bb CMP r11,#1 ;197
0000ac d13d BNE |L1.298|
0000ae e021 B |L1.244|
|L1.176|
0000b0 b99e CBNZ r6,|L1.218|
0000b2 f884f884 STRB r8,[r4,#0xf] ;201
0000b6 f884f884 STRB r10,[r4,#0x10] ;202
0000ba f884f884 STRB r10,[r4,#0] ;204
0000be f8d9f8d9 LDR r0,[r9,#0] ;205 ; OSEventFreeList
0000c2 6060 STR r0,[r4,#4] ;205
0000c4 f8a4f8a4 STRH r10,[r4,#8] ;206
0000c8 f8c9f8c9 STR r4,[r9,#0] ;207 ; OSEventFreeList
0000cc 4638 MOV r0,r7 ;208
0000ce f7fff7ff BL OS_CPU_SR_Restore
0000d2 f885f885 STRB r10,[r5,#0] ;209
0000d6 2000 MOVS r0,#0 ;210
0000d8 e7cc B |L1.116|
|L1.218|
0000da 4638 MOV r0,r7 ;212
0000dc f7fff7ff BL OS_CPU_SR_Restore
0000e0 2049 MOVS r0,#0x49 ;213
0000e2 7028 STRB r0,[r5,#0] ;213
0000e4 4620 MOV r0,r4 ;214
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -