📄 os_sem.txt
字号:
; generated by ARM/Thumb C/C++ Compiler with , RVCT3.0 [Build 947] for uVision
; commandline ArmCC [--debug -c --asm --interleave -o.\os_sem.o --device=DARMP -O0 -IC:\Keil\ARM\INC\Philips ..\Source\OS_SEM.C]
ARM
AREA ||.text.7||, CODE, READONLY, ALIGN=2
OSSemAccept PROC
;;;39 INT16U OSSemAccept (OS_EVENT *pevent)
;;;40 {
000000 e92d4070 PUSH {r4-r6,lr}
000004 e1a05000 MOV r5,r0
;;;41 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;42 OS_CPU_SR cpu_sr;
;;;43 #endif
;;;44 INT16U cnt;
;;;45
;;;46
;;;47 #if OS_ARG_CHK_EN > 0
;;;48 if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
000008 e3550000 CMP r5,#0
00000c 1a000001 BNE |L1.24|
;;;49 return (0);
000010 e3a00000 MOV r0,#0
;;;50 }
;;;51 if (pevent->OSEventType != OS_EVENT_TYPE_SEM) { /* Validate event block type */
;;;52 return (0);
;;;53 }
;;;54 #endif
;;;55 OS_ENTER_CRITICAL();
;;;56 cnt = pevent->OSEventCnt;
;;;57 if (cnt > 0) { /* See if resource is available */
;;;58 pevent->OSEventCnt--; /* Yes, decrement semaphore and notify caller */
;;;59 }
;;;60 OS_EXIT_CRITICAL();
;;;61 return (cnt); /* Return semaphore count */
;;;62 }
|L1.20|
000014 e8bd8070 POP {r4-r6,pc}
|L1.24|
000018 e5d50000 LDRB r0,[r5,#0] ;51
00001c e3500003 CMP r0,#3 ;51
000020 0a000001 BEQ |L1.44| ;51
000024 e3a00000 MOV r0,#0 ;52
000028 eafffff9 B |L1.20| ;52
|L1.44|
00002c ef000002 SVC 0x2 ; formerly SWI ;55
000030 e1d540b2 LDRH r4,[r5,#2] ;56
000034 e3540000 CMP r4,#0 ;57
000038 da000002 BLE |L1.72| ;57
00003c e1d500b2 LDRH r0,[r5,#2] ;58
000040 e2400001 SUB r0,r0,#1 ;58
000044 e1c500b2 STRH r0,[r5,#2] ;58
|L1.72|
000048 ef000003 SVC 0x3 ; formerly SWI ;60
00004c e1a00004 MOV r0,r4 ;61
000050 eaffffef B |L1.20| ;61
ENDP
OSSemCreate PROC
;;;83 OS_EVENT *OSSemCreate (INT16U cnt)
;;;84 {
000054 e92d4070 PUSH {r4-r6,lr}
000058 e1a04000 MOV r4,r0
;;;85 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;86 OS_CPU_SR cpu_sr;
;;;87 #endif
;;;88 OS_EVENT *pevent;
;;;89
;;;90
;;;91 if (OSIntNesting > 0) { /* See if called from ISR ... */
00005c e59f03c0 LDR r0,|L1.1060|
000060 e5d00000 LDRB r0,[r0,#0] ; OSIntNesting
000064 e3500000 CMP r0,#0
000068 da000001 BLE |L1.116|
;;;92 return ((OS_EVENT *)0); /* ... can't CREATE from an ISR */
00006c e3a00000 MOV r0,#0
;;;93 }
;;;94 OS_ENTER_CRITICAL();
;;;95 pevent = OSEventFreeList; /* Get next free event control block */
;;;96 if (OSEventFreeList != (OS_EVENT *)0) { /* See if pool of free ECB pool was empty */
;;;97 OSEventFreeList = (OS_EVENT *)OSEventFreeList->OSEventPtr;
;;;98 }
;;;99 OS_EXIT_CRITICAL();
;;;100 if (pevent != (OS_EVENT *)0) { /* Get an event control block */
;;;101 pevent->OSEventType = OS_EVENT_TYPE_SEM;
;;;102 pevent->OSEventCnt = cnt; /* Set semaphore value */
;;;103 OS_EventWaitListInit(pevent);
;;;104 }
;;;105 return (pevent);
;;;106 }
|L1.112|
000070 e8bd8070 POP {r4-r6,pc}
|L1.116|
000074 ef000002 SVC 0x2 ; formerly SWI ;94
000078 e59f03a8 LDR r0,|L1.1064| ;95
00007c e5905000 LDR r5,[r0,#0] ;95 ; OSEventFreeList
000080 e5900000 LDR r0,[r0,#0] ;96 ; OSEventFreeList
000084 e3500000 CMP r0,#0 ;96
000088 0a000004 BEQ |L1.160| ;96
00008c e59f0394 LDR r0,|L1.1064| ;97
000090 e5900000 LDR r0,[r0,#0] ;97 ; OSEventFreeList
000094 e5900004 LDR r0,[r0,#4] ;97
000098 e59f1388 LDR r1,|L1.1064| ;97
00009c e5810000 STR r0,[r1,#0] ;97 ; OSEventFreeList
|L1.160|
0000a0 ef000003 SVC 0x3 ; formerly SWI ;99
0000a4 e3550000 CMP r5,#0 ;100
0000a8 0a000004 BEQ |L1.192| ;100
0000ac e3a00003 MOV r0,#3 ;101
0000b0 e5c50000 STRB r0,[r5,#0] ;101
0000b4 e1c540b2 STRH r4,[r5,#2] ;102
0000b8 e1a00005 MOV r0,r5 ;103
0000bc ebfffffe BL OS_EventWaitListInit ;103
|L1.192|
0000c0 e1a00005 MOV r0,r5 ;105
0000c4 eaffffe9 B |L1.112| ;105
ENDP
OSSemDel PROC
;;;147 OS_EVENT *OSSemDel (OS_EVENT *pevent, INT8U opt, INT8U *err)
;;;148 {
0000c8 e92d41f0 PUSH {r4-r8,lr}
0000cc e1a04000 MOV r4,r0
0000d0 e1a05001 MOV r5,r1
0000d4 e1a06002 MOV r6,r2
;;;149 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;150 OS_CPU_SR cpu_sr;
;;;151 #endif
;;;152 BOOLEAN tasks_waiting;
;;;153
;;;154
;;;155 if (OSIntNesting > 0) { /* See if called from ISR ... */
0000d8 e59f0344 LDR r0,|L1.1060|
0000dc e5d00000 LDRB r0,[r0,#0] ; OSIntNesting
0000e0 e3500000 CMP r0,#0
0000e4 da000003 BLE |L1.248|
;;;156 *err = OS_ERR_DEL_ISR; /* ... can't DELETE from an ISR */
0000e8 e3a0008c MOV r0,#0x8c
0000ec e5c60000 STRB r0,[r6,#0]
;;;157 return (pevent);
0000f0 e1a00004 MOV r0,r4
;;;158 }
;;;159 #if OS_ARG_CHK_EN > 0
;;;160 if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
;;;161 *err = OS_ERR_PEVENT_NULL;
;;;162 return (pevent);
;;;163 }
;;;164 if (pevent->OSEventType != OS_EVENT_TYPE_SEM) { /* Validate event block type */
;;;165 *err = OS_ERR_EVENT_TYPE;
;;;166 return (pevent);
;;;167 }
;;;168 #endif
;;;169 OS_ENTER_CRITICAL();
;;;170 if (pevent->OSEventGrp != 0x00) { /* See if any tasks waiting on semaphore */
;;;171 tasks_waiting = TRUE; /* Yes */
;;;172 } else {
;;;173 tasks_waiting = FALSE; /* No */
;;;174 }
;;;175 switch (opt) {
;;;176 case OS_DEL_NO_PEND: /* Delete semaphore only if no task waiting */
;;;177 if (tasks_waiting == FALSE) {
;;;178 pevent->OSEventType = OS_EVENT_TYPE_UNUSED;
;;;179 pevent->OSEventPtr = OSEventFreeList; /* Return Event Control Block to free list */
;;;180 OSEventFreeList = pevent; /* Get next free event control block */
;;;181 OS_EXIT_CRITICAL();
;;;182 *err = OS_NO_ERR;
;;;183 return ((OS_EVENT *)0); /* Semaphore has been deleted */
;;;184 } else {
;;;185 OS_EXIT_CRITICAL();
;;;186 *err = OS_ERR_TASK_WAITING;
;;;187 return (pevent);
;;;188 }
;;;189
;;;190 case OS_DEL_ALWAYS: /* Always delete the semaphore */
;;;191 while (pevent->OSEventGrp != 0x00) { /* Ready ALL tasks waiting for semaphore */
;;;192 OS_EventTaskRdy(pevent, (void *)0, OS_STAT_SEM);
;;;193 }
;;;194 pevent->OSEventType = OS_EVENT_TYPE_UNUSED;
;;;195 pevent->OSEventPtr = OSEventFreeList; /* Return Event Control Block to free list */
;;;196 OSEventFreeList = pevent; /* Get next free event control block */
;;;197 OS_EXIT_CRITICAL();
;;;198 if (tasks_waiting == TRUE) { /* Reschedule only if task(s) were waiting */
;;;199 OS_Sched(); /* Find highest priority task ready to run */
;;;200 }
;;;201 *err = OS_NO_ERR;
;;;202 return ((OS_EVENT *)0); /* Semaphore has been deleted */
;;;203
;;;204 default:
;;;205 OS_EXIT_CRITICAL();
;;;206 *err = OS_ERR_INVALID_OPT;
;;;207 return (pevent);
;;;208 }
;;;209 }
|L1.244|
0000f4 e8bd81f0 POP {r4-r8,pc}
|L1.248|
0000f8 e3540000 CMP r4,#0 ;160
0000fc 1a000003 BNE |L1.272| ;160
000100 e3a00004 MOV r0,#4 ;161
000104 e5c60000 STRB r0,[r6,#0] ;161
000108 e1a00004 MOV r0,r4 ;162
00010c eafffff8 B |L1.244| ;162
|L1.272|
000110 e5d40000 LDRB r0,[r4,#0] ;164
000114 e3500003 CMP r0,#3 ;164
000118 0a000003 BEQ |L1.300| ;164
00011c e3a00001 MOV r0,#1 ;165
000120 e5c60000 STRB r0,[r6,#0] ;165
000124 e1a00004 MOV r0,r4 ;166
000128 eafffff1 B |L1.244| ;166
|L1.300|
00012c ef000002 SVC 0x2 ; formerly SWI ;169
000130 e5d40001 LDRB r0,[r4,#1] ;170
000134 e3500000 CMP r0,#0 ;170
000138 0a000001 BEQ |L1.324| ;170
00013c e3a07001 MOV r7,#1 ;171
000140 ea000000 B |L1.328| ;171
|L1.324|
000144 e3a07000 MOV r7,#0 ;173
|L1.328|
000148 e3550000 CMP r5,#0 ;175
00014c 0a000002 BEQ |L1.348| ;175
000150 e3550001 CMP r5,#1 ;175
000154 1a00002a BNE |L1.516| ;175
000158 ea000012 B |L1.424| ;175
|L1.348|
00015c e1a00000 MOV r0,r0 ;176
000160 e3570000 CMP r7,#0 ;177
000164 1a00000a BNE |L1.404| ;177
000168 e3a00000 MOV r0,#0 ;178
00016c e5c40000 STRB r0,[r4,#0] ;178
000170 e59f02b0 LDR r0,|L1.1064| ;179
000174 e5900000 LDR r0,[r0,#0] ;179 ; OSEventFreeList
000178 e5840004 STR r0,[r4,#4] ;179
00017c e59f02a4 LDR r0,|L1.1064| ;180
000180 e5804000 STR r4,[r0,#0] ;180 ; OSEventFreeList
000184 ef000003 SVC 0x3 ; formerly SWI ;181
000188 e3a00000 MOV r0,#0 ;182
00018c e5c60000 STRB r0,[r6,#0] ;182
000190 eaffffd7 B |L1.244| ;183
|L1.404|
000194 ef000003 SVC 0x3 ; formerly SWI ;185
000198 e3a00008 MOV r0,#8 ;186
00019c e5c60000 STRB r0,[r6,#0] ;186
0001a0 e1a00004 MOV r0,r4 ;187
0001a4 eaffffd2 B |L1.244| ;187
|L1.424|
0001a8 e1a00000 MOV r0,r0 ;190
0001ac ea000003 B |L1.448| ;191
|L1.432|
0001b0 e3a02001 MOV r2,#1 ;192
0001b4 e3a01000 MOV r1,#0 ;192
0001b8 e1a00004 MOV r0,r4 ;192
0001bc ebfffffe BL OS_EventTaskRdy ;192
|L1.448|
0001c0 e5d40001 LDRB r0,[r4,#1] ;191
0001c4 e3500000 CMP r0,#0 ;191
0001c8 1afffff8 BNE |L1.432| ;191
0001cc e3a00000 MOV r0,#0 ;194
0001d0 e5c40000 STRB r0,[r4,#0] ;194
0001d4 e59f024c LDR r0,|L1.1064| ;195
0001d8 e5900000 LDR r0,[r0,#0] ;195 ; OSEventFreeList
0001dc e5840004 STR r0,[r4,#4] ;195
0001e0 e59f0240 LDR r0,|L1.1064| ;196
0001e4 e5804000 STR r4,[r0,#0] ;196 ; OSEventFreeList
0001e8 ef000003 SVC 0x3 ; formerly SWI ;197
0001ec e3570001 CMP r7,#1 ;198
0001f0 1a000000 BNE |L1.504| ;198
0001f4 ebfffffe BL OS_Sched ;199
|L1.504|
0001f8 e3a00000 MOV r0,#0 ;201
0001fc e5c60000 STRB r0,[r6,#0] ;201
000200 eaffffbb B |L1.244| ;202
|L1.516|
000204 e1a00000 MOV r0,r0 ;204
000208 ef000003 SVC 0x3 ; formerly SWI ;205
00020c e3a00007 MOV r0,#7 ;206
000210 e5c60000 STRB r0,[r6,#0] ;206
000214 e1a00004 MOV r0,r4 ;207
000218 eaffffb5 B |L1.244| ;207
ENDP
OSSemPend PROC
;;;243 void OSSemPend (OS_EVENT *pevent, INT16U timeout, INT8U *err)
;;;244 {
00021c e92d4070 PUSH {r4-r6,lr}
000220 e1a04000 MOV r4,r0
000224 e1a05001 MOV r5,r1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -