os_q.txt
来自「uc/os在lpc2100系列的KEIL模板 uc/os在lpc2100系列的」· 文本 代码 · 共 1,063 行 · 第 1/4 页
TXT
1,063 行
0003fc e3560000 CMP r6,#0 ;365
000400 0a000006 BEQ |L1.1056|
000404 e5807020 STR r7,[r0,#0x20] ;366
000408 e5c0702c STRB r7,[r0,#0x2c] ;367
00040c e580701c STR r7,[r0,#0x1c] ;368
000410 ef000003 SVC #0x3 ;369
000414 e5c47000 STRB r7,[r4,#0] ;370
000418 e1a00006 MOV r0,r6 ;371
00041c eaffffc4 B |L1.820|
|L1.1056|
000420 e1a00005 MOV r0,r5 ;373
000424 ebfffffe BL OS_EventTO
000428 ef000003 SVC #0x3 ;374
00042c e3a0000a MOV r0,#0xa ;375
000430 e5c40000 STRB r0,[r4,#0] ;375
000434 e3a00000 MOV r0,#0 ;376
000438 eaffffbd B |L1.820|
;;;378 /*$PAGE*/
ENDP
OSQPost PROC
;;;398 INT8U OSQPost (OS_EVENT *pevent, void *msg)
;;;399 {
00043c e92d4070 PUSH {r4-r6,lr}
000440 e1a04000 MOV r4,r0
000444 e1a05001 MOV r5,r1
;;;400 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;401 OS_CPU_SR cpu_sr;
;;;402 #endif
;;;403 OS_Q *pq;
;;;404
;;;405
;;;406 #if OS_ARG_CHK_EN > 0
;;;407 if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
000448 e3540000 CMP r4,#0
00044c 1a000002 BNE |L1.1116|
;;;408 return (OS_ERR_PEVENT_NULL);
000450 e3a00004 MOV r0,#4
|L1.1108|
000454 e8bd4070 POP {r4-r6,lr}
;;;409 }
;;;410 if (msg == (void *)0) { /* Make sure we are not posting a NULL pointer */
;;;411 return (OS_ERR_POST_NULL_PTR);
;;;412 }
;;;413 if (pevent->OSEventType != OS_EVENT_TYPE_Q) { /* Validate event block type */
;;;414 return (OS_ERR_EVENT_TYPE);
;;;415 }
;;;416 #endif
;;;417 OS_ENTER_CRITICAL();
;;;418 if (pevent->OSEventGrp != 0x00) { /* See if any task pending on queue */
;;;419 OS_EventTaskRdy(pevent, msg, OS_STAT_Q); /* Ready highest priority task waiting on event */
;;;420 OS_EXIT_CRITICAL();
;;;421 OS_Sched(); /* Find highest priority task ready to run */
;;;422 return (OS_NO_ERR);
;;;423 }
;;;424 pq = (OS_Q *)pevent->OSEventPtr; /* Point to queue control block */
;;;425 if (pq->OSQEntries >= pq->OSQSize) { /* Make sure queue is not full */
;;;426 OS_EXIT_CRITICAL();
;;;427 return (OS_Q_FULL);
;;;428 }
;;;429 *pq->OSQIn++ = msg; /* Insert message into queue */
;;;430 pq->OSQEntries++; /* Update the nbr of entries in the queue */
;;;431 if (pq->OSQIn == pq->OSQEnd) { /* Wrap IN ptr if we are at end of queue */
;;;432 pq->OSQIn = pq->OSQStart;
;;;433 }
;;;434 OS_EXIT_CRITICAL();
;;;435 return (OS_NO_ERR);
;;;436 }
000458 e12fff1e BX lr
|L1.1116|
00045c e3550000 CMP r5,#0 ;410
000460 1a000001 BNE |L1.1132|
000464 e3a00003 MOV r0,#3 ;411
000468 eafffff9 B |L1.1108|
|L1.1132|
00046c e5d40000 LDRB r0,[r4,#0] ;413
000470 e3500002 CMP r0,#2 ;413
000474 0a000001 BEQ |L1.1152|
000478 e3a00001 MOV r0,#1 ;414
00047c eafffff4 B |L1.1108|
|L1.1152|
000480 ef000002 SVC #0x2 ;417
000484 e5d40001 LDRB r0,[r4,#1] ;418
000488 e3500000 CMP r0,#0 ;418
00048c 0a000007 BEQ |L1.1200|
000490 e3a02004 MOV r2,#4 ;419
000494 e1a01005 MOV r1,r5 ;419
000498 e1a00004 MOV r0,r4 ;419
00049c ebfffffe BL OS_EventTaskRdy
0004a0 ef000003 SVC #0x3 ;420
0004a4 ebfffffe BL OS_Sched
0004a8 e3a00000 MOV r0,#0 ;422
0004ac eaffffe8 B |L1.1108|
|L1.1200|
0004b0 e5940004 LDR r0,[r4,#4] ;424
0004b4 e1d011b6 LDRH r1,[r0,#0x16] ;425
0004b8 e1d021b4 LDRH r2,[r0,#0x14] ;425
0004bc e1510002 CMP r1,r2 ;425
0004c0 3a000002 BCC |L1.1232|
0004c4 ef000003 SVC #0x3 ;426
0004c8 e3a0001e MOV r0,#0x1e ;427
0004cc eaffffe0 B |L1.1108|
|L1.1232|
0004d0 e590100c LDR r1,[r0,#0xc] ;429
0004d4 e2812004 ADD r2,r1,#4 ;429
0004d8 e580200c STR r2,[r0,#0xc] ;429
0004dc e5815000 STR r5,[r1,#0] ;429
0004e0 e1d011b6 LDRH r1,[r0,#0x16] ;430
0004e4 e2811001 ADD r1,r1,#1 ;430
0004e8 e1c011b6 STRH r1,[r0,#0x16] ;430
0004ec e590100c LDR r1,[r0,#0xc] ;431
0004f0 e5902008 LDR r2,[r0,#8] ;431
0004f4 e1510002 CMP r1,r2 ;431
0004f8 1a000001 BNE |L1.1284|
0004fc e5901004 LDR r1,[r0,#4] ;432
000500 e580100c STR r1,[r0,#0xc] ;432
|L1.1284|
000504 ef000003 SVC #0x3 ;434
000508 e3a00000 MOV r0,#0 ;435
00050c eaffffd0 B |L1.1108|
;;;437 #endif
ENDP
OSQPostFront PROC
;;;460 INT8U OSQPostFront (OS_EVENT *pevent, void *msg)
;;;461 {
000510 e92d4070 PUSH {r4-r6,lr}
000514 e1a04000 MOV r4,r0
000518 e1a05001 MOV r5,r1
;;;462 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;463 OS_CPU_SR cpu_sr;
;;;464 #endif
;;;465 OS_Q *pq;
;;;466
;;;467
;;;468 #if OS_ARG_CHK_EN > 0
;;;469 if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
00051c e3540000 CMP r4,#0
000520 1a000002 BNE |L1.1328|
;;;470 return (OS_ERR_PEVENT_NULL);
000524 e3a00004 MOV r0,#4
|L1.1320|
000528 e8bd4070 POP {r4-r6,lr}
;;;471 }
;;;472 if (msg == (void *)0) { /* Make sure we are not posting a NULL pointer */
;;;473 return (OS_ERR_POST_NULL_PTR);
;;;474 }
;;;475 if (pevent->OSEventType != OS_EVENT_TYPE_Q) { /* Validate event block type */
;;;476 return (OS_ERR_EVENT_TYPE);
;;;477 }
;;;478 #endif
;;;479 OS_ENTER_CRITICAL();
;;;480 if (pevent->OSEventGrp != 0x00) { /* See if any task pending on queue */
;;;481 OS_EventTaskRdy(pevent, msg, OS_STAT_Q); /* Ready highest priority task waiting on event */
;;;482 OS_EXIT_CRITICAL();
;;;483 OS_Sched(); /* Find highest priority task ready to run */
;;;484 return (OS_NO_ERR);
;;;485 }
;;;486 pq = (OS_Q *)pevent->OSEventPtr; /* Point to queue control block */
;;;487 if (pq->OSQEntries >= pq->OSQSize) { /* Make sure queue is not full */
;;;488 OS_EXIT_CRITICAL();
;;;489 return (OS_Q_FULL);
;;;490 }
;;;491 if (pq->OSQOut == pq->OSQStart) { /* Wrap OUT ptr if we are at the 1st queue entry */
;;;492 pq->OSQOut = pq->OSQEnd;
;;;493 }
;;;494 pq->OSQOut--;
;;;495 *pq->OSQOut = msg; /* Insert message into queue */
;;;496 pq->OSQEntries++; /* Update the nbr of entries in the queue */
;;;497 OS_EXIT_CRITICAL();
;;;498 return (OS_NO_ERR);
;;;499 }
00052c e12fff1e BX lr
|L1.1328|
000530 e3550000 CMP r5,#0 ;472
000534 1a000001 BNE |L1.1344|
000538 e3a00003 MOV r0,#3 ;473
00053c eafffff9 B |L1.1320|
|L1.1344|
000540 e5d40000 LDRB r0,[r4,#0] ;475
000544 e3500002 CMP r0,#2 ;475
000548 0a000001 BEQ |L1.1364|
00054c e3a00001 MOV r0,#1 ;476
000550 eafffff4 B |L1.1320|
|L1.1364|
000554 ef000002 SVC #0x2 ;479
000558 e5d40001 LDRB r0,[r4,#1] ;480
00055c e3500000 CMP r0,#0 ;480
000560 0a000007 BEQ |L1.1412|
000564 e3a02004 MOV r2,#4 ;481
000568 e1a01005 MOV r1,r5 ;481
00056c e1a00004 MOV r0,r4 ;481
000570 ebfffffe BL OS_EventTaskRdy
000574 ef000003 SVC #0x3 ;482
000578 ebfffffe BL OS_Sched
00057c e3a00000 MOV r0,#0 ;484
000580 eaffffe8 B |L1.1320|
|L1.1412|
000584 e5940004 LDR r0,[r4,#4] ;486
000588 e1d011b6 LDRH r1,[r0,#0x16] ;487
00058c e1d021b4 LDRH r2,[r0,#0x14] ;487
000590 e1510002 CMP r1,r2 ;487
000594 3a000002 BCC |L1.1444|
000598 ef000003 SVC #0x3 ;488
00059c e3a0001e MOV r0,#0x1e ;489
0005a0 eaffffe0 B |L1.1320|
|L1.1444|
0005a4 e5901010 LDR r1,[r0,#0x10] ;491
0005a8 e5902004 LDR r2,[r0,#4] ;491
0005ac e1510002 CMP r1,r2 ;491
0005b0 1a000001 BNE |L1.1468|
0005b4 e5901008 LDR r1,[r0,#8] ;492
0005b8 e5801010 STR r1,[r0,#0x10] ;492
|L1.1468|
0005bc e5901010 LDR r1,[r0,#0x10] ;494
0005c0 e2411004 SUB r1,r1,#4 ;494
0005c4 e5801010 STR r1,[r0,#0x10] ;494
0005c8 e5815000 STR r5,[r1,#0] ;495
0005cc e1d011b6 LDRH r1,[r0,#0x16] ;496
0005d0 e2811001 ADD r1,r1,#1 ;496
0005d4 e1c011b6 STRH r1,[r0,#0x16] ;496
0005d8 ef000003 SVC #0x3 ;497
0005dc e3a00000 MOV r0,#0 ;498
0005e0 eaffffd0 B |L1.1320|
;;;500 #endif
ENDP
OSQPostOpt PROC
;;;546 INT8U OSQPostOpt (OS_EVENT *pevent, void *msg, INT8U opt)
;;;547 {
0005e4 e92d4070 PUSH {r4-r6,lr}
0005e8 e1a04000 MOV r4,r0
0005ec e1a05001 MOV r5,r1
0005f0 e1a06002 MOV r6,r2
;;;548 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;549 OS_CPU_SR cpu_sr;
;;;550 #endif
;;;551 OS_Q *pq;
;;;552
;;;553
;;;554 #if OS_ARG_CHK_EN > 0
;;;555 if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
0005f4 e3540000 CMP r4,#0
0005f8 1a000002 BNE |L1.1544|
;;;556 return (OS_ERR_PEVENT_NULL);
0005fc e3a00004 MOV r0,#4
|L1.1536|
000600 e8bd4070 POP {r4-r6,lr}
;;;557 }
;;;558 if (msg == (void *)0) { /* Make sure we are not posting a NULL pointer */
;;;559 return (OS_ERR_POST_NULL_PTR);
;;;560 }
;;;561 if (pevent->OSEventType != OS_EVENT_TYPE_Q) { /* Validate event block type */
;;;562 return (OS_ERR_EVENT_TYPE);
;;;563 }
;;;564 #endif
;;;565 OS_ENTER_CRITICAL();
;;;566 if (pevent->OSEventGrp != 0x00) { /* See if any task pending on queue */
;;;567 if ((opt & OS_POST_OPT_BROADCAST) != 0x00) { /* Do we need to post msg to ALL waiting tasks ? */
;;;568 while (pevent->OSEventGrp != 0x00) { /* Yes, Post to ALL tasks waiting on queue */
;;;569 OS_EventTaskRdy(pevent, msg, OS_STAT_Q);
;;;570 }
;;;571 } else {
;;;572 OS_EventTaskRdy(pevent, msg, OS_STAT_Q); /* No, Post to HPT waiting on queue */
;;;573 }
;;;574 OS_EXIT_CRITICAL();
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?