os_q.txt
来自「uc/os在lpc2100系列的KEIL模板 uc/os在lpc2100系列的」· 文本 代码 · 共 1,063 行 · 第 1/4 页
TXT
1,063 行
; generated by ARM/Thumb C/C++ Compiler with , RVCT3.1 [Build 934] for uVision
; commandline ArmCC [--debug -c --asm --interleave -o.\rvmdk\os_q.o --depend=.\rvmdk\os_q.d --device=DARMP --apcs=interwork -O1 -I. -I..\BSP -I..\..\..\..\uCOS-II\Ports\ARM\Generic\RealView -I..\..\..\..\uCOS-II\Source -I..\..\..\..\uC-CPU -I..\..\..\..\uC-CPU\ARM\RealView -I..\..\..\..\uC-LIB -I..\..\..\..\uC-TCPIP\IF -I..\..\..\..\uC-TCPIP\IF\Ether -I..\..\..\..\uC-TCPIP\NIC\ETHER\LPC2378 -I..\..\..\..\uC-TCPIP\NIC\ETHER\PHY -I..\..\..\..\uC-TCPIP\NIC\ETHER\PHY\DP83848 -I..\..\..\..\uC-TCPIP\OS\uCOS-II -I..\..\..\..\uC-TCPIP\Source -I..\..\..\..\uC-LCD\Source -I..\..\..\..\uC-Probe\Target\Communication\Generic\Source -I..\..\..\..\uC-Probe\Target\Communication\Generic\RS-232\Source -I..\..\..\..\uC-Probe\Target\Communication\Generic\TCPIP\Source -I..\..\..\..\uC-Probe\Target\Plugins\uCOS-II -Ie:\Keil_ARM\ARM\INC\Philips -D__IN_CHIP --omf_browse=.\rvmdk\os_q.crf ..\Source\OS_Q.C]
ARM
AREA ||.text||, CODE, READONLY, ALIGN=2
OSQAccept PROC
;;;39 void *OSQAccept (OS_EVENT *pevent)
;;;40 {
000000 e92d4010 PUSH {r4,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 e8bd4010 POP {r4,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|
000028 e3a00000 MOV r0,#0 ;53
00002c eafffff8 B |L1.20|
|L1.48|
000030 ef000002 SVC #0x2 ;56
000034 e5940004 LDR r0,[r4,#4] ;57
000038 e1d011b6 LDRH r1,[r0,#0x16] ;58
00003c e3510000 CMP r1,#0 ;58
000040 0a00000c BEQ |L1.120|
000044 e5902010 LDR r2,[r0,#0x10] ;59
000048 e2821004 ADD r1,r2,#4 ;59
00004c e5801010 STR r1,[r0,#0x10] ;59
000050 e5924000 LDR r4,[r2,#0] ;59
000054 e1d021b6 LDRH r2,[r0,#0x16] ;60
000058 e2422001 SUB r2,r2,#1 ;60
00005c e1c021b6 STRH r2,[r0,#0x16] ;60
000060 e5902008 LDR r2,[r0,#8] ;61
000064 e1510002 CMP r1,r2 ;61
000068 1a000003 BNE |L1.124|
00006c e5901004 LDR r1,[r0,#4] ;62
000070 e5801010 STR r1,[r0,#0x10] ;62
000074 ea000000 B |L1.124|
|L1.120|
000078 e3a04000 MOV r4,#0 ;65
|L1.124|
00007c ef000003 SVC #0x3 ;67
000080 e1a00004 MOV r0,r4 ;68
000084 eaffffe2 B |L1.20|
;;;70 #endif
ENDP
OSQCreate PROC
;;;91 OS_EVENT *OSQCreate (void **start, INT16U size)
;;;92 {
000088 e92d41f0 PUSH {r4-r8,lr}
00008c e1a06000 MOV r6,r0
000090 e1a08001 MOV r8,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 e59f075c LDR r0,|L1.2040|
000098 e5d00000 LDRB r0,[r0,#0] ; OSIntNesting
00009c e3500000 CMP r0,#0
0000a0 0a000002 BEQ |L1.176|
;;;101 return ((OS_EVENT *)0); /* ... can't CREATE from an ISR */
0000a4 e3a00000 MOV r0,#0
|L1.168|
0000a8 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 }
0000ac e12fff1e BX lr
|L1.176|
0000b0 ef000002 SVC #0x2 ;103
0000b4 e59f7740 LDR r7,|L1.2044|
0000b8 e5975000 LDR r5,[r7,#0] ;104 ; OSEventFreeList
0000bc e3550000 CMP r5,#0 ;105
0000c0 0a000001 BEQ |L1.204|
0000c4 e5950004 LDR r0,[r5,#4] ;106
0000c8 e5870000 STR r0,[r7,#0] ;106 ; OSEventFreeList
|L1.204|
0000cc ef000003 SVC #0x3 ;108
0000d0 e3550000 CMP r5,#0 ;109
0000d4 0a00001b BEQ |L1.328|
0000d8 ef000002 SVC #0x2 ;110
0000dc e59f071c LDR r0,|L1.2048|
0000e0 e5904000 LDR r4,[r0,#0] ;111 ; OSQFreeList
0000e4 e3540000 CMP r4,#0 ;112
0000e8 0a000011 BEQ |L1.308|
0000ec e5941000 LDR r1,[r4,#0] ;113
0000f0 e5801000 STR r1,[r0,#0] ;113 ; OSQFreeList
0000f4 ef000003 SVC #0x3 ;114
0000f8 e5846004 STR r6,[r4,#4] ;115
0000fc e0860108 ADD r0,r6,r8,LSL #2 ;116
000100 e5840008 STR r0,[r4,#8] ;116
000104 e584600c STR r6,[r4,#0xc] ;117
000108 e5846010 STR r6,[r4,#0x10] ;118
00010c e1c481b4 STRH r8,[r4,#0x14] ;119
000110 e3a00000 MOV r0,#0 ;120
000114 e1c401b6 STRH r0,[r4,#0x16] ;120
000118 e3a01002 MOV r1,#2 ;121
00011c e5c51000 STRB r1,[r5,#0] ;121
000120 e1c500b2 STRH r0,[r5,#2] ;122
000124 e5854004 STR r4,[r5,#4] ;123
000128 e1a00005 MOV r0,r5 ;124
00012c ebfffffe BL OS_EventWaitListInit
000130 ea000004 B |L1.328|
|L1.308|
000134 e5970000 LDR r0,[r7,#0] ;126 ; OSEventFreeList
000138 e5850004 STR r0,[r5,#4] ;126
00013c e5875000 STR r5,[r7,#0] ;127 ; OSEventFreeList
000140 ef000003 SVC #0x3 ;128
000144 e3a05000 MOV r5,#0 ;129
|L1.328|
000148 e1a00005 MOV r0,r5 ;132
00014c eaffffd5 B |L1.168|
;;;134 /*$PAGE*/
ENDP
OSQDel PROC
;;;177 OS_EVENT *OSQDel (OS_EVENT *pevent, INT8U opt, INT8U *err)
;;;178 {
000150 e92d47f0 PUSH {r4-r10,lr}
000154 e1a04000 MOV r4,r0
000158 e1a0a001 MOV r10,r1
00015c e1a05002 MOV r5,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 ... */
000160 e59f0690 LDR r0,|L1.2040|
000164 e5d00000 LDRB r0,[r0,#0] ; OSIntNesting
000168 e3500000 CMP r0,#0
00016c 0a000004 BEQ |L1.388|
;;;187 *err = OS_ERR_DEL_ISR; /* ... can't DELETE from an ISR */
000170 e3a0008c MOV r0,#0x8c
000174 e5c50000 STRB r0,[r5,#0]
;;;188 return ((OS_EVENT *)0);
000178 e3a00000 MOV r0,#0
|L1.380|
00017c e8bd47f0 POP {r4-r10,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 + =
减小字号Ctrl + -
显示快捷键?