📄 os_q.txt
字号:
000438 e5900000 LDR r0,[r0,#0] ;361 ; OSTCBCur
00043c e1c051ba STRH r5,[r0,#0x1a] ;361
000440 e1a00004 MOV r0,r4 ;362
000444 ebfffffe BL OS_EventTaskWait ;362
000448 ef000003 SVC 0x3 ; formerly SWI ;363
00044c ebfffffe BL OS_Sched ;364
000450 ef000002 SVC 0x2 ; formerly SWI ;365
000454 e59f0430 LDR r0,|L1.2188| ;366
000458 e5900000 LDR r0,[r0,#0] ;366 ; OSTCBCur
00045c e5908010 LDR r8,[r0,#0x10] ;366
000460 e3580000 CMP r8,#0 ;367
000464 0a00000e BEQ |L1.1188| ;367
000468 e3a00000 MOV r0,#0 ;368
00046c e59f1418 LDR r1,|L1.2188| ;368
000470 e5911000 LDR r1,[r1,#0] ;368 ; OSTCBCur
000474 e5810010 STR r0,[r1,#0x10] ;368
000478 e59f140c LDR r1,|L1.2188| ;369
00047c e5911000 LDR r1,[r1,#0] ;369 ; OSTCBCur
000480 e5c1001c STRB r0,[r1,#0x1c] ;369
000484 e59f1400 LDR r1,|L1.2188| ;370
000488 e5911000 LDR r1,[r1,#0] ;370 ; OSTCBCur
00048c e581000c STR r0,[r1,#0xc] ;370
000490 ef000003 SVC 0x3 ; formerly SWI ;371
000494 e3a00000 MOV r0,#0 ;372
000498 e5c60000 STRB r0,[r6,#0] ;372
00049c e1a00008 MOV r0,r8 ;373
0004a0 eaffffb7 B |L1.900| ;373
|L1.1188|
0004a4 e1a00004 MOV r0,r4 ;375
0004a8 ebfffffe BL OS_EventTO ;375
0004ac ef000003 SVC 0x3 ; formerly SWI ;376
0004b0 e3a0000a MOV r0,#0xa ;377
0004b4 e5c60000 STRB r0,[r6,#0] ;377
0004b8 e3a00000 MOV r0,#0 ;378
0004bc eaffffb0 B |L1.900| ;378
ENDP
OSQPost PROC
;;;400 INT8U OSQPost (OS_EVENT *pevent, void *msg)
;;;401 {
0004c0 e92d4070 PUSH {r4-r6,lr}
0004c4 e1a04000 MOV r4,r0
0004c8 e1a06001 MOV r6,r1
;;;402 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;403 OS_CPU_SR cpu_sr;
;;;404 #endif
;;;405 OS_Q *pq;
;;;406
;;;407
;;;408 #if OS_ARG_CHK_EN > 0
;;;409 if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
0004cc e3540000 CMP r4,#0
0004d0 1a000001 BNE |L1.1244|
;;;410 return (OS_ERR_PEVENT_NULL);
0004d4 e3a00004 MOV r0,#4
;;;411 }
;;;412 if (msg == (void *)0) { /* Make sure we are not posting a NULL pointer */
;;;413 return (OS_ERR_POST_NULL_PTR);
;;;414 }
;;;415 if (pevent->OSEventType != OS_EVENT_TYPE_Q) { /* Validate event block type */
;;;416 return (OS_ERR_EVENT_TYPE);
;;;417 }
;;;418 #endif
;;;419 OS_ENTER_CRITICAL();
;;;420 if (pevent->OSEventGrp != 0x00) { /* See if any task pending on queue */
;;;421 OS_EventTaskRdy(pevent, msg, OS_STAT_Q); /* Ready highest priority task waiting on event */
;;;422 OS_EXIT_CRITICAL();
;;;423 OS_Sched(); /* Find highest priority task ready to run */
;;;424 return (OS_NO_ERR);
;;;425 }
;;;426 pq = (OS_Q *)pevent->OSEventPtr; /* Point to queue control block */
;;;427 if (pq->OSQEntries >= pq->OSQSize) { /* Make sure queue is not full */
;;;428 OS_EXIT_CRITICAL();
;;;429 return (OS_Q_FULL);
;;;430 }
;;;431 *pq->OSQIn++ = msg; /* Insert message into queue */
;;;432 pq->OSQEntries++; /* Update the nbr of entries in the queue */
;;;433 if (pq->OSQIn == pq->OSQEnd) { /* Wrap IN ptr if we are at end of queue */
;;;434 pq->OSQIn = pq->OSQStart;
;;;435 }
;;;436 OS_EXIT_CRITICAL();
;;;437 return (OS_NO_ERR);
;;;438 }
|L1.1240|
0004d8 e8bd8070 POP {r4-r6,pc}
|L1.1244|
0004dc e3560000 CMP r6,#0 ;412
0004e0 1a000001 BNE |L1.1260| ;412
0004e4 e3a00003 MOV r0,#3 ;413
0004e8 eafffffa B |L1.1240| ;413
|L1.1260|
0004ec e5d40000 LDRB r0,[r4,#0] ;415
0004f0 e3500002 CMP r0,#2 ;415
0004f4 0a000001 BEQ |L1.1280| ;415
0004f8 e3a00001 MOV r0,#1 ;416
0004fc eafffff5 B |L1.1240| ;416
|L1.1280|
000500 ef000002 SVC 0x2 ; formerly SWI ;419
000504 e5d40001 LDRB r0,[r4,#1] ;420
000508 e3500000 CMP r0,#0 ;420
00050c 0a000007 BEQ |L1.1328| ;420
000510 e3a02004 MOV r2,#4 ;421
000514 e1a01006 MOV r1,r6 ;421
000518 e1a00004 MOV r0,r4 ;421
00051c ebfffffe BL OS_EventTaskRdy ;421
000520 ef000003 SVC 0x3 ; formerly SWI ;422
000524 ebfffffe BL OS_Sched ;423
000528 e3a00000 MOV r0,#0 ;424
00052c eaffffe9 B |L1.1240| ;424
|L1.1328|
000530 e5945004 LDR r5,[r4,#4] ;426
000534 e1d501b6 LDRH r0,[r5,#0x16] ;427
000538 e1d511b4 LDRH r1,[r5,#0x14] ;427
00053c e1500001 CMP r0,r1 ;427
000540 ba000002 BLT |L1.1360| ;427
000544 ef000003 SVC 0x3 ; formerly SWI ;428
000548 e3a0001e MOV r0,#0x1e ;429
00054c eaffffe1 B |L1.1240| ;429
|L1.1360|
000550 e595000c LDR r0,[r5,#0xc] ;431
000554 e2801004 ADD r1,r0,#4 ;431
000558 e585100c STR r1,[r5,#0xc] ;431
00055c e5806000 STR r6,[r0,#0] ;431
000560 e1d501b6 LDRH r0,[r5,#0x16] ;432
000564 e2800001 ADD r0,r0,#1 ;432
000568 e3c00801 BIC r0,r0,#0x10000 ;432
00056c e1c501b6 STRH r0,[r5,#0x16] ;432
000570 e595000c LDR r0,[r5,#0xc] ;433
000574 e5951008 LDR r1,[r5,#8] ;433
000578 e1500001 CMP r0,r1 ;433
00057c 1a000001 BNE |L1.1416| ;433
000580 e5950004 LDR r0,[r5,#4] ;434
000584 e585000c STR r0,[r5,#0xc] ;434
|L1.1416|
000588 ef000003 SVC 0x3 ; formerly SWI ;436
00058c e3a00000 MOV r0,#0 ;437
000590 eaffffd0 B |L1.1240| ;437
ENDP
OSQPostFront PROC
;;;462 INT8U OSQPostFront (OS_EVENT *pevent, void *msg)
;;;463 {
000594 e92d4070 PUSH {r4-r6,lr}
000598 e1a04000 MOV r4,r0
00059c e1a06001 MOV r6,r1
;;;464 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;465 OS_CPU_SR cpu_sr;
;;;466 #endif
;;;467 OS_Q *pq;
;;;468
;;;469
;;;470 #if OS_ARG_CHK_EN > 0
;;;471 if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
0005a0 e3540000 CMP r4,#0
0005a4 1a000001 BNE |L1.1456|
;;;472 return (OS_ERR_PEVENT_NULL);
0005a8 e3a00004 MOV r0,#4
;;;473 }
;;;474 if (msg == (void *)0) { /* Make sure we are not posting a NULL pointer */
;;;475 return (OS_ERR_POST_NULL_PTR);
;;;476 }
;;;477 if (pevent->OSEventType != OS_EVENT_TYPE_Q) { /* Validate event block type */
;;;478 return (OS_ERR_EVENT_TYPE);
;;;479 }
;;;480 #endif
;;;481 OS_ENTER_CRITICAL();
;;;482 if (pevent->OSEventGrp != 0x00) { /* See if any task pending on queue */
;;;483 OS_EventTaskRdy(pevent, msg, OS_STAT_Q); /* Ready highest priority task waiting on event */
;;;484 OS_EXIT_CRITICAL();
;;;485 OS_Sched(); /* Find highest priority task ready to run */
;;;486 return (OS_NO_ERR);
;;;487 }
;;;488 pq = (OS_Q *)pevent->OSEventPtr; /* Point to queue control block */
;;;489 if (pq->OSQEntries >= pq->OSQSize) { /* Make sure queue is not full */
;;;490 OS_EXIT_CRITICAL();
;;;491 return (OS_Q_FULL);
;;;492 }
;;;493 if (pq->OSQOut == pq->OSQStart) { /* Wrap OUT ptr if we are at the 1st queue entry */
;;;494 pq->OSQOut = pq->OSQEnd;
;;;495 }
;;;496 pq->OSQOut--;
;;;497 *pq->OSQOut = msg; /* Insert message into queue */
;;;498 pq->OSQEntries++; /* Update the nbr of entries in the queue */
;;;499 OS_EXIT_CRITICAL();
;;;500 return (OS_NO_ERR);
;;;501 }
|L1.1452|
0005ac e8bd8070 POP {r4-r6,pc}
|L1.1456|
0005b0 e3560000 CMP r6,#0 ;474
0005b4 1a000001 BNE |L1.1472| ;474
0005b8 e3a00003 MOV r0,#3 ;475
0005bc eafffffa B |L1.1452| ;475
|L1.1472|
0005c0 e5d40000 LDRB r0,[r4,#0] ;477
0005c4 e3500002 CMP r0,#2 ;477
0005c8 0a000001 BEQ |L1.1492| ;477
0005cc e3a00001 MOV r0,#1 ;478
0005d0 eafffff5 B |L1.1452| ;478
|L1.1492|
0005d4 ef000002 SVC 0x2 ; formerly SWI ;481
0005d8 e5d40001 LDRB r0,[r4,#1] ;482
0005dc e3500000 CMP r0,#0 ;482
0005e0 0a000007 BEQ |L1.1540| ;482
0005e4 e3a02004 MOV r2,#4 ;483
0005e8 e1a01006 MOV r1,r6 ;483
0005ec e1a00004 MOV r0,r4 ;483
0005f0 ebfffffe BL OS_EventTaskRdy ;483
0005f4 ef000003 SVC 0x3 ; formerly SWI ;484
0005f8 ebfffffe BL OS_Sched ;485
0005fc e3a00000 MOV r0,#0 ;486
000600 eaffffe9 B |L1.1452| ;486
|L1.1540|
000604 e5945004 LDR r5,[r4,#4] ;488
000608 e1d501b6 LDRH r0,[r5,#0x16] ;489
00060c e1d511b4 LDRH r1,[r5,#0x14] ;489
000610 e1500001 CMP r0,r1 ;489
000614 ba000002 BLT |L1.1572| ;489
000618 ef000003 SVC 0x3 ; formerly SWI ;490
00061c e3a0001e MOV r0,#0x1e ;491
000620 eaffffe1 B |L1.1452| ;491
|L1.1572|
000624 e5950010 LDR r0,[r5,#0x10] ;493
000628 e5951004 LDR r1,[r5,#4] ;493
00062c e1500001 CMP r0,r1 ;493
000630 1a000001 BNE |L1.1596| ;493
000634 e5950008 LDR r0,[r5,#8] ;494
000638 e5850010 STR r0,[r5,#0x10] ;494
|L1.1596|
00063c e5950010 LDR r0,[r5,#0x10] ;496
000640 e2400004 SUB r0,r0,#4 ;496
000644 e5850010 STR r0,[r5,#0x10] ;496
000648 e5950010 LDR r0,[r5,#0x10] ;497
00064c e5806000 STR r6,[r0,#0] ;497
000650 e1d501b6 LDRH r0,[r5,#0x16] ;498
000654 e2800001 ADD r0,r0,#1 ;498
000658 e3c00801 BIC r0,r0,#0x10000 ;498
00065c e1c501b6 STRH r0,[r5,#0x16] ;498
000660 ef000003 SVC 0x3 ; formerly SWI ;499
000664 e3a00000 MOV r0,#0 ;500
000668 eaffffcf B |L1.1452| ;500
ENDP
OSQPostOpt PROC
;;;548 INT8U OSQPostOpt (OS_EVENT *pevent, void *msg, INT8U opt)
;;;549 {
00066c e92d41f0 PUSH {r4-r8,lr}
000670 e1a04000 MOV r4,r0
000674 e1a05001 MOV r5,r1
000678 e1a07002 MOV r7,r2
;;;550 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;551 OS_CPU_SR cpu_sr;
;;;552 #endif
;;;553 OS_Q *pq;
;;;554
;;;555
;;;556 #if OS_ARG_CHK_EN > 0
;;;557 if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
00067c e3540000 CMP r4,#0
000680 1a000001 BNE |L1.1676|
;;;558 return (OS_ERR_PEVENT_NULL);
000684 e3a00004 MOV r0,#4
;;;559 }
;;;560 if (msg == (void *)0) { /* Make sure we are not posting a NULL pointer */
;;;561 return (OS_ERR_POST_NULL_PTR);
;;;562 }
;;;563 if (pevent->OSEventType != OS_EVENT_TYPE_Q) { /* Validate event block type */
;;;564 return (OS_ERR_EVENT_TYPE);
;;;565 }
;;;566 #endif
;;;567 OS_ENTER_CRITICAL();
;;;568 if (pevent->OSEventGrp != 0x00) { /* See if any task pending on queue */
;;;569 if ((opt & OS_POST_OPT_BROADCAST) != 0x00) { /* Do we need to post msg to ALL waiting tasks ? */
;;;570 while (pevent->OSEventGrp != 0x00) { /* Yes, Post to ALL tasks waiting on queue */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -