os_q.txt
来自「uc/os在lpc2100系列的KEIL模板 uc/os在lpc2100系列的」· 文本 代码 · 共 1,063 行 · 第 1/4 页
TXT
1,063 行
000180 e12fff1e BX lr
|L1.388|
000184 e3540000 CMP r4,#0 ;191
000188 1a000003 BNE |L1.412|
00018c e3a00004 MOV r0,#4 ;192
000190 e5c50000 STRB r0,[r5,#0] ;192
000194 e1a00004 MOV r0,r4 ;193
000198 eafffff7 B |L1.380|
|L1.412|
00019c e5d40000 LDRB r0,[r4,#0] ;195
0001a0 e3500002 CMP r0,#2 ;195
0001a4 0a000003 BEQ |L1.440|
0001a8 e3a00001 MOV r0,#1 ;196
0001ac e5c50000 STRB r0,[r5,#0] ;196
0001b0 e1a00004 MOV r0,r4 ;197
0001b4 eafffff0 B |L1.380|
|L1.440|
0001b8 ef000002 SVC #0x2 ;200
0001bc e5d40001 LDRB r0,[r4,#1] ;201
0001c0 e3500000 CMP r0,#0 ;201
0001c4 0a000001 BEQ |L1.464|
0001c8 e3a06001 MOV r6,#1 ;202
0001cc ea000000 B |L1.468|
|L1.464|
0001d0 e3a06000 MOV r6,#0 ;204
|L1.468|
0001d4 e59f7624 LDR r7,|L1.2048|
0001d8 e59f861c LDR r8,|L1.2044|
0001dc e35a0000 CMP r10,#0 ;206
0001e0 e3a09000 MOV r9,#0 ;204
0001e4 0a000002 BEQ |L1.500|
0001e8 e35a0001 CMP r10,#1 ;206
0001ec 1a000029 BNE |L1.664|
0001f0 ea000016 B |L1.592|
|L1.500|
0001f4 e3560000 CMP r6,#0 ;208
0001f8 1a00000b BNE |L1.556|
0001fc e5940004 LDR r0,[r4,#4] ;209
000200 e5971000 LDR r1,[r7,#0] ;210 ; OSQFreeList
000204 e5801000 STR r1,[r0,#0] ;210
000208 e5870000 STR r0,[r7,#0] ;211 ; OSQFreeList
00020c e5c49000 STRB r9,[r4,#0] ;212
000210 e5980000 LDR r0,[r8,#0] ;213 ; OSEventFreeList
000214 e5840004 STR r0,[r4,#4] ;213
000218 e5884000 STR r4,[r8,#0] ;214 ; OSEventFreeList
00021c ef000003 SVC #0x3 ;215
000220 e5c59000 STRB r9,[r5,#0] ;216
000224 e3a00000 MOV r0,#0 ;217
000228 eaffffd3 B |L1.380|
|L1.556|
00022c ef000003 SVC #0x3 ;219
000230 e3a00008 MOV r0,#8 ;220
000234 e5c50000 STRB r0,[r5,#0] ;220
000238 e1a00004 MOV r0,r4 ;221
00023c eaffffce B |L1.380|
|L1.576|
000240 e3a02004 MOV r2,#4 ;226
000244 e3a01000 MOV r1,#0 ;226
000248 e1a00004 MOV r0,r4 ;226
00024c ebfffffe BL OS_EventTaskRdy
|L1.592|
000250 e5d40001 LDRB r0,[r4,#1] ;225
000254 e3500000 CMP r0,#0 ;225
000258 1afffff8 BNE |L1.576|
00025c e5940004 LDR r0,[r4,#4] ;228
000260 e5971000 LDR r1,[r7,#0] ;229 ; OSQFreeList
000264 e5801000 STR r1,[r0,#0] ;229
000268 e5870000 STR r0,[r7,#0] ;230 ; OSQFreeList
00026c e5c49000 STRB r9,[r4,#0] ;231
000270 e5980000 LDR r0,[r8,#0] ;232 ; OSEventFreeList
000274 e5840004 STR r0,[r4,#4] ;232
000278 e5884000 STR r4,[r8,#0] ;233 ; OSEventFreeList
00027c ef000003 SVC #0x3 ;234
000280 e3560001 CMP r6,#1 ;235
000284 1a000000 BNE |L1.652|
000288 ebfffffe BL OS_Sched
|L1.652|
00028c e5c59000 STRB r9,[r5,#0] ;238
000290 e3a00000 MOV r0,#0 ;239
000294 eaffffb8 B |L1.380|
|L1.664|
000298 ef000003 SVC #0x3 ;242
00029c e3a00007 MOV r0,#7 ;243
0002a0 e5c50000 STRB r0,[r5,#0] ;243
0002a4 e1a00004 MOV r0,r4 ;244
0002a8 eaffffb3 B |L1.380|
;;;247 #endif
ENDP
OSQFlush PROC
;;;265 INT8U OSQFlush (OS_EVENT *pevent)
;;;266 {
0002ac e92d4010 PUSH {r4,lr}
0002b0 e1a04000 MOV r4,r0
;;;267 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;268 OS_CPU_SR cpu_sr;
;;;269 #endif
;;;270 OS_Q *pq;
;;;271
;;;272
;;;273 #if OS_ARG_CHK_EN > 0
;;;274 if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
0002b4 e3540000 CMP r4,#0
0002b8 1a000002 BNE |L1.712|
;;;275 return (OS_ERR_PEVENT_NULL);
0002bc e3a00004 MOV r0,#4
|L1.704|
0002c0 e8bd4010 POP {r4,lr}
;;;276 }
;;;277 if (pevent->OSEventType != OS_EVENT_TYPE_Q) { /* Validate event block type */
;;;278 return (OS_ERR_EVENT_TYPE);
;;;279 }
;;;280 #endif
;;;281 OS_ENTER_CRITICAL();
;;;282 pq = (OS_Q *)pevent->OSEventPtr; /* Point to queue storage structure */
;;;283 pq->OSQIn = pq->OSQStart;
;;;284 pq->OSQOut = pq->OSQStart;
;;;285 pq->OSQEntries = 0;
;;;286 OS_EXIT_CRITICAL();
;;;287 return (OS_NO_ERR);
;;;288 }
0002c4 e12fff1e BX lr
|L1.712|
0002c8 e5d40000 LDRB r0,[r4,#0] ;277
0002cc e3500002 CMP r0,#2 ;277
0002d0 0a000001 BEQ |L1.732|
0002d4 e3a00001 MOV r0,#1 ;278
0002d8 eafffff8 B |L1.704|
|L1.732|
0002dc ef000002 SVC #0x2 ;281
0002e0 e5940004 LDR r0,[r4,#4] ;282
0002e4 e5901004 LDR r1,[r0,#4] ;283
0002e8 e580100c STR r1,[r0,#0xc] ;283
0002ec e5901004 LDR r1,[r0,#4] ;284
0002f0 e5801010 STR r1,[r0,#0x10] ;284
0002f4 e3a01000 MOV r1,#0 ;285
0002f8 e1c011b6 STRH r1,[r0,#0x16] ;285
0002fc ef000003 SVC #0x3 ;286
000300 e3a00000 MOV r0,#0 ;287
000304 eaffffed B |L1.704|
;;;289 #endif
ENDP
OSQPend PROC
;;;323 void *OSQPend (OS_EVENT *pevent, INT16U timeout, INT8U *err)
;;;324 {
000308 e92d41f0 PUSH {r4-r8,lr}
00030c e1a05000 MOV r5,r0
000310 e1a06001 MOV r6,r1
000314 e1a04002 MOV r4,r2
;;;325 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;326 OS_CPU_SR cpu_sr;
;;;327 #endif
;;;328 void *msg;
;;;329 OS_Q *pq;
;;;330
;;;331
;;;332 if (OSIntNesting > 0) { /* See if called from ISR ... */
000318 e59f04d8 LDR r0,|L1.2040|
00031c e5d00000 LDRB r0,[r0,#0] ; OSIntNesting
000320 e3500000 CMP r0,#0
000324 0a000004 BEQ |L1.828|
;;;333 *err = OS_ERR_PEND_ISR; /* ... can't PEND from an ISR */
000328 e3a00002 MOV r0,#2
00032c e5c40000 STRB r0,[r4,#0]
;;;334 return ((void *)0);
000330 e3a00000 MOV r0,#0
|L1.820|
000334 e8bd41f0 POP {r4-r8,lr}
;;;335 }
;;;336 #if OS_ARG_CHK_EN > 0
;;;337 if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
;;;338 *err = OS_ERR_PEVENT_NULL;
;;;339 return ((void *)0);
;;;340 }
;;;341 if (pevent->OSEventType != OS_EVENT_TYPE_Q) {/* Validate event block type */
;;;342 *err = OS_ERR_EVENT_TYPE;
;;;343 return ((void *)0);
;;;344 }
;;;345 #endif
;;;346 OS_ENTER_CRITICAL();
;;;347 pq = (OS_Q *)pevent->OSEventPtr; /* Point at queue control block */
;;;348 if (pq->OSQEntries > 0) { /* See if any messages in the queue */
;;;349 msg = *pq->OSQOut++; /* Yes, extract oldest message from the queue */
;;;350 pq->OSQEntries--; /* Update the number of entries in the queue */
;;;351 if (pq->OSQOut == pq->OSQEnd) { /* Wrap OUT pointer if we are at the end of the queue */
;;;352 pq->OSQOut = pq->OSQStart;
;;;353 }
;;;354 OS_EXIT_CRITICAL();
;;;355 *err = OS_NO_ERR;
;;;356 return (msg); /* Return message received */
;;;357 }
;;;358 OSTCBCur->OSTCBStat |= OS_STAT_Q; /* Task will have to pend for a message to be posted */
;;;359 OSTCBCur->OSTCBDly = timeout; /* Load timeout into TCB */
;;;360 OS_EventTaskWait(pevent); /* Suspend task until event or timeout occurs */
;;;361 OS_EXIT_CRITICAL();
;;;362 OS_Sched(); /* Find next highest priority task ready to run */
;;;363 OS_ENTER_CRITICAL();
;;;364 msg = OSTCBCur->OSTCBMsg;
;;;365 if (msg != (void *)0) { /* Did we get a message? */
;;;366 OSTCBCur->OSTCBMsg = (void *)0; /* Extract message from TCB (Put there by QPost) */
;;;367 OSTCBCur->OSTCBStat = OS_STAT_RDY;
;;;368 OSTCBCur->OSTCBEventPtr = (OS_EVENT *)0; /* No longer waiting for event */
;;;369 OS_EXIT_CRITICAL();
;;;370 *err = OS_NO_ERR;
;;;371 return (msg); /* Return message received */
;;;372 }
;;;373 OS_EventTO(pevent); /* Timed out */
;;;374 OS_EXIT_CRITICAL();
;;;375 *err = OS_TIMEOUT; /* Indicate a timeout occured */
;;;376 return ((void *)0); /* No message received */
;;;377 }
000338 e12fff1e BX lr
|L1.828|
00033c e3550000 CMP r5,#0 ;337
000340 1a000003 BNE |L1.852|
000344 e3a00004 MOV r0,#4 ;338
000348 e5c40000 STRB r0,[r4,#0] ;338
00034c e3a00000 MOV r0,#0 ;339
000350 eafffff7 B |L1.820|
|L1.852|
000354 e5d50000 LDRB r0,[r5,#0] ;341
000358 e3500002 CMP r0,#2 ;341
00035c 0a000003 BEQ |L1.880|
000360 e3a00001 MOV r0,#1 ;342
000364 e5c40000 STRB r0,[r4,#0] ;342
000368 e3a00000 MOV r0,#0 ;343
00036c eafffff0 B |L1.820|
|L1.880|
000370 ef000002 SVC #0x2 ;346
000374 e5950004 LDR r0,[r5,#4] ;347
000378 e3a07000 MOV r7,#0 ;348
00037c e1d011b6 LDRH r1,[r0,#0x16] ;348
000380 e3510000 CMP r1,#0 ;348
000384 0a00000f BEQ |L1.968|
000388 e5901010 LDR r1,[r0,#0x10] ;349
00038c e2812004 ADD r2,r1,#4 ;349
000390 e5802010 STR r2,[r0,#0x10] ;349
000394 e5915000 LDR r5,[r1,#0] ;349
000398 e1d011b6 LDRH r1,[r0,#0x16] ;350
00039c e2411001 SUB r1,r1,#1 ;350
0003a0 e1c011b6 STRH r1,[r0,#0x16] ;350
0003a4 e5901008 LDR r1,[r0,#8] ;351
0003a8 e1520001 CMP r2,r1 ;351
0003ac 1a000001 BNE |L1.952|
0003b0 e5901004 LDR r1,[r0,#4] ;352
0003b4 e5801010 STR r1,[r0,#0x10] ;352
|L1.952|
0003b8 ef000003 SVC #0x3 ;354
0003bc e5c47000 STRB r7,[r4,#0] ;355
0003c0 e1a00005 MOV r0,r5 ;356
0003c4 eaffffda B |L1.820|
|L1.968|
0003c8 e59f8434 LDR r8,|L1.2052|
0003cc e5980000 LDR r0,[r8,#0] ;358 ; OSTCBCur
0003d0 e5d0102c LDRB r1,[r0,#0x2c] ;358
0003d4 e3811004 ORR r1,r1,#4 ;358
0003d8 e5c0102c STRB r1,[r0,#0x2c] ;358
0003dc e1c062ba STRH r6,[r0,#0x2a] ;359
0003e0 e1a00005 MOV r0,r5 ;360
0003e4 ebfffffe BL OS_EventTaskWait
0003e8 ef000003 SVC #0x3 ;361
0003ec ebfffffe BL OS_Sched
0003f0 ef000002 SVC #0x2 ;363
0003f4 e5980000 LDR r0,[r8,#0] ;364 ; OSTCBCur
0003f8 e5906020 LDR r6,[r0,#0x20] ;364
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?