os_q.txt
来自「在KEIL下成功使用UCOS-II嵌入式操作系统」· 文本 代码 · 共 1,094 行 · 第 1/4 页
TXT
1,094 行
;;;571 OS_EventTaskRdy(pevent, msg, OS_STAT_Q);
;;;572 }
;;;573 } else {
;;;574 OS_EventTaskRdy(pevent, msg, OS_STAT_Q); /* No, Post to HPT waiting on queue */
;;;575 }
;;;576 OS_EXIT_CRITICAL();
;;;577 OS_Sched(); /* Find highest priority task ready to run */
;;;578 return (OS_NO_ERR);
;;;579 }
;;;580 pq = (OS_Q *)pevent->OSEventPtr; /* Point to queue control block */
;;;581 if (pq->OSQEntries >= pq->OSQSize) { /* Make sure queue is not full */
;;;582 OS_EXIT_CRITICAL();
;;;583 return (OS_Q_FULL);
;;;584 }
;;;585 if ((opt & OS_POST_OPT_FRONT) != 0x00) { /* Do we post to the FRONT of the queue? */
;;;586 if (pq->OSQOut == pq->OSQStart) { /* Yes, Post as LIFO, Wrap OUT pointer if we ... */
;;;587 pq->OSQOut = pq->OSQEnd; /* ... are at the 1st queue entry */
;;;588 }
;;;589 pq->OSQOut--;
;;;590 *pq->OSQOut = msg; /* Insert message into queue */
;;;591 } else { /* No, Post as FIFO */
;;;592 *pq->OSQIn++ = msg; /* Insert message into queue */
;;;593 if (pq->OSQIn == pq->OSQEnd) { /* Wrap IN ptr if we are at end of queue */
;;;594 pq->OSQIn = pq->OSQStart;
;;;595 }
;;;596 }
;;;597 pq->OSQEntries++; /* Update the nbr of entries in the queue */
;;;598 OS_EXIT_CRITICAL();
;;;599 return (OS_NO_ERR);
;;;600 }
|L1.1672|
000688 e8bd81f0 POP {r4-r8,pc}
|L1.1676|
00068c e3550000 CMP r5,#0 ;560
000690 1a000001 BNE |L1.1692| ;560
000694 e3a00003 MOV r0,#3 ;561
000698 eafffffa B |L1.1672| ;561
|L1.1692|
00069c e5d40000 LDRB r0,[r4,#0] ;563
0006a0 e3500002 CMP r0,#2 ;563
0006a4 0a000001 BEQ |L1.1712| ;563
0006a8 e3a00001 MOV r0,#1 ;564
0006ac eafffff5 B |L1.1672| ;564
|L1.1712|
0006b0 ef000002 SVC 0x2 ; formerly SWI ;567
0006b4 e5d40001 LDRB r0,[r4,#1] ;568
0006b8 e3500000 CMP r0,#0 ;568
0006bc 0a000012 BEQ |L1.1804| ;568
0006c0 e3170001 TST r7,#1 ;569
0006c4 0a000008 BEQ |L1.1772| ;569
0006c8 ea000003 B |L1.1756| ;570
|L1.1740|
0006cc e3a02004 MOV r2,#4 ;571
0006d0 e1a01005 MOV r1,r5 ;571
0006d4 e1a00004 MOV r0,r4 ;571
0006d8 ebfffffe BL OS_EventTaskRdy ;571
|L1.1756|
0006dc e5d40001 LDRB r0,[r4,#1] ;570
0006e0 e3500000 CMP r0,#0 ;570
0006e4 1afffff8 BNE |L1.1740| ;570
0006e8 ea000003 B |L1.1788| ;570
|L1.1772|
0006ec e3a02004 MOV r2,#4 ;574
0006f0 e1a01005 MOV r1,r5 ;574
0006f4 e1a00004 MOV r0,r4 ;574
0006f8 ebfffffe BL OS_EventTaskRdy ;574
|L1.1788|
0006fc ef000003 SVC 0x3 ; formerly SWI ;576
000700 ebfffffe BL OS_Sched ;577
000704 e3a00000 MOV r0,#0 ;578
000708 eaffffde B |L1.1672| ;578
|L1.1804|
00070c e5946004 LDR r6,[r4,#4] ;580
000710 e1d601b6 LDRH r0,[r6,#0x16] ;581
000714 e1d611b4 LDRH r1,[r6,#0x14] ;581
000718 e1500001 CMP r0,r1 ;581
00071c ba000002 BLT |L1.1836| ;581
000720 ef000003 SVC 0x3 ; formerly SWI ;582
000724 e3a0001e MOV r0,#0x1e ;583
000728 eaffffd6 B |L1.1672| ;583
|L1.1836|
00072c e3170002 TST r7,#2 ;585
000730 0a00000b BEQ |L1.1892| ;585
000734 e5960010 LDR r0,[r6,#0x10] ;586
000738 e5961004 LDR r1,[r6,#4] ;586
00073c e1500001 CMP r0,r1 ;586
000740 1a000001 BNE |L1.1868| ;586
000744 e5960008 LDR r0,[r6,#8] ;587
000748 e5860010 STR r0,[r6,#0x10] ;587
|L1.1868|
00074c e5960010 LDR r0,[r6,#0x10] ;589
000750 e2400004 SUB r0,r0,#4 ;589
000754 e5860010 STR r0,[r6,#0x10] ;589
000758 e5960010 LDR r0,[r6,#0x10] ;590
00075c e5805000 STR r5,[r0,#0] ;590
000760 ea000009 B |L1.1932| ;590
|L1.1892|
000764 e596000c LDR r0,[r6,#0xc] ;592
000768 e2801004 ADD r1,r0,#4 ;592
00076c e586100c STR r1,[r6,#0xc] ;592
000770 e5805000 STR r5,[r0,#0] ;592
000774 e596000c LDR r0,[r6,#0xc] ;593
000778 e5961008 LDR r1,[r6,#8] ;593
00077c e1500001 CMP r0,r1 ;593
000780 1a000001 BNE |L1.1932| ;593
000784 e5960004 LDR r0,[r6,#4] ;594
000788 e586000c STR r0,[r6,#0xc] ;594
|L1.1932|
00078c e1d601b6 LDRH r0,[r6,#0x16] ;597
000790 e2800001 ADD r0,r0,#1 ;597
000794 e3c00801 BIC r0,r0,#0x10000 ;597
000798 e1c601b6 STRH r0,[r6,#0x16] ;597
00079c ef000003 SVC 0x3 ; formerly SWI ;598
0007a0 e3a00000 MOV r0,#0 ;599
0007a4 eaffffb7 B |L1.1672| ;599
ENDP
OSQQuery PROC
;;;621 INT8U OSQQuery (OS_EVENT *pevent, OS_Q_DATA *pdata)
;;;622 {
0007a8 e92d41f0 PUSH {r4-r8,lr}
0007ac e1a04000 MOV r4,r0
0007b0 e1a05001 MOV r5,r1
;;;623 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;624 OS_CPU_SR cpu_sr;
;;;625 #endif
;;;626 OS_Q *pq;
;;;627 INT8U *psrc;
;;;628 INT8U *pdest;
;;;629
;;;630
;;;631 #if OS_ARG_CHK_EN > 0
;;;632 if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
0007b4 e3540000 CMP r4,#0
0007b8 1a000001 BNE |L1.1988|
;;;633 return (OS_ERR_PEVENT_NULL);
0007bc e3a00004 MOV r0,#4
;;;634 }
;;;635 if (pevent->OSEventType != OS_EVENT_TYPE_Q) { /* Validate event block type */
;;;636 return (OS_ERR_EVENT_TYPE);
;;;637 }
;;;638 #endif
;;;639 OS_ENTER_CRITICAL();
;;;640 pdata->OSEventGrp = pevent->OSEventGrp; /* Copy message queue wait list */
;;;641 psrc = &pevent->OSEventTbl[0];
;;;642 pdest = &pdata->OSEventTbl[0];
;;;643 #if OS_EVENT_TBL_SIZE > 0
;;;644 *pdest++ = *psrc++;
;;;645 #endif
;;;646
;;;647 #if OS_EVENT_TBL_SIZE > 1
;;;648 *pdest++ = *psrc++;
;;;649 #endif
;;;650
;;;651 #if OS_EVENT_TBL_SIZE > 2
;;;652 *pdest++ = *psrc++;
;;;653 #endif
;;;654
;;;655 #if OS_EVENT_TBL_SIZE > 3
;;;656 *pdest++ = *psrc++;
;;;657 #endif
;;;658
;;;659 #if OS_EVENT_TBL_SIZE > 4
;;;660 *pdest++ = *psrc++;
;;;661 #endif
;;;662
;;;663 #if OS_EVENT_TBL_SIZE > 5
;;;664 *pdest++ = *psrc++;
;;;665 #endif
;;;666
;;;667 #if OS_EVENT_TBL_SIZE > 6
;;;668 *pdest++ = *psrc++;
;;;669 #endif
;;;670
;;;671 #if OS_EVENT_TBL_SIZE > 7
;;;672 *pdest = *psrc;
;;;673 #endif
;;;674 pq = (OS_Q *)pevent->OSEventPtr;
;;;675 if (pq->OSQEntries > 0) {
;;;676 pdata->OSMsg = pq->OSQOut; /* Get next message to return if available */
;;;677 } else {
;;;678 pdata->OSMsg = (void *)0;
;;;679 }
;;;680 pdata->OSNMsgs = pq->OSQEntries;
;;;681 pdata->OSQSize = pq->OSQSize;
;;;682 OS_EXIT_CRITICAL();
;;;683 return (OS_NO_ERR);
;;;684 }
|L1.1984|
0007c0 e8bd81f0 POP {r4-r8,pc}
|L1.1988|
0007c4 e5d40000 LDRB r0,[r4,#0] ;635
0007c8 e3500002 CMP r0,#2 ;635
0007cc 0a000001 BEQ |L1.2008| ;635
0007d0 e3a00001 MOV r0,#1 ;636
0007d4 eafffff9 B |L1.1984| ;636
|L1.2008|
0007d8 ef000002 SVC 0x2 ; formerly SWI ;639
0007dc e5d40001 LDRB r0,[r4,#1] ;640
0007e0 e5c5000a STRB r0,[r5,#0xa] ;640
0007e4 e2847008 ADD r7,r4,#8 ;641
0007e8 e2858008 ADD r8,r5,#8 ;642
0007ec e4d70001 LDRB r0,[r7],#1 ;644
0007f0 e4c80001 STRB r0,[r8],#1 ;644
0007f4 e4d70001 LDRB r0,[r7],#1 ;648
0007f8 e4c80001 STRB r0,[r8],#1 ;648
0007fc e5946004 LDR r6,[r4,#4] ;674
000800 e1d601b6 LDRH r0,[r6,#0x16] ;675
000804 e3500000 CMP r0,#0 ;675
000808 da000002 BLE |L1.2072| ;675
00080c e5960010 LDR r0,[r6,#0x10] ;676
000810 e5850000 STR r0,[r5,#0] ;676
000814 ea000001 B |L1.2080| ;676
|L1.2072|
000818 e3a00000 MOV r0,#0 ;678
00081c e5850000 STR r0,[r5,#0] ;678
|L1.2080|
000820 e1d601b6 LDRH r0,[r6,#0x16] ;680
000824 e1c500b4 STRH r0,[r5,#4] ;680
000828 e1d601b4 LDRH r0,[r6,#0x14] ;681
00082c e1c500b6 STRH r0,[r5,#6] ;681
000830 ef000003 SVC 0x3 ; formerly SWI ;682
000834 e3a00000 MOV r0,#0 ;683
000838 eaffffe0 B |L1.1984| ;683
ENDP
OS_QInit PROC
;;;715
;;;716 pq1 = &OSQTbl[0];
00083c e59f204c LDR r2,|L1.2192|
;;;717 pq2 = &OSQTbl[1];
000840 e2821018 ADD r1,r2,#0x18
;;;718 for (i = 0; i < (OS_MAX_QS - 1); i++) { /* Init. list of free QUEUE control blocks */
000844 e3a00000 MOV r0,#0
000848 ea000004 B |L1.2144|
;;;719 pq1->OSQPtr = pq2;
|L1.2124|
00084c e5821000 STR r1,[r2,#0]
;;;720 pq1++;
000850 e2822018 ADD r2,r2,#0x18
;;;721 pq2++;
000854 e2811018 ADD r1,r1,#0x18
000858 e2803001 ADD r3,r0,#1 ;718
00085c e3c30801 BIC r0,r3,#0x10000 ;718
|L1.2144|
000860 e3500001 CMP r0,#1 ;718
000864 bafffff8 BLT |L1.2124| ;718
;;;722 }
;;;723 pq1->OSQPtr = (OS_Q *)0;
000868 e3a03000 MOV r3,#0
00086c e5823000 STR r3,[r2,#0]
;;;724 OSQFreeList = &OSQTbl[0];
000870 e59f3018 LDR r3,|L1.2192|
000874 e59fc00c LDR r12,|L1.2184|
000878 e58c3000 STR r3,[r12,#0] ; OSQFreeList
;;;725 #endif
;;;726 }
00087c e12fff1e BX lr
|L1.2176|
000880 00000000 DCD OSIntNesting
|L1.2180|
000884 00000000 DCD OSEventFreeList
|L1.2184|
000888 00000000 DCD OSQFreeList
|L1.2188|
00088c 00000000 DCD OSTCBCur
|L1.2192|
000890 00000000 DCD OSQTbl
ENDP
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?