📄 os_sem.txt
字号:
; generated by ARM/Thumb C/C++ Compiler with , RVCT3.1 [Build 919] for uVision
; commandline ArmCC [--debug -c --asm --interleave -o.\rvmdk\os_sem.o --depend=.\rvmdk\os_sem.d --device=DARMP --apcs=interwork -I. -I..\BSP -I..\..\..\..\..\uCOS-II\Ports\ARM\Generic\RealView -I..\..\..\..\..\uCOS-II\Source -I..\..\..\..\..\uCOSView\Source -I..\..\..\..\..\uCOSView\Ports\ARM7\LPC2000\IAR -I..\..\..\..\..\uC-CPU -I..\..\..\..\..\uC-CPU\ARM\RealView -I..\..\..\..\..\uC-LIB -I..\..\..\..\..\uC-Probe\Target\Plugins\uCOS-II -IC:\Keil\ARM\INC\Philips --omf_browse=.\rvmdk\os_sem.crf ..\..\..\..\..\uCOS-II\Source\os_sem.c]
ARM
AREA ||.text||, CODE, READONLY, ALIGN=2
OSSemAccept PROC
;;;49 INT16U OSSemAccept (OS_EVENT *pevent)
;;;50 {
000000 e92d4070 PUSH {r4-r6,lr}
000004 e1a05000 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 */
000008 e5d00000 LDRB r0,[r0,#0]
00000c e3500003 CMP r0,#3
;;;64 return (0);
000010 13a00000 MOVNE r0,#0
000014 1a000006 BNE |L1.52|
;;;65 }
;;;66 OS_ENTER_CRITICAL();
000018 ebfffffe BL OS_CPU_SR_Save
;;;67 cnt = pevent->OSEventCnt;
00001c e1d540b8 LDRH r4,[r5,#8]
;;;68 if (cnt > 0) { /* See if resource is available */
000020 e3540000 CMP r4,#0
;;;69 pevent->OSEventCnt--; /* Yes, decrement semaphore and notify caller */
000024 12441001 SUBNE r1,r4,#1
000028 11c510b8 STRHNE r1,[r5,#8]
;;;70 }
;;;71 OS_EXIT_CRITICAL();
00002c ebfffffe BL OS_CPU_SR_Restore
;;;72 return (cnt); /* Return semaphore count */
000030 e1a00004 MOV r0,r4
|L1.52|
000034 e8bd4070 POP {r4-r6,lr}
;;;73 }
000038 e12fff1e BX lr
;;;74 #endif
ENDP
OSSemCreate PROC
;;;94 OS_EVENT *OSSemCreate (INT16U cnt)
;;;95 {
00003c e92d4070 PUSH {r4-r6,lr}
000040 e1a05000 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 ... */
000044 e59f0484 LDR r0,|L1.1232|
000048 e5d00000 LDRB r0,[r0,#0] ; OSIntNesting
00004c e3500000 CMP r0,#0
;;;104 return ((OS_EVENT *)0); /* ... can't CREATE from an ISR */
000050 13a00000 MOVNE r0,#0
000054 1a000013 BNE |L1.168|
;;;105 }
;;;106 OS_ENTER_CRITICAL();
000058 ebfffffe BL OS_CPU_SR_Save
;;;107 pevent = OSEventFreeList; /* Get next free event control block */
00005c e59f1470 LDR r1,|L1.1236|
000060 e5914000 LDR r4,[r1,#0] ; OSEventFreeList
;;;108 if (OSEventFreeList != (OS_EVENT *)0) { /* See if pool of free ECB pool was empty */
000064 e3540000 CMP r4,#0
;;;109 OSEventFreeList = (OS_EVENT *)OSEventFreeList->OSEventPtr;
000068 15942004 LDRNE r2,[r4,#4]
00006c 15812000 STRNE r2,[r1,#0] ; OSEventFreeList
;;;110 }
;;;111 OS_EXIT_CRITICAL();
000070 ebfffffe BL OS_CPU_SR_Restore
;;;112 if (pevent != (OS_EVENT *)0) { /* Get an event control block */
000074 e3540000 CMP r4,#0
000078 0a000009 BEQ |L1.164|
;;;113 pevent->OSEventType = OS_EVENT_TYPE_SEM;
00007c e3a00003 MOV r0,#3
000080 e5c40000 STRB r0,[r4,#0]
;;;114 pevent->OSEventCnt = cnt; /* Set semaphore value */
;;;115 pevent->OSEventPtr = (void *)0; /* Unlink from ECB free list */
000084 e3a00000 MOV r0,#0
000088 e1c450b8 STRH r5,[r4,#8] ;114
;;;116 #if OS_EVENT_NAME_SIZE > 1
;;;117 pevent->OSEventName[0] = '?'; /* Unknown name */
00008c e3a0103f MOV r1,#0x3f
000090 e5840004 STR r0,[r4,#4]
000094 e5c4100f STRB r1,[r4,#0xf]
;;;118 pevent->OSEventName[1] = OS_ASCII_NUL;
000098 e5c40010 STRB r0,[r4,#0x10]
;;;119 #endif
;;;120 OS_EventWaitListInit(pevent); /* Initialize to 'nobody waiting' on sem. */
00009c e1a00004 MOV r0,r4
0000a0 ebfffffe BL OS_EventWaitListInit
|L1.164|
;;;121 }
;;;122 return (pevent);
0000a4 e1a00004 MOV r0,r4
|L1.168|
0000a8 e8bd4070 POP {r4-r6,lr}
;;;123 }
0000ac e12fff1e BX lr
;;;124
ENDP
OSSemDel PROC
;;;164 OS_EVENT *OSSemDel (OS_EVENT *pevent, INT8U opt, INT8U *perr)
;;;165 {
0000b0 e92d5ff0 PUSH {r4-r12,lr}
0000b4 e1a04000 MOV r4,r0
;;;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 */
0000b8 e5d00000 LDRB r0,[r0,#0]
0000bc e1a0b001 MOV r11,r1 ;165
0000c0 e1a05002 MOV r5,r2 ;165
0000c4 e3500003 CMP r0,#3
;;;184 *perr = OS_ERR_EVENT_TYPE;
0000c8 13a00001 MOVNE r0,#1
;;;185 return (pevent);
0000cc 1a000020 BNE |L1.340|
;;;186 }
;;;187 if (OSIntNesting > 0) { /* See if called from ISR ... */
0000d0 e59f03f8 LDR r0,|L1.1232|
0000d4 e5d00000 LDRB r0,[r0,#0] ; OSIntNesting
0000d8 e3500000 CMP r0,#0
;;;188 *perr = OS_ERR_DEL_ISR; /* ... can't DELETE from an ISR */
0000dc 13a0000f MOVNE r0,#0xf
;;;189 return (pevent);
0000e0 1a00001b BNE |L1.340|
;;;190 }
;;;191 OS_ENTER_CRITICAL();
0000e4 ebfffffe BL OS_CPU_SR_Save
0000e8 e1a07000 MOV r7,r0
;;;192 if (pevent->OSEventGrp != 0) { /* See if any tasks waiting on semaphore */
0000ec e5d4000a LDRB r0,[r4,#0xa]
;;;193 tasks_waiting = OS_TRUE; /* Yes */
;;;194 } else {
;;;195 tasks_waiting = OS_FALSE; /* No */
0000f0 e59f93dc LDR r9,|L1.1236|
0000f4 e3a0803f MOV r8,#0x3f
0000f8 e2906000 ADDS r6,r0,#0 ;192
0000fc 13a06001 MOVNE r6,#1 ;193
;;;196 }
;;;197 switch (opt) {
000100 e35b0000 CMP r11,#0
000104 e3a0a000 MOV r10,#0 ;195
000108 0a000002 BEQ |L1.280|
00010c e35b0001 CMP r11,#1
000110 1a000029 BNE |L1.444|
000114 ea000017 B |L1.376|
|L1.280|
;;;198 case OS_DEL_NO_PEND: /* Delete semaphore only if no task waiting */
;;;199 if (tasks_waiting == OS_FALSE) {
000118 e3560000 CMP r6,#0
00011c 1a000009 BNE |L1.328|
;;;200 #if OS_EVENT_NAME_SIZE > 1
;;;201 pevent->OSEventName[0] = '?'; /* Unknown name */
000120 e5c4800f STRB r8,[r4,#0xf]
;;;202 pevent->OSEventName[1] = OS_ASCII_NUL;
000124 e5c4a010 STRB r10,[r4,#0x10]
;;;203 #endif
;;;204 pevent->OSEventType = OS_EVENT_TYPE_UNUSED;
000128 e5c4a000 STRB r10,[r4,#0]
;;;205 pevent->OSEventPtr = OSEventFreeList; /* Return Event Control Block to free list */
00012c e5990000 LDR r0,[r9,#0] ; OSEventFreeList
000130 e5840004 STR r0,[r4,#4]
;;;206 pevent->OSEventCnt = 0;
000134 e1c4a0b8 STRH r10,[r4,#8]
;;;207 OSEventFreeList = pevent; /* Get next free event control block */
;;;208 OS_EXIT_CRITICAL();
000138 e1a00007 MOV r0,r7
00013c e5894000 STR r4,[r9,#0] ; OSEventFreeList
000140 ebfffffe BL OS_CPU_SR_Restore
;;;209 *perr = OS_ERR_NONE;
;;;210 pevent_return = (OS_EVENT *)0; /* Semaphore has been deleted */
000144 ea000019 B |L1.432|
|L1.328|
;;;211 } else {
;;;212 OS_EXIT_CRITICAL();
000148 e1a00007 MOV r0,r7
00014c ebfffffe BL OS_CPU_SR_Restore
;;;213 *perr = OS_ERR_TASK_WAITING;
000150 e3a00049 MOV r0,#0x49
|L1.340|
;;;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;
000154 e5c50000 STRB r0,[r5,#0]
;;;241 pevent_return = pevent;
000158 e1a00004 MOV r0,r4
|L1.348|
00015c e8bd5ff0 POP {r4-r12,lr}
;;;242 break;
;;;243 }
;;;244 return (pevent_return);
;;;245 }
000160 e12fff1e BX lr
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -