📄 os_q.txt
字号:
;;;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();
;;;575 OS_Sched(); /* Find highest priority task ready to run */
;;;576 return (OS_NO_ERR);
;;;577 }
;;;578 pq = (OS_Q *)pevent->OSEventPtr; /* Point to queue control block */
;;;579 if (pq->OSQEntries >= pq->OSQSize) { /* Make sure queue is not full */
;;;580 OS_EXIT_CRITICAL();
;;;581 return (OS_Q_FULL);
;;;582 }
;;;583 if ((opt & OS_POST_OPT_FRONT) != 0x00) { /* Do we post to the FRONT of the queue? */
;;;584 if (pq->OSQOut == pq->OSQStart) { /* Yes, Post as LIFO, Wrap OUT pointer if we ... */
;;;585 pq->OSQOut = pq->OSQEnd; /* ... are at the 1st queue entry */
;;;586 }
;;;587 pq->OSQOut--;
;;;588 *pq->OSQOut = msg; /* Insert message into queue */
;;;589 } else { /* No, Post as FIFO */
;;;590 *pq->OSQIn++ = msg; /* Insert message into queue */
;;;591 if (pq->OSQIn == pq->OSQEnd) { /* Wrap IN ptr if we are at end of queue */
;;;592 pq->OSQIn = pq->OSQStart;
;;;593 }
;;;594 }
;;;595 pq->OSQEntries++; /* Update the nbr of entries in the queue */
;;;596 OS_EXIT_CRITICAL();
;;;597 return (OS_NO_ERR);
;;;598 }
00069c e12fff1e BX lr
|L1.1696|
0006a0 e3550000 CMP r5,#0 ;558
0006a4 1a000001 BNE |L1.1712| ;558
0006a8 e3a00003 MOV r0,#3 ;559
0006ac eafffff9 B |L1.1688| ;559
|L1.1712|
0006b0 e5d40000 LDRB r0,[r4,#0] ;561
0006b4 e3500002 CMP r0,#2 ;561
0006b8 0a000001 BEQ |L1.1732| ;561
0006bc e3a00001 MOV r0,#1 ;562
0006c0 eafffff4 B |L1.1688| ;562
|L1.1732|
0006c4 ef000002 SVC 0x2 ; formerly SWI ;565
0006c8 e5d40001 LDRB r0,[r4,#1] ;566
0006cc e3500000 CMP r0,#0 ;566
0006d0 0a000012 BEQ |L1.1824| ;566
0006d4 e3170001 TST r7,#1 ;567
0006d8 0a000008 BEQ |L1.1792| ;567
0006dc ea000003 B |L1.1776| ;568
|L1.1760|
0006e0 e3a02004 MOV r2,#4 ;569
0006e4 e1a01005 MOV r1,r5 ;569
0006e8 e1a00004 MOV r0,r4 ;569
0006ec ebfffffe BL OS_EventTaskRdy ;569
|L1.1776|
0006f0 e5d40001 LDRB r0,[r4,#1] ;568
0006f4 e3500000 CMP r0,#0 ;568
0006f8 1afffff8 BNE |L1.1760| ;568
0006fc ea000003 B |L1.1808| ;568
|L1.1792|
000700 e3a02004 MOV r2,#4 ;572
000704 e1a01005 MOV r1,r5 ;572
000708 e1a00004 MOV r0,r4 ;572
00070c ebfffffe BL OS_EventTaskRdy ;572
|L1.1808|
000710 ef000003 SVC 0x3 ; formerly SWI ;574
000714 ebfffffe BL OS_Sched ;575
000718 e3a00000 MOV r0,#0 ;576
00071c eaffffdd B |L1.1688| ;576
|L1.1824|
000720 e5946004 LDR r6,[r4,#4] ;578
000724 e1d601b6 LDRH r0,[r6,#0x16] ;579
000728 e1d611b4 LDRH r1,[r6,#0x14] ;579
00072c e1500001 CMP r0,r1 ;579
000730 ba000002 BLT |L1.1856| ;579
000734 ef000003 SVC 0x3 ; formerly SWI ;580
000738 e3a0001e MOV r0,#0x1e ;581
00073c eaffffd5 B |L1.1688| ;581
|L1.1856|
000740 e3170002 TST r7,#2 ;583
000744 0a00000b BEQ |L1.1912| ;583
000748 e5960010 LDR r0,[r6,#0x10] ;584
00074c e5961004 LDR r1,[r6,#4] ;584
000750 e1500001 CMP r0,r1 ;584
000754 1a000001 BNE |L1.1888| ;584
000758 e5960008 LDR r0,[r6,#8] ;585
00075c e5860010 STR r0,[r6,#0x10] ;585
|L1.1888|
000760 e5960010 LDR r0,[r6,#0x10] ;587
000764 e2400004 SUB r0,r0,#4 ;587
000768 e5860010 STR r0,[r6,#0x10] ;587
00076c e5960010 LDR r0,[r6,#0x10] ;588
000770 e5805000 STR r5,[r0,#0] ;588
000774 ea000009 B |L1.1952| ;588
|L1.1912|
000778 e596000c LDR r0,[r6,#0xc] ;590
00077c e2801004 ADD r1,r0,#4 ;590
000780 e586100c STR r1,[r6,#0xc] ;590
000784 e5805000 STR r5,[r0,#0] ;590
000788 e596000c LDR r0,[r6,#0xc] ;591
00078c e5961008 LDR r1,[r6,#8] ;591
000790 e1500001 CMP r0,r1 ;591
000794 1a000001 BNE |L1.1952| ;591
000798 e5960004 LDR r0,[r6,#4] ;592
00079c e586000c STR r0,[r6,#0xc] ;592
|L1.1952|
0007a0 e1d601b6 LDRH r0,[r6,#0x16] ;595
0007a4 e2800001 ADD r0,r0,#1 ;595
0007a8 e3c00801 BIC r0,r0,#0x10000 ;595
0007ac e1c601b6 STRH r0,[r6,#0x16] ;595
0007b0 ef000003 SVC 0x3 ; formerly SWI ;596
0007b4 e3a00000 MOV r0,#0 ;597
0007b8 eaffffb6 B |L1.1688| ;597
ENDP
OSQQuery PROC
;;;619 INT8U OSQQuery (OS_EVENT *pevent, OS_Q_DATA *pdata)
;;;620 {
0007bc e92d41f0 PUSH {r4-r8,lr}
0007c0 e1a04000 MOV r4,r0
0007c4 e1a05001 MOV r5,r1
;;;621 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;622 OS_CPU_SR cpu_sr;
;;;623 #endif
;;;624 OS_Q *pq;
;;;625 INT8U *psrc;
;;;626 INT8U *pdest;
;;;627
;;;628
;;;629 #if OS_ARG_CHK_EN > 0
;;;630 if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
0007c8 e3540000 CMP r4,#0
0007cc 1a000002 BNE |L1.2012|
;;;631 return (OS_ERR_PEVENT_NULL);
0007d0 e3a00004 MOV r0,#4
|L1.2004|
0007d4 e8bd41f0 POP {r4-r8,lr}
;;;632 }
;;;633 if (pevent->OSEventType != OS_EVENT_TYPE_Q) { /* Validate event block type */
;;;634 return (OS_ERR_EVENT_TYPE);
;;;635 }
;;;636 #endif
;;;637 OS_ENTER_CRITICAL();
;;;638 pdata->OSEventGrp = pevent->OSEventGrp; /* Copy message queue wait list */
;;;639 psrc = &pevent->OSEventTbl[0];
;;;640 pdest = &pdata->OSEventTbl[0];
;;;641 #if OS_EVENT_TBL_SIZE > 0
;;;642 *pdest++ = *psrc++;
;;;643 #endif
;;;644
;;;645 #if OS_EVENT_TBL_SIZE > 1
;;;646 *pdest++ = *psrc++;
;;;647 #endif
;;;648
;;;649 #if OS_EVENT_TBL_SIZE > 2
;;;650 *pdest++ = *psrc++;
;;;651 #endif
;;;652
;;;653 #if OS_EVENT_TBL_SIZE > 3
;;;654 *pdest++ = *psrc++;
;;;655 #endif
;;;656
;;;657 #if OS_EVENT_TBL_SIZE > 4
;;;658 *pdest++ = *psrc++;
;;;659 #endif
;;;660
;;;661 #if OS_EVENT_TBL_SIZE > 5
;;;662 *pdest++ = *psrc++;
;;;663 #endif
;;;664
;;;665 #if OS_EVENT_TBL_SIZE > 6
;;;666 *pdest++ = *psrc++;
;;;667 #endif
;;;668
;;;669 #if OS_EVENT_TBL_SIZE > 7
;;;670 *pdest = *psrc;
;;;671 #endif
;;;672 pq = (OS_Q *)pevent->OSEventPtr;
;;;673 if (pq->OSQEntries > 0) {
;;;674 pdata->OSMsg = *pq->OSQOut; /* Get next message to return if available */
;;;675 } else {
;;;676 pdata->OSMsg = (void *)0;
;;;677 }
;;;678 pdata->OSNMsgs = pq->OSQEntries;
;;;679 pdata->OSQSize = pq->OSQSize;
;;;680 OS_EXIT_CRITICAL();
;;;681 return (OS_NO_ERR);
;;;682 }
0007d8 e12fff1e BX lr
|L1.2012|
0007dc e5d40000 LDRB r0,[r4,#0] ;633
0007e0 e3500002 CMP r0,#2 ;633
0007e4 0a000001 BEQ |L1.2032| ;633
0007e8 e3a00001 MOV r0,#1 ;634
0007ec eafffff8 B |L1.2004| ;634
|L1.2032|
0007f0 ef000002 SVC 0x2 ; formerly SWI ;637
0007f4 e5d40001 LDRB r0,[r4,#1] ;638
0007f8 e5c5000a STRB r0,[r5,#0xa] ;638
0007fc e2847008 ADD r7,r4,#8 ;639
000800 e2858008 ADD r8,r5,#8 ;640
000804 e4d70001 LDRB r0,[r7],#1 ;642
000808 e4c80001 STRB r0,[r8],#1 ;642
00080c e4d70001 LDRB r0,[r7],#1 ;646
000810 e4c80001 STRB r0,[r8],#1 ;646
000814 e5946004 LDR r6,[r4,#4] ;672
000818 e1d601b6 LDRH r0,[r6,#0x16] ;673
00081c e3500000 CMP r0,#0 ;673
000820 da000003 BLE |L1.2100| ;673
000824 e5960010 LDR r0,[r6,#0x10] ;674
000828 e5900000 LDR r0,[r0,#0] ;674
00082c e5850000 STR r0,[r5,#0] ;674
000830 ea000001 B |L1.2108| ;674
|L1.2100|
000834 e3a00000 MOV r0,#0 ;676
000838 e5850000 STR r0,[r5,#0] ;676
|L1.2108|
00083c e1d601b6 LDRH r0,[r6,#0x16] ;678
000840 e1c500b4 STRH r0,[r5,#4] ;678
000844 e1d601b4 LDRH r0,[r6,#0x14] ;679
000848 e1c500b6 STRH r0,[r5,#6] ;679
00084c ef000003 SVC 0x3 ; formerly SWI ;680
000850 e3a00000 MOV r0,#0 ;681
000854 eaffffde B |L1.2004| ;681
ENDP
OS_QInit PROC
;;;713
;;;714 pq1 = &OSQTbl[0];
000858 e59f204c LDR r2,|L1.2220|
;;;715 pq2 = &OSQTbl[1];
00085c e2821018 ADD r1,r2,#0x18
;;;716 for (i = 0; i < (OS_MAX_QS - 1); i++) { /* Init. list of free QUEUE control blocks */
000860 e3a00000 MOV r0,#0
000864 ea000004 B |L1.2172|
;;;717 pq1->OSQPtr = pq2;
|L1.2152|
000868 e5821000 STR r1,[r2,#0]
;;;718 pq1++;
00086c e2822018 ADD r2,r2,#0x18
;;;719 pq2++;
000870 e2811018 ADD r1,r1,#0x18
000874 e2803001 ADD r3,r0,#1 ;716
000878 e3c30801 BIC r0,r3,#0x10000 ;716
|L1.2172|
00087c e3500001 CMP r0,#1 ;716
000880 bafffff8 BLT |L1.2152| ;716
;;;720 }
;;;721 pq1->OSQPtr = (OS_Q *)0;
000884 e3a03000 MOV r3,#0
000888 e5823000 STR r3,[r2,#0]
;;;722 OSQFreeList = &OSQTbl[0];
00088c e59f3018 LDR r3,|L1.2220|
000890 e59fc00c LDR r12,|L1.2212|
000894 e58c3000 STR r3,[r12,#0] ; OSQFreeList
;;;723 #endif
;;;724 }
000898 e12fff1e BX lr
|L1.2204|
00089c 00000000 DCD OSIntNesting
|L1.2208|
0008a0 00000000 DCD OSEventFreeList
|L1.2212|
0008a4 00000000 DCD OSQFreeList
|L1.2216|
0008a8 00000000 DCD OSTCBCur
|L1.2220|
0008ac 00000000 DCD OSQTbl
ENDP
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -