📄 os_q.txt
字号:
; generated by ARM/Thumb C/C++ Compiler with , RVCT3.0 [Build 947] for uVision
; commandline ArmCC [--debug -c --asm --interleave -o.\os_q.o --device=DARMP -O0 -IC:\Keil\ARM\INC\Philips ..\Source\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 1a000001 BNE |L1.24|
;;;50 return ((void *)0);
000010 e3a00000 MOV r0,#0
;;;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 }
|L1.20|
000014 e8bd8070 POP {r4-r6,pc}
|L1.24|
000018 e5d40000 LDRB r0,[r4,#0] ;52
00001c e3500002 CMP r0,#2 ;52
000020 0a000001 BEQ |L1.44| ;52
000024 e3a00000 MOV r0,#0 ;53
000028 eafffff9 B |L1.20| ;53
|L1.44|
00002c ef000002 SVC 0x2 ; formerly SWI ;56
000030 e5945004 LDR r5,[r4,#4] ;57
000034 e1d501b6 LDRH r0,[r5,#0x16] ;58
000038 e3500000 CMP r0,#0 ;58
00003c 0a00000d BEQ |L1.120| ;58
000040 e5950010 LDR r0,[r5,#0x10] ;59
000044 e2801004 ADD r1,r0,#4 ;59
000048 e5851010 STR r1,[r5,#0x10] ;59
00004c e5906000 LDR r6,[r0,#0] ;59
000050 e1d501b6 LDRH r0,[r5,#0x16] ;60
000054 e2400001 SUB r0,r0,#1 ;60
000058 e1c501b6 STRH r0,[r5,#0x16] ;60
00005c e5950010 LDR r0,[r5,#0x10] ;61
000060 e5951008 LDR r1,[r5,#8] ;61
000064 e1500001 CMP r0,r1 ;61
000068 1a000003 BNE |L1.124| ;61
00006c e5950004 LDR r0,[r5,#4] ;62
000070 e5850010 STR r0,[r5,#0x10] ;62
000074 ea000000 B |L1.124| ;62
|L1.120|
000078 e3a06000 MOV r6,#0 ;65
|L1.124|
00007c ef000003 SVC 0x3 ; formerly SWI ;67
000080 e1a00006 MOV r0,r6 ;68
000084 eaffffe2 B |L1.20| ;68
ENDP
OSQCreate PROC
;;;91 OS_EVENT *OSQCreate (void **start, INT16U size)
;;;92 {
000088 e92d41f0 PUSH {r4-r8,lr}
00008c e1a04000 MOV r4,r0
000090 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 ... */
000094 e59f07e4 LDR r0,|L1.2176|
000098 e5d00000 LDRB r0,[r0,#0] ; OSIntNesting
00009c e3500000 CMP r0,#0
0000a0 da000001 BLE |L1.172|
;;;101 return ((OS_EVENT *)0); /* ... can't CREATE from an ISR */
0000a4 e3a00000 MOV r0,#0
;;;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(); /* Get a free queue control block */
;;;111 pq = OSQFreeList;
;;;112 if (OSQFreeList != (OS_Q *)0) {
;;;113 OSQFreeList = OSQFreeList->OSQPtr;
;;;114 }
;;;115 OS_EXIT_CRITICAL();
;;;116 if (pq != (OS_Q *)0) { /* See if we were able to get a queue control block */
;;;117 pq->OSQStart = start; /* Yes, initialize the queue */
;;;118 pq->OSQEnd = &start[size];
;;;119 pq->OSQIn = start;
;;;120 pq->OSQOut = start;
;;;121 pq->OSQSize = size;
;;;122 pq->OSQEntries = 0;
;;;123 pevent->OSEventType = OS_EVENT_TYPE_Q;
;;;124 pevent->OSEventPtr = pq;
;;;125 OS_EventWaitListInit(pevent);
;;;126 } else { /* No, since we couldn't get a queue control block */
;;;127 OS_ENTER_CRITICAL(); /* Return event control block on error */
;;;128 pevent->OSEventPtr = (void *)OSEventFreeList;
;;;129 OSEventFreeList = pevent;
;;;130 OS_EXIT_CRITICAL();
;;;131 pevent = (OS_EVENT *)0;
;;;132 }
;;;133 }
;;;134 return (pevent);
;;;135 }
|L1.168|
0000a8 e8bd81f0 POP {r4-r8,pc}
|L1.172|
0000ac ef000002 SVC 0x2 ; formerly SWI ;103
0000b0 e59f07cc LDR r0,|L1.2180| ;104
0000b4 e5906000 LDR r6,[r0,#0] ;104 ; OSEventFreeList
0000b8 e5900000 LDR r0,[r0,#0] ;105 ; OSEventFreeList
0000bc e3500000 CMP r0,#0 ;105
0000c0 0a000004 BEQ |L1.216| ;105
0000c4 e59f07b8 LDR r0,|L1.2180| ;106
0000c8 e5900000 LDR r0,[r0,#0] ;106 ; OSEventFreeList
0000cc e5900004 LDR r0,[r0,#4] ;106
0000d0 e59f17ac LDR r1,|L1.2180| ;106
0000d4 e5810000 STR r0,[r1,#0] ;106 ; OSEventFreeList
|L1.216|
0000d8 ef000003 SVC 0x3 ; formerly SWI ;108
0000dc e3560000 CMP r6,#0 ;109
0000e0 0a000023 BEQ |L1.372| ;109
0000e4 ef000002 SVC 0x2 ; formerly SWI ;110
0000e8 e59f0798 LDR r0,|L1.2184| ;111
0000ec e5907000 LDR r7,[r0,#0] ;111 ; OSQFreeList
0000f0 e5900000 LDR r0,[r0,#0] ;112 ; OSQFreeList
0000f4 e3500000 CMP r0,#0 ;112
0000f8 0a000004 BEQ |L1.272| ;112
0000fc e59f0784 LDR r0,|L1.2184| ;113
000100 e5900000 LDR r0,[r0,#0] ;113 ; OSQFreeList
000104 e5900000 LDR r0,[r0,#0] ;113
000108 e59f1778 LDR r1,|L1.2184| ;113
00010c e5810000 STR r0,[r1,#0] ;113 ; OSQFreeList
|L1.272|
000110 ef000003 SVC 0x3 ; formerly SWI ;115
000114 e3570000 CMP r7,#0 ;116
000118 0a00000d BEQ |L1.340| ;116
00011c e5874004 STR r4,[r7,#4] ;117
000120 e0840105 ADD r0,r4,r5,LSL #2 ;118
000124 e5870008 STR r0,[r7,#8] ;118
000128 e587400c STR r4,[r7,#0xc] ;119
00012c e5874010 STR r4,[r7,#0x10] ;120
000130 e1c751b4 STRH r5,[r7,#0x14] ;121
000134 e3a00000 MOV r0,#0 ;122
000138 e1c701b6 STRH r0,[r7,#0x16] ;122
00013c e3a00002 MOV r0,#2 ;123
000140 e5c60000 STRB r0,[r6,#0] ;123
000144 e5867004 STR r7,[r6,#4] ;124
000148 e1a00006 MOV r0,r6 ;125
00014c ebfffffe BL OS_EventWaitListInit ;125
000150 ea000007 B |L1.372| ;125
|L1.340|
000154 ef000002 SVC 0x2 ; formerly SWI ;127
000158 e59f0724 LDR r0,|L1.2180| ;128
00015c e5900000 LDR r0,[r0,#0] ;128 ; OSEventFreeList
000160 e5860004 STR r0,[r6,#4] ;128
000164 e59f0718 LDR r0,|L1.2180| ;129
000168 e5806000 STR r6,[r0,#0] ;129 ; OSEventFreeList
00016c ef000003 SVC 0x3 ; formerly SWI ;130
000170 e3a06000 MOV r6,#0 ;131
|L1.372|
000174 e1a00006 MOV r0,r6 ;134
000178 eaffffca B |L1.168| ;134
ENDP
OSQDel PROC
;;;179 OS_EVENT *OSQDel (OS_EVENT *pevent, INT8U opt, INT8U *err)
;;;180 {
00017c e92d41f0 PUSH {r4-r8,lr}
000180 e1a04000 MOV r4,r0
000184 e1a05001 MOV r5,r1
000188 e1a06002 MOV r6,r2
;;;181 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;182 OS_CPU_SR cpu_sr;
;;;183 #endif
;;;184 BOOLEAN tasks_waiting;
;;;185 OS_Q *pq;
;;;186
;;;187
;;;188 if (OSIntNesting > 0) { /* See if called from ISR ... */
00018c e59f06ec LDR r0,|L1.2176|
000190 e5d00000 LDRB r0,[r0,#0] ; OSIntNesting
000194 e3500000 CMP r0,#0
000198 da000003 BLE |L1.428|
;;;189 *err = OS_ERR_DEL_ISR; /* ... can't DELETE from an ISR */
00019c e3a0008c MOV r0,#0x8c
0001a0 e5c60000 STRB r0,[r6,#0]
;;;190 return ((OS_EVENT *)0);
0001a4 e3a00000 MOV r0,#0
;;;191 }
;;;192 #if OS_ARG_CHK_EN > 0
;;;193 if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
;;;194 *err = OS_ERR_PEVENT_NULL;
;;;195 return (pevent);
;;;196 }
;;;197 if (pevent->OSEventType != OS_EVENT_TYPE_Q) { /* Validate event block type */
;;;198 *err = OS_ERR_EVENT_TYPE;
;;;199 return (pevent);
;;;200 }
;;;201 #endif
;;;202 OS_ENTER_CRITICAL();
;;;203 if (pevent->OSEventGrp != 0x00) { /* See if any tasks waiting on queue */
;;;204 tasks_waiting = TRUE; /* Yes */
;;;205 } else {
;;;206 tasks_waiting = FALSE; /* No */
;;;207 }
;;;208 switch (opt) {
;;;209 case OS_DEL_NO_PEND: /* Delete queue only if no task waiting */
;;;210 if (tasks_waiting == FALSE) {
;;;211 pq = pevent->OSEventPtr; /* Return OS_Q to free list */
;;;212 pq->OSQPtr = OSQFreeList;
;;;213 OSQFreeList = pq;
;;;214 pevent->OSEventType = OS_EVENT_TYPE_UNUSED;
;;;215 pevent->OSEventPtr = OSEventFreeList; /* Return Event Control Block to free list */
;;;216 OSEventFreeList = pevent; /* Get next free event control block */
;;;217 OS_EXIT_CRITICAL();
;;;218 *err = OS_NO_ERR;
;;;219 return ((OS_EVENT *)0); /* Queue has been deleted */
;;;220 } else {
;;;221 OS_EXIT_CRITICAL();
;;;222 *err = OS_ERR_TASK_WAITING;
;;;223 return (pevent);
;;;224 }
;;;225
;;;226 case OS_DEL_ALWAYS: /* Always delete the queue */
;;;227 while (pevent->OSEventGrp != 0x00) { /* Ready ALL tasks waiting for queue */
;;;228 OS_EventTaskRdy(pevent, (void *)0, OS_STAT_Q);
;;;229 }
;;;230 pq = pevent->OSEventPtr; /* Return OS_Q to free list */
;;;231 pq->OSQPtr = OSQFreeList;
;;;232 OSQFreeList = pq;
;;;233 pevent->OSEventType = OS_EVENT_TYPE_UNUSED;
;;;234 pevent->OSEventPtr = OSEventFreeList; /* Return Event Control Block to free list */
;;;235 OSEventFreeList = pevent; /* Get next free event control block */
;;;236 OS_EXIT_CRITICAL();
;;;237 if (tasks_waiting == TRUE) { /* Reschedule only if task(s) were waiting */
;;;238 OS_Sched(); /* Find highest priority task ready to run */
;;;239 }
;;;240 *err = OS_NO_ERR;
;;;241 return ((OS_EVENT *)0); /* Queue has been deleted */
;;;242
;;;243 default:
;;;244 OS_EXIT_CRITICAL();
;;;245 *err = OS_ERR_INVALID_OPT;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -