os_q.txt
来自「uc/os在lpc2100系列的KEIL模板 uc/os在lpc2100系列的」· 文本 代码 · 共 1,063 行 · 第 1/4 页
TXT
1,063 行
;;;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 }
000604 e12fff1e BX lr
|L1.1544|
000608 e3550000 CMP r5,#0 ;558
00060c 1a000001 BNE |L1.1560|
000610 e3a00003 MOV r0,#3 ;559
000614 eafffff9 B |L1.1536|
|L1.1560|
000618 e5d40000 LDRB r0,[r4,#0] ;561
00061c e3500002 CMP r0,#2 ;561
000620 0a000001 BEQ |L1.1580|
000624 e3a00001 MOV r0,#1 ;562
000628 eafffff4 B |L1.1536|
|L1.1580|
00062c ef000002 SVC #0x2 ;565
000630 e5d40001 LDRB r0,[r4,#1] ;566
000634 e3500000 CMP r0,#0 ;566
000638 0a000012 BEQ |L1.1672|
00063c e3160001 TST r6,#1 ;567
000640 0a000008 BEQ |L1.1640|
000644 ea000003 B |L1.1624|
|L1.1608|
000648 e3a02004 MOV r2,#4 ;569
00064c e1a01005 MOV r1,r5 ;569
000650 e1a00004 MOV r0,r4 ;569
000654 ebfffffe BL OS_EventTaskRdy
|L1.1624|
000658 e5d40001 LDRB r0,[r4,#1] ;568
00065c e3500000 CMP r0,#0 ;568
000660 1afffff8 BNE |L1.1608|
000664 ea000003 B |L1.1656|
|L1.1640|
000668 e3a02004 MOV r2,#4 ;572
00066c e1a01005 MOV r1,r5 ;572
000670 e1a00004 MOV r0,r4 ;572
000674 ebfffffe BL OS_EventTaskRdy
|L1.1656|
000678 ef000003 SVC #0x3 ;574
00067c ebfffffe BL OS_Sched
000680 e3a00000 MOV r0,#0 ;576
000684 eaffffdd B |L1.1536|
|L1.1672|
000688 e5940004 LDR r0,[r4,#4] ;578
00068c e1d011b6 LDRH r1,[r0,#0x16] ;579
000690 e1d021b4 LDRH r2,[r0,#0x14] ;579
000694 e1510002 CMP r1,r2 ;579
000698 3a000002 BCC |L1.1704|
00069c ef000003 SVC #0x3 ;580
0006a0 e3a0001e MOV r0,#0x1e ;581
0006a4 eaffffd5 B |L1.1536|
|L1.1704|
0006a8 e3160002 TST r6,#2 ;583
0006ac 0a00000a BEQ |L1.1756|
0006b0 e5901010 LDR r1,[r0,#0x10] ;584
0006b4 e5902004 LDR r2,[r0,#4] ;584
0006b8 e1510002 CMP r1,r2 ;584
0006bc 1a000001 BNE |L1.1736|
0006c0 e5901008 LDR r1,[r0,#8] ;585
0006c4 e5801010 STR r1,[r0,#0x10] ;585
|L1.1736|
0006c8 e5901010 LDR r1,[r0,#0x10] ;587
0006cc e2411004 SUB r1,r1,#4 ;587
0006d0 e5801010 STR r1,[r0,#0x10] ;587
0006d4 e5815000 STR r5,[r1,#0] ;588
0006d8 ea000009 B |L1.1796|
|L1.1756|
0006dc e590100c LDR r1,[r0,#0xc] ;590
0006e0 e2812004 ADD r2,r1,#4 ;590
0006e4 e580200c STR r2,[r0,#0xc] ;590
0006e8 e5815000 STR r5,[r1,#0] ;590
0006ec e590100c LDR r1,[r0,#0xc] ;591
0006f0 e5902008 LDR r2,[r0,#8] ;591
0006f4 e1510002 CMP r1,r2 ;591
0006f8 1a000001 BNE |L1.1796|
0006fc e5901004 LDR r1,[r0,#4] ;592
000700 e580100c STR r1,[r0,#0xc] ;592
|L1.1796|
000704 e1d011b6 LDRH r1,[r0,#0x16] ;595
000708 e2811001 ADD r1,r1,#1 ;595
00070c e1c011b6 STRH r1,[r0,#0x16] ;595
000710 ef000003 SVC #0x3 ;596
000714 e3a00000 MOV r0,#0 ;597
000718 eaffffb8 B |L1.1536|
;;;599 #endif
ENDP
OSQQuery PROC
;;;619 INT8U OSQQuery (OS_EVENT *pevent, OS_Q_DATA *pdata)
;;;620 {
00071c e92d4070 PUSH {r4-r6,lr}
000720 e1a05000 MOV r5,r0
000724 e1a04001 MOV r4,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' */
000728 e3550000 CMP r5,#0
00072c 1a000002 BNE |L1.1852|
;;;631 return (OS_ERR_PEVENT_NULL);
000730 e3a00004 MOV r0,#4
|L1.1844|
000734 e8bd4070 POP {r4-r6,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 }
000738 e12fff1e BX lr
|L1.1852|
00073c e5d50000 LDRB r0,[r5,#0] ;633
000740 e3500002 CMP r0,#2 ;633
000744 0a000001 BEQ |L1.1872|
000748 e3a00001 MOV r0,#1 ;634
00074c eafffff8 B |L1.1844|
|L1.1872|
000750 ef000002 SVC #0x2 ;637
000754 e5d50001 LDRB r0,[r5,#1] ;638
000758 e5c4000a STRB r0,[r4,#0xa] ;638
00075c e2851008 ADD r1,r5,#8 ;639
000760 e2840008 ADD r0,r4,#8 ;640
000764 e5d12000 LDRB r2,[r1,#0] ;642
000768 e5c02000 STRB r2,[r0,#0] ;642
00076c e5d11001 LDRB r1,[r1,#1] ;646
000770 e5c01001 STRB r1,[r0,#1] ;646
000774 e5950004 LDR r0,[r5,#4] ;672
000778 e1d011b6 LDRH r1,[r0,#0x16] ;673
00077c e3510000 CMP r1,#0 ;673
000780 0a000003 BEQ |L1.1940|
000784 e5901010 LDR r1,[r0,#0x10] ;674
000788 e5911000 LDR r1,[r1,#0] ;674
00078c e5841000 STR r1,[r4,#0] ;674
000790 ea000001 B |L1.1948|
|L1.1940|
000794 e3a01000 MOV r1,#0 ;676
000798 e5841000 STR r1,[r4,#0] ;676
|L1.1948|
00079c e1d011b6 LDRH r1,[r0,#0x16] ;678
0007a0 e1c410b4 STRH r1,[r4,#4] ;678
0007a4 e1d001b4 LDRH r0,[r0,#0x14] ;679
0007a8 e1c400b6 STRH r0,[r4,#6] ;679
0007ac ef000003 SVC #0x3 ;680
0007b0 e3a00000 MOV r0,#0 ;681
0007b4 eaffffde B |L1.1844|
;;;683 #endif /* OS_Q_QUERY_EN */
ENDP
OS_QInit PROC
;;;713
;;;714 pq1 = &OSQTbl[0];
0007b8 e59f0048 LDR r0,|L1.2056|
;;;715 pq2 = &OSQTbl[1];
0007bc e2803000 ADD r3,r0,#0
0007c0 e2831018 ADD r1,r3,#0x18
;;;716 for (i = 0; i < (OS_MAX_QS - 1); i++) { /* Init. list of free QUEUE control blocks */
0007c4 e3a02000 MOV r2,#0
|L1.1992|
;;;717 pq1->OSQPtr = pq2;
0007c8 e5801000 STR r1,[r0,#0]
;;;718 pq1++;
0007cc e2800018 ADD r0,r0,#0x18
;;;719 pq2++;
0007d0 e2811018 ADD r1,r1,#0x18
0007d4 e2822001 ADD r2,r2,#1 ;716
0007d8 e3c22801 BIC r2,r2,#0x10000 ;716
0007dc e3520000 CMP r2,#0 ;716
0007e0 0afffff8 BEQ |L1.1992|
;;;720 }
;;;721 pq1->OSQPtr = (OS_Q *)0;
0007e4 e3a01000 MOV r1,#0
0007e8 e5801000 STR r1,[r0,#0]
;;;722 OSQFreeList = &OSQTbl[0];
0007ec e59f000c LDR r0,|L1.2048|
0007f0 e5803000 STR r3,[r0,#0] ; OSQFreeList
;;;723 #endif
;;;724 }
0007f4 e12fff1e BX lr
;;;725 #endif /* OS_Q_EN */
ENDP
|L1.2040|
0007f8 00000000 DCD OSIntNesting
|L1.2044|
0007fc 00000000 DCD OSEventFreeList
|L1.2048|
000800 00000000 DCD OSQFreeList
|L1.2052|
000804 00000000 DCD OSTCBCur
|L1.2056|
000808 00000000 DCD OSQTbl
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?