📄 os_sem.txt
字号:
; generated by ARM/Thumb C/C++ Compiler with , RVCT3.0 [Build 951] for uVision
; commandline ArmCC [--debug -c --asm --interleave -oos_sem.o --device=DARMP --apcs=interwork -O0 -IC:\Keil\ARM\INC\Philips uCosii\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 1a000002 BNE |L1.28|
;;;49 return (0);
000010 e3a00000 MOV r0,#0
|L1.20|
000014 e8bd4070 POP {r4-r6,lr}
;;;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 }
000018 e12fff1e BX lr
|L1.28|
00001c e5d50000 LDRB r0,[r5,#0] ;51
000020 e3500003 CMP r0,#3 ;51
000024 0a000001 BEQ |L1.48| ;51
000028 e3a00000 MOV r0,#0 ;52
00002c eafffff8 B |L1.20| ;52
|L1.48|
000030 ef000002 SVC 0x2 ; formerly SWI ;55
000034 e1d540b2 LDRH r4,[r5,#2] ;56
000038 e3540000 CMP r4,#0 ;57
00003c da000002 BLE |L1.76| ;57
000040 e1d500b2 LDRH r0,[r5,#2] ;58
000044 e2400001 SUB r0,r0,#1 ;58
000048 e1c500b2 STRH r0,[r5,#2] ;58
|L1.76|
00004c ef000003 SVC 0x3 ; formerly SWI ;60
000050 e1a00004 MOV r0,r4 ;61
000054 eaffffee B |L1.20| ;61
ENDP
OSSemCreate PROC
;;;83 OS_EVENT *OSSemCreate (INT16U cnt)
;;;84 {
000058 e92d4070 PUSH {r4-r6,lr}
00005c 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 ... */
000060 e59f03dc LDR r0,|L1.1092|
000064 e5d00000 LDRB r0,[r0,#0] ; OSIntNesting
000068 e3500000 CMP r0,#0
00006c da000002 BLE |L1.124|
;;;92 return ((OS_EVENT *)0); /* ... can't CREATE from an ISR */
000070 e3a00000 MOV r0,#0
|L1.116|
000074 e8bd4070 POP {r4-r6,lr}
;;;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 pevent->OSEventPtr = (void *)0; /* Unlink from ECB free list */
;;;104 OS_EventWaitListInit(pevent); /* Initialize to 'nobody waiting' on sem. */
;;;105 }
;;;106 return (pevent);
;;;107 }
000078 e12fff1e BX lr
|L1.124|
00007c ef000002 SVC 0x2 ; formerly SWI ;94
000080 e59f03c0 LDR r0,|L1.1096| ;95
000084 e5905000 LDR r5,[r0,#0] ;95 ; OSEventFreeList
000088 e5900000 LDR r0,[r0,#0] ;96 ; OSEventFreeList
00008c e3500000 CMP r0,#0 ;96
000090 0a000004 BEQ |L1.168| ;96
000094 e59f03ac LDR r0,|L1.1096| ;97
000098 e5900000 LDR r0,[r0,#0] ;97 ; OSEventFreeList
00009c e5900004 LDR r0,[r0,#4] ;97
0000a0 e59f13a0 LDR r1,|L1.1096| ;97
0000a4 e5810000 STR r0,[r1,#0] ;97 ; OSEventFreeList
|L1.168|
0000a8 ef000003 SVC 0x3 ; formerly SWI ;99
0000ac e3550000 CMP r5,#0 ;100
0000b0 0a000006 BEQ |L1.208| ;100
0000b4 e3a00003 MOV r0,#3 ;101
0000b8 e5c50000 STRB r0,[r5,#0] ;101
0000bc e1c540b2 STRH r4,[r5,#2] ;102
0000c0 e3a00000 MOV r0,#0 ;103
0000c4 e5850004 STR r0,[r5,#4] ;103
0000c8 e1a00005 MOV r0,r5 ;104
0000cc ebfffffe BL OS_EventWaitListInit ;104
|L1.208|
0000d0 e1a00005 MOV r0,r5 ;106
0000d4 eaffffe6 B |L1.116| ;106
ENDP
OSSemDel PROC
;;;148 OS_EVENT *OSSemDel (OS_EVENT *pevent, INT8U opt, INT8U *err)
;;;149 {
0000d8 e92d41f0 PUSH {r4-r8,lr}
0000dc e1a04000 MOV r4,r0
0000e0 e1a05001 MOV r5,r1
0000e4 e1a06002 MOV r6,r2
;;;150 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;151 OS_CPU_SR cpu_sr;
;;;152 #endif
;;;153 BOOLEAN tasks_waiting;
;;;154
;;;155
;;;156 if (OSIntNesting > 0) { /* See if called from ISR ... */
0000e8 e59f0354 LDR r0,|L1.1092|
0000ec e5d00000 LDRB r0,[r0,#0] ; OSIntNesting
0000f0 e3500000 CMP r0,#0
0000f4 da000004 BLE |L1.268|
;;;157 *err = OS_ERR_DEL_ISR; /* ... can't DELETE from an ISR */
0000f8 e3a0008c MOV r0,#0x8c
0000fc e5c60000 STRB r0,[r6,#0]
;;;158 return (pevent);
000100 e1a00004 MOV r0,r4
|L1.260|
000104 e8bd41f0 POP {r4-r8,lr}
;;;159 }
;;;160 #if OS_ARG_CHK_EN > 0
;;;161 if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
;;;162 *err = OS_ERR_PEVENT_NULL;
;;;163 return (pevent);
;;;164 }
;;;165 if (pevent->OSEventType != OS_EVENT_TYPE_SEM) { /* Validate event block type */
;;;166 *err = OS_ERR_EVENT_TYPE;
;;;167 return (pevent);
;;;168 }
;;;169 #endif
;;;170 OS_ENTER_CRITICAL();
;;;171 if (pevent->OSEventGrp != 0x00) { /* See if any tasks waiting on semaphore */
;;;172 tasks_waiting = TRUE; /* Yes */
;;;173 } else {
;;;174 tasks_waiting = FALSE; /* No */
;;;175 }
;;;176 switch (opt) {
;;;177 case OS_DEL_NO_PEND: /* Delete semaphore only if no task waiting */
;;;178 if (tasks_waiting == FALSE) {
;;;179 pevent->OSEventType = OS_EVENT_TYPE_UNUSED;
;;;180 pevent->OSEventPtr = OSEventFreeList; /* Return Event Control Block to free list */
;;;181 OSEventFreeList = pevent; /* Get next free event control block */
;;;182 OS_EXIT_CRITICAL();
;;;183 *err = OS_NO_ERR;
;;;184 return ((OS_EVENT *)0); /* Semaphore has been deleted */
;;;185 } else {
;;;186 OS_EXIT_CRITICAL();
;;;187 *err = OS_ERR_TASK_WAITING;
;;;188 return (pevent);
;;;189 }
;;;190
;;;191 case OS_DEL_ALWAYS: /* Always delete the semaphore */
;;;192 while (pevent->OSEventGrp != 0x00) { /* Ready ALL tasks waiting for semaphore */
;;;193 OS_EventTaskRdy(pevent, (void *)0, OS_STAT_SEM);
;;;194 }
;;;195 pevent->OSEventType = OS_EVENT_TYPE_UNUSED;
;;;196 pevent->OSEventPtr = OSEventFreeList; /* Return Event Control Block to free list */
;;;197 OSEventFreeList = pevent; /* Get next free event control block */
;;;198 OS_EXIT_CRITICAL();
;;;199 if (tasks_waiting == TRUE) { /* Reschedule only if task(s) were waiting */
;;;200 OS_Sched(); /* Find highest priority task ready to run */
;;;201 }
;;;202 *err = OS_NO_ERR;
;;;203 return ((OS_EVENT *)0); /* Semaphore has been deleted */
;;;204
;;;205 default:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -