📄 os_q.txt
字号:
; generated by ARM/Thumb C/C++ Compiler with , RVCT3.0 [Build 951] for uVision
; commandline ArmCC [--debug -c --asm --interleave -oos_q.o --device=DARMP --apcs=interwork -O0 -IC:\Keil\ARM\INC\Philips uCosii\OS_Q.C]
ARM
AREA ||.text.7||, CODE, READONLY, ALIGN=2
OSQAccept PROC
;;;39 void *OSQAccept (OS_EVENT *pevent)
;;;40 {
000000 e92d4070 PUSH {r4-r6,lr}
000004 e1a04000 MOV r4,r0
;;;41 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;42 OS_CPU_SR cpu_sr;
;;;43 #endif
;;;44 void *msg;
;;;45 OS_Q *pq;
;;;46
;;;47
;;;48 #if OS_ARG_CHK_EN > 0
;;;49 if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
000008 e3540000 CMP r4,#0
00000c 1a000002 BNE |L1.28|
;;;50 return ((void *)0);
000010 e3a00000 MOV r0,#0
|L1.20|
000014 e8bd4070 POP {r4-r6,lr}
;;;51 }
;;;52 if (pevent->OSEventType != OS_EVENT_TYPE_Q) {/* Validate event block type */
;;;53 return ((void *)0);
;;;54 }
;;;55 #endif
;;;56 OS_ENTER_CRITICAL();
;;;57 pq = (OS_Q *)pevent->OSEventPtr; /* Point at queue control block */
;;;58 if (pq->OSQEntries > 0) { /* See if any messages in the queue */
;;;59 msg = *pq->OSQOut++; /* Yes, extract oldest message from the queue */
;;;60 pq->OSQEntries--; /* Update the number of entries in the queue */
;;;61 if (pq->OSQOut == pq->OSQEnd) { /* Wrap OUT pointer if we are at the end of the queue */
;;;62 pq->OSQOut = pq->OSQStart;
;;;63 }
;;;64 } else {
;;;65 msg = (void *)0; /* Queue is empty */
;;;66 }
;;;67 OS_EXIT_CRITICAL();
;;;68 return (msg); /* Return message received (or NULL) */
;;;69 }
000018 e12fff1e BX lr
|L1.28|
00001c e5d40000 LDRB r0,[r4,#0] ;52
000020 e3500002 CMP r0,#2 ;52
000024 0a000001 BEQ |L1.48| ;52
000028 e3a00000 MOV r0,#0 ;53
00002c eafffff8 B |L1.20| ;53
|L1.48|
000030 ef000002 SVC 0x2 ; formerly SWI ;56
000034 e5945004 LDR r5,[r4,#4] ;57
000038 e1d501b6 LDRH r0,[r5,#0x16] ;58
00003c e3500000 CMP r0,#0 ;58
000040 da00000d BLE |L1.124| ;58
000044 e5950010 LDR r0,[r5,#0x10] ;59
000048 e2801004 ADD r1,r0,#4 ;59
00004c e5851010 STR r1,[r5,#0x10] ;59
000050 e5906000 LDR r6,[r0,#0] ;59
000054 e1d501b6 LDRH r0,[r5,#0x16] ;60
000058 e2400001 SUB r0,r0,#1 ;60
00005c e1c501b6 STRH r0,[r5,#0x16] ;60
000060 e5950010 LDR r0,[r5,#0x10] ;61
000064 e5951008 LDR r1,[r5,#8] ;61
000068 e1500001 CMP r0,r1 ;61
00006c 1a000003 BNE |L1.128| ;61
000070 e5950004 LDR r0,[r5,#4] ;62
000074 e5850010 STR r0,[r5,#0x10] ;62
000078 ea000000 B |L1.128| ;62
|L1.124|
00007c e3a06000 MOV r6,#0 ;65
|L1.128|
000080 ef000003 SVC 0x3 ; formerly SWI ;67
000084 e1a00006 MOV r0,r6 ;68
000088 eaffffe1 B |L1.20| ;68
ENDP
OSQCreate PROC
;;;91 OS_EVENT *OSQCreate (void **start, INT16U size)
;;;92 {
00008c e92d41f0 PUSH {r4-r8,lr}
000090 e1a04000 MOV r4,r0
000094 e1a05001 MOV r5,r1
;;;93 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;94 OS_CPU_SR cpu_sr;
;;;95 #endif
;;;96 OS_EVENT *pevent;
;;;97 OS_Q *pq;
;;;98
;;;99
;;;100 if (OSIntNesting > 0) { /* See if called from ISR ... */
000098 e59f07fc LDR r0,|L1.2204|
00009c e5d00000 LDRB r0,[r0,#0] ; OSIntNesting
0000a0 e3500000 CMP r0,#0
0000a4 da000002 BLE |L1.180|
;;;101 return ((OS_EVENT *)0); /* ... can't CREATE from an ISR */
0000a8 e3a00000 MOV r0,#0
|L1.172|
0000ac e8bd41f0 POP {r4-r8,lr}
;;;102 }
;;;103 OS_ENTER_CRITICAL();
;;;104 pevent = OSEventFreeList; /* Get next free event control block */
;;;105 if (OSEventFreeList != (OS_EVENT *)0) { /* See if pool of free ECB pool was empty */
;;;106 OSEventFreeList = (OS_EVENT *)OSEventFreeList->OSEventPtr;
;;;107 }
;;;108 OS_EXIT_CRITICAL();
;;;109 if (pevent != (OS_EVENT *)0) { /* See if we have an event control block */
;;;110 OS_ENTER_CRITICAL();
;;;111 pq = OSQFreeList; /* Get a free queue control block */
;;;112 if (pq != (OS_Q *)0) { /* Were we able to get a queue control block ? */
;;;113 OSQFreeList = OSQFreeList->OSQPtr; /* Yes, Adjust free list pointer to next free*/
;;;114 OS_EXIT_CRITICAL();
;;;115 pq->OSQStart = start; /* Initialize the queue */
;;;116 pq->OSQEnd = &start[size];
;;;117 pq->OSQIn = start;
;;;118 pq->OSQOut = start;
;;;119 pq->OSQSize = size;
;;;120 pq->OSQEntries = 0;
;;;121 pevent->OSEventType = OS_EVENT_TYPE_Q;
;;;122 pevent->OSEventCnt = 0;
;;;123 pevent->OSEventPtr = pq;
;;;124 OS_EventWaitListInit(pevent); /* Initalize the wait list */
;;;125 } else {
;;;126 pevent->OSEventPtr = (void *)OSEventFreeList; /* No, Return event control block on error */
;;;127 OSEventFreeList = pevent;
;;;128 OS_EXIT_CRITICAL();
;;;129 pevent = (OS_EVENT *)0;
;;;130 }
;;;131 }
;;;132 return (pevent);
;;;133 }
0000b0 e12fff1e BX lr
|L1.180|
0000b4 ef000002 SVC 0x2 ; formerly SWI ;103
0000b8 e59f07e0 LDR r0,|L1.2208| ;104
0000bc e5907000 LDR r7,[r0,#0] ;104 ; OSEventFreeList
0000c0 e5900000 LDR r0,[r0,#0] ;105 ; OSEventFreeList
0000c4 e3500000 CMP r0,#0 ;105
0000c8 0a000004 BEQ |L1.224| ;105
0000cc e59f07cc LDR r0,|L1.2208| ;106
0000d0 e5900000 LDR r0,[r0,#0] ;106 ; OSEventFreeList
0000d4 e5900004 LDR r0,[r0,#4] ;106
0000d8 e59f17c0 LDR r1,|L1.2208| ;106
0000dc e5810000 STR r0,[r1,#0] ;106 ; OSEventFreeList
|L1.224|
0000e0 ef000003 SVC 0x3 ; formerly SWI ;108
0000e4 e3570000 CMP r7,#0 ;109
0000e8 0a000020 BEQ |L1.368| ;109
0000ec ef000002 SVC 0x2 ; formerly SWI ;110
0000f0 e59f07ac LDR r0,|L1.2212| ;111
0000f4 e5906000 LDR r6,[r0,#0] ;111 ; OSQFreeList
0000f8 e3560000 CMP r6,#0 ;112
0000fc 0a000014 BEQ |L1.340| ;112
000100 e5900000 LDR r0,[r0,#0] ;113 ; OSQFreeList
000104 e5900000 LDR r0,[r0,#0] ;113
000108 e59f1794 LDR r1,|L1.2212| ;113
00010c e5810000 STR r0,[r1,#0] ;113 ; OSQFreeList
000110 ef000003 SVC 0x3 ; formerly SWI ;114
000114 e5864004 STR r4,[r6,#4] ;115
000118 e0840105 ADD r0,r4,r5,LSL #2 ;116
00011c e5860008 STR r0,[r6,#8] ;116
000120 e586400c STR r4,[r6,#0xc] ;117
000124 e5864010 STR r4,[r6,#0x10] ;118
000128 e1c651b4 STRH r5,[r6,#0x14] ;119
00012c e3a00000 MOV r0,#0 ;120
000130 e1c601b6 STRH r0,[r6,#0x16] ;120
000134 e3a00002 MOV r0,#2 ;121
000138 e5c70000 STRB r0,[r7,#0] ;121
00013c e3a00000 MOV r0,#0 ;122
000140 e1c700b2 STRH r0,[r7,#2] ;122
000144 e5876004 STR r6,[r7,#4] ;123
000148 e1a00007 MOV r0,r7 ;124
00014c ebfffffe BL OS_EventWaitListInit ;124
000150 ea000006 B |L1.368| ;124
|L1.340|
000154 e59f0744 LDR r0,|L1.2208| ;126
000158 e5900000 LDR r0,[r0,#0] ;126 ; OSEventFreeList
00015c e5870004 STR r0,[r7,#4] ;126
000160 e59f0738 LDR r0,|L1.2208| ;127
000164 e5807000 STR r7,[r0,#0] ;127 ; OSEventFreeList
000168 ef000003 SVC 0x3 ; formerly SWI ;128
00016c e3a07000 MOV r7,#0 ;129
|L1.368|
000170 e1a00007 MOV r0,r7 ;132
000174 eaffffcc B |L1.172| ;132
ENDP
OSQDel PROC
;;;177 OS_EVENT *OSQDel (OS_EVENT *pevent, INT8U opt, INT8U *err)
;;;178 {
000178 e92d41f0 PUSH {r4-r8,lr}
00017c e1a04000 MOV r4,r0
000180 e1a05001 MOV r5,r1
000184 e1a06002 MOV r6,r2
;;;179 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;180 OS_CPU_SR cpu_sr;
;;;181 #endif
;;;182 BOOLEAN tasks_waiting;
;;;183 OS_Q *pq;
;;;184
;;;185
;;;186 if (OSIntNesting > 0) { /* See if called from ISR ... */
000188 e59f070c LDR r0,|L1.2204|
00018c e5d00000 LDRB r0,[r0,#0] ; OSIntNesting
000190 e3500000 CMP r0,#0
000194 da000004 BLE |L1.428|
;;;187 *err = OS_ERR_DEL_ISR; /* ... can't DELETE from an ISR */
000198 e3a0008c MOV r0,#0x8c
00019c e5c60000 STRB r0,[r6,#0]
;;;188 return ((OS_EVENT *)0);
0001a0 e3a00000 MOV r0,#0
|L1.420|
0001a4 e8bd41f0 POP {r4-r8,lr}
;;;189 }
;;;190 #if OS_ARG_CHK_EN > 0
;;;191 if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
;;;192 *err = OS_ERR_PEVENT_NULL;
;;;193 return (pevent);
;;;194 }
;;;195 if (pevent->OSEventType != OS_EVENT_TYPE_Q) { /* Validate event block type */
;;;196 *err = OS_ERR_EVENT_TYPE;
;;;197 return (pevent);
;;;198 }
;;;199 #endif
;;;200 OS_ENTER_CRITICAL();
;;;201 if (pevent->OSEventGrp != 0x00) { /* See if any tasks waiting on queue */
;;;202 tasks_waiting = TRUE; /* Yes */
;;;203 } else {
;;;204 tasks_waiting = FALSE; /* No */
;;;205 }
;;;206 switch (opt) {
;;;207 case OS_DEL_NO_PEND: /* Delete queue only if no task waiting */
;;;208 if (tasks_waiting == FALSE) {
;;;209 pq = (OS_Q *)pevent->OSEventPtr; /* Return OS_Q to free list */
;;;210 pq->OSQPtr = OSQFreeList;
;;;211 OSQFreeList = pq;
;;;212 pevent->OSEventType = OS_EVENT_TYPE_UNUSED;
;;;213 pevent->OSEventPtr = OSEventFreeList; /* Return Event Control Block to free list */
;;;214 OSEventFreeList = pevent; /* Get next free event control block */
;;;215 OS_EXIT_CRITICAL();
;;;216 *err = OS_NO_ERR;
;;;217 return ((OS_EVENT *)0); /* Queue has been deleted */
;;;218 } else {
;;;219 OS_EXIT_CRITICAL();
;;;220 *err = OS_ERR_TASK_WAITING;
;;;221 return (pevent);
;;;222 }
;;;223
;;;224 case OS_DEL_ALWAYS: /* Always delete the queue */
;;;225 while (pevent->OSEventGrp != 0x00) { /* Ready ALL tasks waiting for queue */
;;;226 OS_EventTaskRdy(pevent, (void *)0, OS_STAT_Q);
;;;227 }
;;;228 pq = (OS_Q *)pevent->OSEventPtr; /* Return OS_Q to free list */
;;;229 pq->OSQPtr = OSQFreeList;
;;;230 OSQFreeList = pq;
;;;231 pevent->OSEventType = OS_EVENT_TYPE_UNUSED;
;;;232 pevent->OSEventPtr = OSEventFreeList; /* Return Event Control Block to free list */
;;;233 OSEventFreeList = pevent; /* Get next free event control block */
;;;234 OS_EXIT_CRITICAL();
;;;235 if (tasks_waiting == TRUE) { /* Reschedule only if task(s) were waiting */
;;;236 OS_Sched(); /* Find highest priority task ready to run */
;;;237 }
;;;238 *err = OS_NO_ERR;
;;;239 return ((OS_EVENT *)0); /* Queue has been deleted */
;;;240
;;;241 default:
;;;242 OS_EXIT_CRITICAL();
;;;243 *err = OS_ERR_INVALID_OPT;
;;;244 return (pevent);
;;;245 }
;;;246 }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -