📄 os_q.txt
字号:
; generated by ARM/Thumb C/C++ Compiler with , RVCT3.1 [Build 919] for uVision
; commandline ArmCC [--debug -c --asm --interleave -o.\rvmdk\os_q.o --depend=.\rvmdk\os_q.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_q.crf ..\..\..\..\..\uCOS-II\Source\os_q.c]
ARM
AREA ||.text||, CODE, READONLY, ALIGN=2
OSQAccept PROC
;;;61 void *OSQAccept (OS_EVENT *pevent, INT8U *perr)
;;;62 {
000000 e92d4070 PUSH {r4-r6,lr}
000004 e1a05000 MOV r5,r0
;;;63 void *pmsg;
;;;64 OS_Q *pq;
;;;65 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;66 OS_CPU_SR cpu_sr = 0;
;;;67 #endif
;;;68
;;;69
;;;70
;;;71 #if OS_ARG_CHK_EN > 0
;;;72 if (perr == (INT8U *)0) { /* Validate 'perr' */
;;;73 return ((void *)0);
;;;74 }
;;;75 if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
;;;76 *perr = OS_ERR_PEVENT_NULL;
;;;77 return ((void *)0);
;;;78 }
;;;79 #endif
;;;80 if (pevent->OSEventType != OS_EVENT_TYPE_Q) {/* Validate event block type */
000008 e5d00000 LDRB r0,[r0,#0]
00000c e1a04001 MOV r4,r1 ;62
000010 e3500002 CMP r0,#2
;;;81 *perr = OS_ERR_EVENT_TYPE;
000014 13a00001 MOVNE r0,#1
000018 15c40000 STRBNE r0,[r4,#0]
;;;82 return ((void *)0);
00001c 13a00000 MOVNE r0,#0
000020 1a000016 BNE |L1.128|
;;;83 }
;;;84 OS_ENTER_CRITICAL();
000024 ebfffffe BL OS_CPU_SR_Save
;;;85 pq = (OS_Q *)pevent->OSEventPtr; /* Point at queue control block */
000028 e5951004 LDR r1,[r5,#4]
;;;86 if (pq->OSQEntries > 0) { /* See if any messages in the queue */
00002c e1d121b6 LDRH r2,[r1,#0x16]
000030 e3520000 CMP r2,#0
;;;87 pmsg = *pq->OSQOut++; /* Yes, extract oldest message from the queue */
;;;88 pq->OSQEntries--; /* Update the number of entries in the queue */
;;;89 if (pq->OSQOut == pq->OSQEnd) { /* Wrap OUT pointer if we are at the end of the queue */
;;;90 pq->OSQOut = pq->OSQStart;
;;;91 }
;;;92 *perr = OS_ERR_NONE;
;;;93 } else {
;;;94 *perr = OS_ERR_Q_EMPTY;
000034 03a0101f MOVEQ r1,#0x1f
;;;95 pmsg = (void *)0; /* Queue is empty */
000038 03a05000 MOVEQ r5,#0
00003c 05c41000 STRBEQ r1,[r4,#0] ;94
000040 0a00000c BEQ |L1.120|
000044 e5913010 LDR r3,[r1,#0x10] ;87
000048 e2832004 ADD r2,r3,#4 ;87
00004c e5812010 STR r2,[r1,#0x10] ;87
000050 e5935000 LDR r5,[r3,#0] ;87
000054 e1d131b6 LDRH r3,[r1,#0x16] ;88
000058 e2433001 SUB r3,r3,#1 ;88
00005c e1c131b6 STRH r3,[r1,#0x16] ;88
000060 e5913008 LDR r3,[r1,#8] ;89
000064 e1520003 CMP r2,r3 ;89
000068 05912004 LDREQ r2,[r1,#4] ;90
00006c 05812010 STREQ r2,[r1,#0x10] ;90
000070 e3a01000 MOV r1,#0 ;92
000074 e5c41000 STRB r1,[r4,#0] ;92
|L1.120|
;;;96 }
;;;97 OS_EXIT_CRITICAL();
000078 ebfffffe BL OS_CPU_SR_Restore
;;;98 return (pmsg); /* Return message received (or NULL) */
00007c e1a00005 MOV r0,r5
|L1.128|
000080 e8bd4070 POP {r4-r6,lr}
;;;99 }
000084 e12fff1e BX lr
;;;100 #endif
ENDP
OSQCreate PROC
;;;121 OS_EVENT *OSQCreate (void **start, INT16U size)
;;;122 {
000088 e92d41f0 PUSH {r4-r8,lr}
00008c e1a06000 MOV r6,r0
;;;123 OS_EVENT *pevent;
;;;124 OS_Q *pq;
;;;125 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;126 OS_CPU_SR cpu_sr = 0;
;;;127 #endif
;;;128
;;;129
;;;130
;;;131 if (OSIntNesting > 0) { /* See if called from ISR ... */
000090 e59f0784 LDR r0,|L1.2076|
000094 e1a08001 MOV r8,r1 ;122
000098 e5d00000 LDRB r0,[r0,#0] ; OSIntNesting
00009c e3500000 CMP r0,#0
;;;132 return ((OS_EVENT *)0); /* ... can't CREATE from an ISR */
0000a0 13a00000 MOVNE r0,#0
0000a4 1a000028 BNE |L1.332|
;;;133 }
;;;134 OS_ENTER_CRITICAL();
0000a8 ebfffffe BL OS_CPU_SR_Save
;;;135 pevent = OSEventFreeList; /* Get next free event control block */
0000ac e59f776c LDR r7,|L1.2080|
0000b0 e5974000 LDR r4,[r7,#0] ; OSEventFreeList
;;;136 if (OSEventFreeList != (OS_EVENT *)0) { /* See if pool of free ECB pool was empty */
0000b4 e3540000 CMP r4,#0
;;;137 OSEventFreeList = (OS_EVENT *)OSEventFreeList->OSEventPtr;
0000b8 15941004 LDRNE r1,[r4,#4]
0000bc 15871000 STRNE r1,[r7,#0] ; OSEventFreeList
;;;138 }
;;;139 OS_EXIT_CRITICAL();
0000c0 ebfffffe BL OS_CPU_SR_Restore
;;;140 if (pevent != (OS_EVENT *)0) { /* See if we have an event control block */
0000c4 e3540000 CMP r4,#0
0000c8 0a00001e BEQ |L1.328|
;;;141 OS_ENTER_CRITICAL();
0000cc ebfffffe BL OS_CPU_SR_Save
;;;142 pq = OSQFreeList; /* Get a free queue control block */
0000d0 e59f174c LDR r1,|L1.2084|
0000d4 e5915000 LDR r5,[r1,#0] ; OSQFreeList
;;;143 if (pq != (OS_Q *)0) { /* Were we able to get a queue control block ? */
0000d8 e3550000 CMP r5,#0
0000dc 0a000014 BEQ |L1.308|
;;;144 OSQFreeList = OSQFreeList->OSQPtr; /* Yes, Adjust free list pointer to next free*/
0000e0 e5952000 LDR r2,[r5,#0]
0000e4 e5812000 STR r2,[r1,#0] ; OSQFreeList
;;;145 OS_EXIT_CRITICAL();
0000e8 ebfffffe BL OS_CPU_SR_Restore
;;;146 pq->OSQStart = start; /* Initialize the queue */
;;;147 pq->OSQEnd = &start[size];
0000ec e0860108 ADD r0,r6,r8,LSL #2
;;;148 pq->OSQIn = start;
;;;149 pq->OSQOut = start;
0000f0 e2851008 ADD r1,r5,#8
0000f4 e5856004 STR r6,[r5,#4] ;146
0000f8 e8810041 STM r1,{r0,r6}
0000fc e5856010 STR r6,[r5,#0x10]
;;;150 pq->OSQSize = size;
;;;151 pq->OSQEntries = 0;
000100 e3a00000 MOV r0,#0
000104 e1c581b4 STRH r8,[r5,#0x14] ;150
;;;152 pevent->OSEventType = OS_EVENT_TYPE_Q;
000108 e3a01002 MOV r1,#2
00010c e1c501b6 STRH r0,[r5,#0x16] ;151
000110 e5c41000 STRB r1,[r4,#0]
;;;153 pevent->OSEventCnt = 0;
000114 e1c400b8 STRH r0,[r4,#8]
;;;154 pevent->OSEventPtr = pq;
;;;155 #if OS_EVENT_NAME_SIZE > 1
;;;156 pevent->OSEventName[0] = '?'; /* Unknown name */
000118 e3a0103f MOV r1,#0x3f
00011c e5845004 STR r5,[r4,#4]
000120 e5c4100f STRB r1,[r4,#0xf]
;;;157 pevent->OSEventName[1] = OS_ASCII_NUL;
000124 e5c40010 STRB r0,[r4,#0x10]
;;;158 #endif
;;;159 OS_EventWaitListInit(pevent); /* Initalize the wait list */
000128 e1a00004 MOV r0,r4
00012c ebfffffe BL OS_EventWaitListInit
000130 ea000004 B |L1.328|
|L1.308|
;;;160 } else {
;;;161 pevent->OSEventPtr = (void *)OSEventFreeList; /* No, Return event control block on error */
000134 e5971000 LDR r1,[r7,#0] ; OSEventFreeList
;;;162 OSEventFreeList = pevent;
000138 e5841004 STR r1,[r4,#4]
00013c e5874000 STR r4,[r7,#0] ; OSEventFreeList
;;;163 OS_EXIT_CRITICAL();
000140 ebfffffe BL OS_CPU_SR_Restore
;;;164 pevent = (OS_EVENT *)0;
000144 e3a04000 MOV r4,#0
|L1.328|
;;;165 }
;;;166 }
;;;167 return (pevent);
000148 e1a00004 MOV r0,r4
|L1.332|
00014c e8bd41f0 POP {r4-r8,lr}
;;;168 }
000150 e12fff1e BX lr
;;;169 /*$PAGE*/
ENDP
OSQDel PROC
;;;212 OS_EVENT *OSQDel (OS_EVENT *pevent, INT8U opt, INT8U *perr)
;;;213 {
000154 e92d5ff0 PUSH {r4-r12,lr}
000158 e1a04000 MOV r4,r0
;;;214 BOOLEAN tasks_waiting;
;;;215 OS_EVENT *pevent_return;
;;;216 OS_Q *pq;
;;;217 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;218 OS_CPU_SR cpu_sr = 0;
;;;219 #endif
;;;220
;;;221
;;;222
;;;223 #if OS_ARG_CHK_EN > 0
;;;224 if (perr == (INT8U *)0) { /* Validate 'perr' */
;;;225 return (pevent);
;;;226 }
;;;227 if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
;;;228 *perr = OS_ERR_PEVENT_NULL;
;;;229 return (pevent);
;;;230 }
;;;231 #endif
;;;232 if (pevent->OSEventType != OS_EVENT_TYPE_Q) { /* Validate event block type */
00015c e5d00000 LDRB r0,[r0,#0]
000160 e1a08001 MOV r8,r1 ;213
000164 e1a05002 MOV r5,r2 ;213
000168 e3500002 CMP r0,#2
;;;233 *perr = OS_ERR_EVENT_TYPE;
00016c 13a00001 MOVNE r0,#1
;;;234 return (pevent);
000170 1a000025 BNE |L1.524|
;;;235 }
;;;236 if (OSIntNesting > 0) { /* See if called from ISR ... */
000174 e59f06a0 LDR r0,|L1.2076|
000178 e5d00000 LDRB r0,[r0,#0] ; OSIntNesting
00017c e3500000 CMP r0,#0
;;;237 *perr = OS_ERR_DEL_ISR; /* ... can't DELETE from an ISR */
000180 13a0000f MOVNE r0,#0xf
;;;238 return (pevent);
000184 1a000020 BNE |L1.524|
;;;239 }
;;;240 OS_ENTER_CRITICAL();
000188 ebfffffe BL OS_CPU_SR_Save
00018c e1a07000 MOV r7,r0
;;;241 if (pevent->OSEventGrp != 0) { /* See if any tasks waiting on queue */
000190 e5d4000a LDRB r0,[r4,#0xa]
;;;242 tasks_waiting = OS_TRUE; /* Yes */
;;;243 } else {
;;;244 tasks_waiting = OS_FALSE; /* No */
;;;245 }
;;;246 switch (opt) {
000194 e59f9688 LDR r9,|L1.2084|
000198 e59fa680 LDR r10,|L1.2080|
00019c e2906000 ADDS r6,r0,#0 ;241
0001a0 13a06001 MOVNE r6,#1 ;242
0001a4 e1b00008 MOVS r0,r8
0001a8 e3a0803f MOV r8,#0x3f
0001ac e3a0b000 MOV r11,#0
0001b0 0a000002 BEQ |L1.448|
0001b4 e3500001 CMP r0,#1
0001b8 1a000031 BNE |L1.644|
0001bc ea00001b B |L1.560|
|L1.448|
;;;247 case OS_DEL_NO_PEND: /* Delete queue only if no task waiting */
;;;248 if (tasks_waiting == OS_FALSE) {
0001c0 e3560000 CMP r6,#0
0001c4 1a00000d BNE |L1.512|
;;;249 #if OS_EVENT_NAME_SIZE > 1
;;;250 pevent->OSEventName[0] = '?'; /* Unknown name */
0001c8 e5c4800f STRB r8,[r4,#0xf]
;;;251 pevent->OSEventName[1] = OS_ASCII_NUL;
0001cc e5c4b010 STRB r11,[r4,#0x10]
;;;252 #endif
;;;253 pq = (OS_Q *)pevent->OSEventPtr; /* Return OS_Q to free list */
;;;254 pq->OSQPtr = OSQFreeList;
0001d0 e5940004 LDR r0,[r4,#4]
0001d4 e5991000 LDR r1,[r9,#0] ; OSQFreeList
;;;255 OSQFreeList = pq;
0001d8 e5801000 STR r1,[r0,#0]
0001dc e5890000 STR r0,[r9,#0] ; OSQFreeList
;;;256 pevent->OSEventType = OS_EVENT_TYPE_UNUSED;
0001e0 e5c4b000 STRB r11,[r4,#0]
;;;257 pevent->OSEventPtr = OSEventFreeList; /* Return Event Control Block to free list */
0001e4 e59a0000 LDR r0,[r10,#0] ; OSEventFreeList
0001e8 e5840004 STR r0,[r4,#4]
;;;258 pevent->OSEventCnt = 0;
0001ec e1c4b0b8 STRH r11,[r4,#8]
;;;259 OSEventFreeList = pevent; /* Get next free event control block */
;;;260 OS_EXIT_CRITICAL();
0001f0 e1a00007 MOV r0,r7
0001f4 e58a4000 STR r4,[r10,#0] ; OSEventFreeList
0001f8 ebfffffe BL OS_CPU_SR_Restore
;;;261 *perr = OS_ERR_NONE;
;;;262 pevent_return = (OS_EVENT *)0; /* Queue has been deleted */
0001fc ea00001d B |L1.632|
|L1.512|
;;;263 } else {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -