📄 os_q.txt
字号:
0003fc e1a08001 MOV r8,r1
;;;499 INT8U nbr_tasks;
;;;500 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;501 OS_CPU_SR cpu_sr = 0;
;;;502 #endif
;;;503
;;;504
;;;505
;;;506 #if OS_ARG_CHK_EN > 0
;;;507 if (perr == (INT8U *)0) { /* Validate 'perr' */
;;;508 return (0);
;;;509 }
;;;510 if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
;;;511 *perr = OS_ERR_PEVENT_NULL;
;;;512 return (0);
;;;513 }
;;;514 #endif
;;;515 if (pevent->OSEventType != OS_EVENT_TYPE_Q) { /* Validate event block type */
000400 e5d01000 LDRB r1,[r0,#0]
000404 e1a05000 MOV r5,r0 ;498
000408 e1a06002 MOV r6,r2 ;498
00040c e3510002 CMP r1,#2
000410 e3a00001 MOV r0,#1
000414 0a000003 BEQ |L1.1064|
|L1.1048|
;;;516 *perr = OS_ERR_EVENT_TYPE;
000418 e5c60000 STRB r0,[r6,#0]
;;;517 return (0);
00041c e3a00000 MOV r0,#0
|L1.1056|
000420 e8bd41f0 POP {r4-r8,lr}
;;;518 }
;;;519 OS_ENTER_CRITICAL();
;;;520 if (pevent->OSEventGrp != 0) { /* See if any task waiting on queue? */
;;;521 nbr_tasks = 0;
;;;522 switch (opt) {
;;;523 case OS_PEND_OPT_BROADCAST: /* Do we need to abort ALL waiting tasks? */
;;;524 while (pevent->OSEventGrp != 0) { /* Yes, ready ALL tasks waiting on queue */
;;;525 (void)OS_EventTaskRdy(pevent, (void *)0, OS_STAT_Q, OS_STAT_PEND_ABORT);
;;;526 nbr_tasks++;
;;;527 }
;;;528 break;
;;;529
;;;530 case OS_PEND_OPT_NONE: /* No, ready HPT waiting on queue */
;;;531 default:
;;;532 (void)OS_EventTaskRdy(pevent, (void *)0, OS_STAT_Q, OS_STAT_PEND_ABORT);
;;;533 nbr_tasks++;
;;;534 break;
;;;535 }
;;;536 OS_EXIT_CRITICAL();
;;;537 OS_Sched(); /* Find HPT ready to run */
;;;538 *perr = OS_ERR_PEND_ABORT;
;;;539 return (nbr_tasks);
;;;540 }
;;;541 OS_EXIT_CRITICAL();
;;;542 *perr = OS_ERR_NONE;
;;;543 return (0); /* No tasks waiting on queue */
;;;544 }
000424 e12fff1e BX lr
|L1.1064|
000428 ebfffffe BL OS_CPU_SR_Save
00042c e1a07000 MOV r7,r0 ;519
000430 e5d5000a LDRB r0,[r5,#0xa] ;520
000434 e3500000 CMP r0,#0 ;520
000438 0a00001a BEQ |L1.1192|
00043c e3580001 CMP r8,#1 ;522
000440 e3a04000 MOV r4,#0 ;521
000444 1a00000a BNE |L1.1140|
|L1.1096|
000448 e3a03002 MOV r3,#2 ;525
00044c e3a02004 MOV r2,#4 ;525
000450 e3a01000 MOV r1,#0 ;525
000454 e1a00005 MOV r0,r5 ;525
000458 ebfffffe BL OS_EventTaskRdy
00045c e5d5100a LDRB r1,[r5,#0xa] ;524
000460 e2840001 ADD r0,r4,#1 ;526
000464 e20040ff AND r4,r0,#0xff ;526
000468 e3510000 CMP r1,#0 ;524
00046c 1afffff5 BNE |L1.1096|
000470 ea000005 B |L1.1164|
|L1.1140|
000474 e3a03002 MOV r3,#2 ;532
000478 e3a02004 MOV r2,#4 ;532
00047c e3a01000 MOV r1,#0 ;532
000480 e1a00005 MOV r0,r5 ;532
000484 ebfffffe BL OS_EventTaskRdy
000488 e3a04001 MOV r4,#1 ;533
|L1.1164|
00048c e1a00007 MOV r0,r7 ;536
000490 ebfffffe BL OS_CPU_SR_Restore
000494 ebfffffe BL OS_Sched
000498 e3a0000e MOV r0,#0xe ;538
00049c e5c60000 STRB r0,[r6,#0] ;538
0004a0 e1a00004 MOV r0,r4 ;539
0004a4 eaffffdd B |L1.1056|
|L1.1192|
0004a8 e1a00007 MOV r0,r7 ;541
0004ac ebfffffe BL OS_CPU_SR_Restore
0004b0 e3a00000 MOV r0,#0 ;542
0004b4 eaffffd7 B |L1.1048|
;;;545 #endif
ENDP
OSQPost PROC
;;;568 INT8U OSQPost (OS_EVENT *pevent, void *pmsg)
;;;569 {
0004b8 e92d4070 PUSH {r4-r6,lr}
0004bc e1a04000 MOV r4,r0
;;;570 OS_Q *pq;
;;;571 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;572 OS_CPU_SR cpu_sr = 0;
;;;573 #endif
;;;574
;;;575
;;;576
;;;577 #if OS_ARG_CHK_EN > 0
;;;578 if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
;;;579 return (OS_ERR_PEVENT_NULL);
;;;580 }
;;;581 #endif
;;;582 if (pevent->OSEventType != OS_EVENT_TYPE_Q) { /* Validate event block type */
0004c0 e5d00000 LDRB r0,[r0,#0]
0004c4 e1a06001 MOV r6,r1 ;569
0004c8 e3500002 CMP r0,#2
;;;583 return (OS_ERR_EVENT_TYPE);
0004cc 13a00001 MOVNE r0,#1
0004d0 1a000015 BNE |L1.1324|
;;;584 }
;;;585 OS_ENTER_CRITICAL();
0004d4 ebfffffe BL OS_CPU_SR_Save
0004d8 e1a05000 MOV r5,r0
;;;586 if (pevent->OSEventGrp != 0) { /* See if any task pending on queue */
0004dc e5d4000a LDRB r0,[r4,#0xa]
0004e0 e3500000 CMP r0,#0
0004e4 0a000008 BEQ |L1.1292|
;;;587 /* Ready highest priority task waiting on event */
;;;588 (void)OS_EventTaskRdy(pevent, pmsg, OS_STAT_Q, OS_STAT_PEND_OK);
0004e8 e3a03000 MOV r3,#0
0004ec e3a02004 MOV r2,#4
0004f0 e1a01006 MOV r1,r6
0004f4 e1a00004 MOV r0,r4
0004f8 ebfffffe BL OS_EventTaskRdy
;;;589 OS_EXIT_CRITICAL();
0004fc e1a00005 MOV r0,r5
000500 ebfffffe BL OS_CPU_SR_Restore
;;;590 OS_Sched(); /* Find highest priority task ready to run */
000504 ebfffffe BL OS_Sched
;;;591 return (OS_ERR_NONE);
000508 ea000017 B |L1.1388|
|L1.1292|
;;;592 }
;;;593 pq = (OS_Q *)pevent->OSEventPtr; /* Point to queue control block */
00050c e5941004 LDR r1,[r4,#4]
;;;594 if (pq->OSQEntries >= pq->OSQSize) { /* Make sure queue is not full */
000510 e1d101b6 LDRH r0,[r1,#0x16]
000514 e1d121b4 LDRH r2,[r1,#0x14]
000518 e1500002 CMP r0,r2
00051c 3a000004 BCC |L1.1332|
;;;595 OS_EXIT_CRITICAL();
000520 e1a00005 MOV r0,r5
000524 ebfffffe BL OS_CPU_SR_Restore
;;;596 return (OS_ERR_Q_FULL);
000528 e3a0001e MOV r0,#0x1e
|L1.1324|
00052c e8bd4070 POP {r4-r6,lr}
;;;597 }
;;;598 *pq->OSQIn++ = pmsg; /* Insert message into queue */
;;;599 pq->OSQEntries++; /* Update the nbr of entries in the queue */
;;;600 if (pq->OSQIn == pq->OSQEnd) { /* Wrap IN ptr if we are at end of queue */
;;;601 pq->OSQIn = pq->OSQStart;
;;;602 }
;;;603 OS_EXIT_CRITICAL();
;;;604 return (OS_ERR_NONE);
;;;605 }
000530 e12fff1e BX lr
|L1.1332|
000534 e591200c LDR r2,[r1,#0xc] ;598
000538 e2820004 ADD r0,r2,#4 ;598
00053c e581000c STR r0,[r1,#0xc] ;598
000540 e5826000 STR r6,[r2,#0] ;598
000544 e1d101b6 LDRH r0,[r1,#0x16] ;599
000548 e2800001 ADD r0,r0,#1 ;599
00054c e1c101b6 STRH r0,[r1,#0x16] ;599
000550 e591000c LDR r0,[r1,#0xc] ;600
000554 e5912008 LDR r2,[r1,#8] ;600
000558 e1500002 CMP r0,r2 ;600
00055c 05910004 LDREQ r0,[r1,#4] ;601
000560 0581000c STREQ r0,[r1,#0xc] ;601
000564 e1a00005 MOV r0,r5 ;603
000568 ebfffffe BL OS_CPU_SR_Restore
|L1.1388|
00056c e3a00000 MOV r0,#0 ;604
000570 eaffffed B |L1.1324|
;;;606 #endif
ENDP
OSQPostFront PROC
;;;630 INT8U OSQPostFront (OS_EVENT *pevent, void *pmsg)
;;;631 {
000574 e92d4070 PUSH {r4-r6,lr}
000578 e1a04000 MOV r4,r0
;;;632 OS_Q *pq;
;;;633 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;634 OS_CPU_SR cpu_sr = 0;
;;;635 #endif
;;;636
;;;637
;;;638
;;;639 #if OS_ARG_CHK_EN > 0
;;;640 if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
;;;641 return (OS_ERR_PEVENT_NULL);
;;;642 }
;;;643 #endif
;;;644 if (pevent->OSEventType != OS_EVENT_TYPE_Q) { /* Validate event block type */
00057c e5d00000 LDRB r0,[r0,#0]
000580 e1a06001 MOV r6,r1 ;631
000584 e3500002 CMP r0,#2
;;;645 return (OS_ERR_EVENT_TYPE);
000588 13a00001 MOVNE r0,#1
00058c 1a000015 BNE |L1.1512|
;;;646 }
;;;647 OS_ENTER_CRITICAL();
000590 ebfffffe BL OS_CPU_SR_Save
000594 e1a05000 MOV r5,r0
;;;648 if (pevent->OSEventGrp != 0) { /* See if any task pending on queue */
000598 e5d4000a LDRB r0,[r4,#0xa]
00059c e3500000 CMP r0,#0
0005a0 0a000008 BEQ |L1.1480|
;;;649 /* Ready highest priority task waiting on event */
;;;650 (void)OS_EventTaskRdy(pevent, pmsg, OS_STAT_Q, OS_STAT_PEND_OK);
0005a4 e3a03000 MOV r3,#0
0005a8 e3a02004 MOV r2,#4
0005ac e1a01006 MOV r1,r6
0005b0 e1a00004 MOV r0,r4
0005b4 ebfffffe BL OS_EventTaskRdy
;;;651 OS_EXIT_CRITICAL();
0005b8 e1a00005 MOV r0,r5
0005bc ebfffffe BL OS_CPU_SR_Restore
;;;652 OS_Sched(); /* Find highest priority task ready to run */
0005c0 ebfffffe BL OS_Sched
;;;653 return (OS_ERR_NONE);
0005c4 ea000016 B |L1.1572|
|L1.1480|
;;;654 }
;;;655 pq = (OS_Q *)pevent->OSEventPtr; /* Point to queue control block */
0005c8 e5941004 LDR r1,[r4,#4]
;;;656 if (pq->OSQEntries >= pq->OSQSize) { /* Make sure queue is not full */
0005cc e1d101b6 LDRH r0,[r1,#0x16]
0005d0 e1d121b4 LDRH r2,[r1,#0x14]
0005d4 e1500002 CMP r0,r2
0005d8 3a000004 BCC |L1.1520|
;;;657 OS_EXIT_CRITICAL();
0005dc e1a00005 MOV r0,r5
0005e0 ebfffffe BL OS_CPU_SR_Restore
;;;658 return (OS_ERR_Q_FULL);
0005e4 e3a0001e MOV r0,#0x1e
|L1.1512|
0005e8 e8bd4070 POP {r4-r6,lr}
;;;659 }
;;;660 if (pq->OSQOut == pq->OSQStart) { /* Wrap OUT ptr if we are at the 1st queue entry */
;;;661 pq->OSQOut = pq->OSQEnd;
;;;662 }
;;;663 pq->OSQOut--;
;;;664 *pq->OSQOut = pmsg; /* Insert message into queue */
;;;665 pq->OSQEntries++; /* Update the nbr of entries in the queue */
;;;666 OS_EXIT_CRITICAL();
;;;667 return (OS_ERR_NONE);
;;;668 }
0005ec e12fff1e BX lr
|L1.1520|
0005f0 e5910010 LDR r0,[r1,#0x10] ;660
0005f4 e5912004 LDR r2,[r1,#4] ;660
0005f8 e1500002 CMP r0,r2 ;660
0005fc 05910008 LDREQ r0,[r1,#8] ;661
000600 e2402004 SUB r2,r0,#4 ;663
000604 05810010 STREQ r0,[r1,#0x10] ;661
000608 e5812010 STR r2,[r1,#0x10] ;664
00060c e5006004 STR r6,[r0,#-4] ;664
000610 e1d101b6 LDRH r0,[r1,#0x16] ;665
000614 e2800001 ADD r0,r0,#1 ;665
000618 e1c101b6 STRH r0,[r1,#0x16] ;665
00061c e1a00005 MOV r0,r5 ;666
000620 ebfffffe BL OS_CPU_SR_Restore
|L1.1572|
000624 e3a00000 MOV r0,#0 ;667
000628 eaffffee B |L1.1512|
;;;669 #endif
ENDP
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -