📄 os_q.txt
字号:
00044c ebfffffe BL OS_EventTaskWait ;360
000450 ef000003 SVC 0x3 ; formerly SWI ;361
000454 ebfffffe BL OS_Sched ;362
000458 ef000002 SVC 0x2 ; formerly SWI ;363
00045c e59f0444 LDR r0,|L1.2216| ;364
000460 e5900000 LDR r0,[r0,#0] ;364 ; OSTCBCur
000464 e5908020 LDR r8,[r0,#0x20] ;364
000468 e3580000 CMP r8,#0 ;365
00046c 0a00000e BEQ |L1.1196| ;365
000470 e3a00000 MOV r0,#0 ;366
000474 e59f142c LDR r1,|L1.2216| ;366
000478 e5911000 LDR r1,[r1,#0] ;366 ; OSTCBCur
00047c e5810020 STR r0,[r1,#0x20] ;366
000480 e59f1420 LDR r1,|L1.2216| ;367
000484 e5911000 LDR r1,[r1,#0] ;367 ; OSTCBCur
000488 e5c1002c STRB r0,[r1,#0x2c] ;367
00048c e59f1414 LDR r1,|L1.2216| ;368
000490 e5911000 LDR r1,[r1,#0] ;368 ; OSTCBCur
000494 e581001c STR r0,[r1,#0x1c] ;368
000498 ef000003 SVC 0x3 ; formerly SWI ;369
00049c e3a00000 MOV r0,#0 ;370
0004a0 e5c60000 STRB r0,[r6,#0] ;370
0004a4 e1a00008 MOV r0,r8 ;371
0004a8 eaffffb6 B |L1.904| ;371
|L1.1196|
0004ac e1a00004 MOV r0,r4 ;373
0004b0 ebfffffe BL OS_EventTO ;373
0004b4 ef000003 SVC 0x3 ; formerly SWI ;374
0004b8 e3a0000a MOV r0,#0xa ;375
0004bc e5c60000 STRB r0,[r6,#0] ;375
0004c0 e3a00000 MOV r0,#0 ;376
0004c4 eaffffaf B |L1.904| ;376
ENDP
OSQPost PROC
;;;398 INT8U OSQPost (OS_EVENT *pevent, void *msg)
;;;399 {
0004c8 e92d4070 PUSH {r4-r6,lr}
0004cc e1a04000 MOV r4,r0
0004d0 e1a06001 MOV r6,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' */
0004d4 e3540000 CMP r4,#0
0004d8 1a000002 BNE |L1.1256|
;;;408 return (OS_ERR_PEVENT_NULL);
0004dc e3a00004 MOV r0,#4
|L1.1248|
0004e0 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 }
0004e4 e12fff1e BX lr
|L1.1256|
0004e8 e3560000 CMP r6,#0 ;410
0004ec 1a000001 BNE |L1.1272| ;410
0004f0 e3a00003 MOV r0,#3 ;411
0004f4 eafffff9 B |L1.1248| ;411
|L1.1272|
0004f8 e5d40000 LDRB r0,[r4,#0] ;413
0004fc e3500002 CMP r0,#2 ;413
000500 0a000001 BEQ |L1.1292| ;413
000504 e3a00001 MOV r0,#1 ;414
000508 eafffff4 B |L1.1248| ;414
|L1.1292|
00050c ef000002 SVC 0x2 ; formerly SWI ;417
000510 e5d40001 LDRB r0,[r4,#1] ;418
000514 e3500000 CMP r0,#0 ;418
000518 0a000007 BEQ |L1.1340| ;418
00051c e3a02004 MOV r2,#4 ;419
000520 e1a01006 MOV r1,r6 ;419
000524 e1a00004 MOV r0,r4 ;419
000528 ebfffffe BL OS_EventTaskRdy ;419
00052c ef000003 SVC 0x3 ; formerly SWI ;420
000530 ebfffffe BL OS_Sched ;421
000534 e3a00000 MOV r0,#0 ;422
000538 eaffffe8 B |L1.1248| ;422
|L1.1340|
00053c e5945004 LDR r5,[r4,#4] ;424
000540 e1d501b6 LDRH r0,[r5,#0x16] ;425
000544 e1d511b4 LDRH r1,[r5,#0x14] ;425
000548 e1500001 CMP r0,r1 ;425
00054c ba000002 BLT |L1.1372| ;425
000550 ef000003 SVC 0x3 ; formerly SWI ;426
000554 e3a0001e MOV r0,#0x1e ;427
000558 eaffffe0 B |L1.1248| ;427
|L1.1372|
00055c e595000c LDR r0,[r5,#0xc] ;429
000560 e2801004 ADD r1,r0,#4 ;429
000564 e585100c STR r1,[r5,#0xc] ;429
000568 e5806000 STR r6,[r0,#0] ;429
00056c e1d501b6 LDRH r0,[r5,#0x16] ;430
000570 e2800001 ADD r0,r0,#1 ;430
000574 e3c00801 BIC r0,r0,#0x10000 ;430
000578 e1c501b6 STRH r0,[r5,#0x16] ;430
00057c e595000c LDR r0,[r5,#0xc] ;431
000580 e5951008 LDR r1,[r5,#8] ;431
000584 e1500001 CMP r0,r1 ;431
000588 1a000001 BNE |L1.1428| ;431
00058c e5950004 LDR r0,[r5,#4] ;432
000590 e585000c STR r0,[r5,#0xc] ;432
|L1.1428|
000594 ef000003 SVC 0x3 ; formerly SWI ;434
000598 e3a00000 MOV r0,#0 ;435
00059c eaffffcf B |L1.1248| ;435
ENDP
OSQPostFront PROC
;;;460 INT8U OSQPostFront (OS_EVENT *pevent, void *msg)
;;;461 {
0005a0 e92d4070 PUSH {r4-r6,lr}
0005a4 e1a04000 MOV r4,r0
0005a8 e1a06001 MOV r6,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' */
0005ac e3540000 CMP r4,#0
0005b0 1a000002 BNE |L1.1472|
;;;470 return (OS_ERR_PEVENT_NULL);
0005b4 e3a00004 MOV r0,#4
|L1.1464|
0005b8 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 }
0005bc e12fff1e BX lr
|L1.1472|
0005c0 e3560000 CMP r6,#0 ;472
0005c4 1a000001 BNE |L1.1488| ;472
0005c8 e3a00003 MOV r0,#3 ;473
0005cc eafffff9 B |L1.1464| ;473
|L1.1488|
0005d0 e5d40000 LDRB r0,[r4,#0] ;475
0005d4 e3500002 CMP r0,#2 ;475
0005d8 0a000001 BEQ |L1.1508| ;475
0005dc e3a00001 MOV r0,#1 ;476
0005e0 eafffff4 B |L1.1464| ;476
|L1.1508|
0005e4 ef000002 SVC 0x2 ; formerly SWI ;479
0005e8 e5d40001 LDRB r0,[r4,#1] ;480
0005ec e3500000 CMP r0,#0 ;480
0005f0 0a000007 BEQ |L1.1556| ;480
0005f4 e3a02004 MOV r2,#4 ;481
0005f8 e1a01006 MOV r1,r6 ;481
0005fc e1a00004 MOV r0,r4 ;481
000600 ebfffffe BL OS_EventTaskRdy ;481
000604 ef000003 SVC 0x3 ; formerly SWI ;482
000608 ebfffffe BL OS_Sched ;483
00060c e3a00000 MOV r0,#0 ;484
000610 eaffffe8 B |L1.1464| ;484
|L1.1556|
000614 e5945004 LDR r5,[r4,#4] ;486
000618 e1d501b6 LDRH r0,[r5,#0x16] ;487
00061c e1d511b4 LDRH r1,[r5,#0x14] ;487
000620 e1500001 CMP r0,r1 ;487
000624 ba000002 BLT |L1.1588| ;487
000628 ef000003 SVC 0x3 ; formerly SWI ;488
00062c e3a0001e MOV r0,#0x1e ;489
000630 eaffffe0 B |L1.1464| ;489
|L1.1588|
000634 e5950010 LDR r0,[r5,#0x10] ;491
000638 e5951004 LDR r1,[r5,#4] ;491
00063c e1500001 CMP r0,r1 ;491
000640 1a000001 BNE |L1.1612| ;491
000644 e5950008 LDR r0,[r5,#8] ;492
000648 e5850010 STR r0,[r5,#0x10] ;492
|L1.1612|
00064c e5950010 LDR r0,[r5,#0x10] ;494
000650 e2400004 SUB r0,r0,#4 ;494
000654 e5850010 STR r0,[r5,#0x10] ;494
000658 e5950010 LDR r0,[r5,#0x10] ;495
00065c e5806000 STR r6,[r0,#0] ;495
000660 e1d501b6 LDRH r0,[r5,#0x16] ;496
000664 e2800001 ADD r0,r0,#1 ;496
000668 e3c00801 BIC r0,r0,#0x10000 ;496
00066c e1c501b6 STRH r0,[r5,#0x16] ;496
000670 ef000003 SVC 0x3 ; formerly SWI ;497
000674 e3a00000 MOV r0,#0 ;498
000678 eaffffce B |L1.1464| ;498
ENDP
OSQPostOpt PROC
;;;546 INT8U OSQPostOpt (OS_EVENT *pevent, void *msg, INT8U opt)
;;;547 {
00067c e92d41f0 PUSH {r4-r8,lr}
000680 e1a04000 MOV r4,r0
000684 e1a05001 MOV r5,r1
000688 e1a07002 MOV r7,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' */
00068c e3540000 CMP r4,#0
000690 1a000002 BNE |L1.1696|
;;;556 return (OS_ERR_PEVENT_NULL);
000694 e3a00004 MOV r0,#4
|L1.1688|
000698 e8bd41f0 POP {r4-r8,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 */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -