📄 os_q.txt
字号:
OSQPostOpt PROC
;;;701 INT8U OSQPostOpt (OS_EVENT *pevent, void *pmsg, INT8U opt)
;;;702 {
00062c e92d41f0 PUSH {r4-r8,lr}
000630 e1a04000 MOV r4,r0
;;;703 OS_Q *pq;
;;;704 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;705 OS_CPU_SR cpu_sr = 0;
;;;706 #endif
;;;707
;;;708
;;;709
;;;710 #if OS_ARG_CHK_EN > 0
;;;711 if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
;;;712 return (OS_ERR_PEVENT_NULL);
;;;713 }
;;;714 #endif
;;;715 if (pevent->OSEventType != OS_EVENT_TYPE_Q) { /* Validate event block type */
000634 e5d00000 LDRB r0,[r0,#0]
000638 e1a06001 MOV r6,r1 ;702
00063c e1a05002 MOV r5,r2 ;702
000640 e3500002 CMP r0,#2
;;;716 return (OS_ERR_EVENT_TYPE);
000644 13a00001 MOVNE r0,#1
000648 1a000019 BNE |L1.1716|
;;;717 }
;;;718 OS_ENTER_CRITICAL();
00064c ebfffffe BL OS_CPU_SR_Save
000650 e1a07000 MOV r7,r0
;;;719 if (pevent->OSEventGrp != 0x00) { /* See if any task pending on queue */
000654 e5d4000a LDRB r0,[r4,#0xa]
000658 e3500000 CMP r0,#0
00065c 0a000016 BEQ |L1.1724|
;;;720 if ((opt & OS_POST_OPT_BROADCAST) != 0x00) { /* Do we need to post msg to ALL waiting tasks ? */
000660 e3150001 TST r5,#1
000664 0a000008 BEQ |L1.1676|
|L1.1640|
;;;721 while (pevent->OSEventGrp != 0) { /* Yes, Post to ALL tasks waiting on queue */
;;;722 (void)OS_EventTaskRdy(pevent, pmsg, OS_STAT_Q, OS_STAT_PEND_OK);
000668 e3a03000 MOV r3,#0
00066c e3a02004 MOV r2,#4
000670 e1a01006 MOV r1,r6
000674 e1a00004 MOV r0,r4
000678 ebfffffe BL OS_EventTaskRdy
00067c e5d4100a LDRB r1,[r4,#0xa] ;721
000680 e3510000 CMP r1,#0 ;721
000684 1afffff7 BNE |L1.1640|
000688 ea000004 B |L1.1696|
|L1.1676|
;;;723 }
;;;724 } else { /* No, Post to HPT waiting on queue */
;;;725 (void)OS_EventTaskRdy(pevent, pmsg, OS_STAT_Q, OS_STAT_PEND_OK);
00068c e3a03000 MOV r3,#0
000690 e3a02004 MOV r2,#4
000694 e1a01006 MOV r1,r6
000698 e1a00004 MOV r0,r4
00069c ebfffffe BL OS_EventTaskRdy
|L1.1696|
;;;726 }
;;;727 OS_EXIT_CRITICAL();
0006a0 e1a00007 MOV r0,r7
0006a4 ebfffffe BL OS_CPU_SR_Restore
;;;728 if ((opt & OS_POST_OPT_NO_SCHED) == 0) { /* See if scheduler needs to be invoked */
0006a8 e3150004 TST r5,#4
;;;729 OS_Sched(); /* Find highest priority task ready to run */
0006ac 0bfffffe BLEQ OS_Sched
|L1.1712|
;;;730 }
;;;731 return (OS_ERR_NONE);
0006b0 e3a00000 MOV r0,#0
|L1.1716|
0006b4 e8bd41f0 POP {r4-r8,lr}
;;;732 }
;;;733 pq = (OS_Q *)pevent->OSEventPtr; /* Point to queue control block */
;;;734 if (pq->OSQEntries >= pq->OSQSize) { /* Make sure queue is not full */
;;;735 OS_EXIT_CRITICAL();
;;;736 return (OS_ERR_Q_FULL);
;;;737 }
;;;738 if ((opt & OS_POST_OPT_FRONT) != 0x00) { /* Do we post to the FRONT of the queue? */
;;;739 if (pq->OSQOut == pq->OSQStart) { /* Yes, Post as LIFO, Wrap OUT pointer if we ... */
;;;740 pq->OSQOut = pq->OSQEnd; /* ... are at the 1st queue entry */
;;;741 }
;;;742 pq->OSQOut--;
;;;743 *pq->OSQOut = pmsg; /* Insert message into queue */
;;;744 } else { /* No, Post as FIFO */
;;;745 *pq->OSQIn++ = pmsg; /* Insert message into queue */
;;;746 if (pq->OSQIn == pq->OSQEnd) { /* Wrap IN ptr if we are at end of queue */
;;;747 pq->OSQIn = pq->OSQStart;
;;;748 }
;;;749 }
;;;750 pq->OSQEntries++; /* Update the nbr of entries in the queue */
;;;751 OS_EXIT_CRITICAL();
;;;752 return (OS_ERR_NONE);
;;;753 }
0006b8 e12fff1e BX lr
|L1.1724|
0006bc e5941004 LDR r1,[r4,#4] ;733
0006c0 e1d101b6 LDRH r0,[r1,#0x16] ;734
0006c4 e1d121b4 LDRH r2,[r1,#0x14] ;734
0006c8 e1500002 CMP r0,r2 ;734
0006cc 3a000003 BCC |L1.1760|
0006d0 e1a00007 MOV r0,r7 ;735
0006d4 ebfffffe BL OS_CPU_SR_Restore
0006d8 e3a0001e MOV r0,#0x1e ;736
0006dc eafffff4 B |L1.1716|
|L1.1760|
0006e0 e3150002 TST r5,#2 ;738
0006e4 0a000008 BEQ |L1.1804|
0006e8 e5910010 LDR r0,[r1,#0x10] ;739
0006ec e5912004 LDR r2,[r1,#4] ;739
0006f0 e1500002 CMP r0,r2 ;739
0006f4 05910008 LDREQ r0,[r1,#8] ;740
0006f8 e2402004 SUB r2,r0,#4 ;742
0006fc 05810010 STREQ r0,[r1,#0x10] ;740
000700 e5812010 STR r2,[r1,#0x10] ;743
000704 e5006004 STR r6,[r0,#-4] ;743
000708 ea000008 B |L1.1840|
|L1.1804|
00070c e591000c LDR r0,[r1,#0xc] ;745
000710 e2802004 ADD r2,r0,#4 ;745
000714 e581200c STR r2,[r1,#0xc] ;745
000718 e5806000 STR r6,[r0,#0] ;746
00071c e591000c LDR r0,[r1,#0xc] ;746
000720 e5912008 LDR r2,[r1,#8] ;746
000724 e1500002 CMP r0,r2 ;746
000728 05910004 LDREQ r0,[r1,#4] ;747
00072c 0581000c STREQ r0,[r1,#0xc] ;747
|L1.1840|
000730 e1d101b6 LDRH r0,[r1,#0x16] ;750
000734 e2800001 ADD r0,r0,#1 ;750
000738 e1c101b6 STRH r0,[r1,#0x16] ;750
00073c e1a00007 MOV r0,r7 ;751
000740 ebfffffe BL OS_CPU_SR_Restore
000744 eaffffd9 B |L1.1712|
;;;754 #endif
ENDP
OSQQuery PROC
;;;775 INT8U OSQQuery (OS_EVENT *pevent, OS_Q_DATA *p_q_data)
;;;776 {
000748 e92d4070 PUSH {r4-r6,lr}
00074c e1a05000 MOV r5,r0
;;;777 OS_Q *pq;
;;;778 INT8U i;
;;;779 #if OS_LOWEST_PRIO <= 63
;;;780 INT8U *psrc;
;;;781 INT8U *pdest;
;;;782 #else
;;;783 INT16U *psrc;
;;;784 INT16U *pdest;
;;;785 #endif
;;;786 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;787 OS_CPU_SR cpu_sr = 0;
;;;788 #endif
;;;789
;;;790
;;;791
;;;792 #if OS_ARG_CHK_EN > 0
;;;793 if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
;;;794 return (OS_ERR_PEVENT_NULL);
;;;795 }
;;;796 if (p_q_data == (OS_Q_DATA *)0) { /* Validate 'p_q_data' */
;;;797 return (OS_ERR_PDATA_NULL);
;;;798 }
;;;799 #endif
;;;800 if (pevent->OSEventType != OS_EVENT_TYPE_Q) { /* Validate event block type */
000750 e5d00000 LDRB r0,[r0,#0]
000754 e1a04001 MOV r4,r1 ;776
000758 e3500002 CMP r0,#2
;;;801 return (OS_ERR_EVENT_TYPE);
00075c 13a00001 MOVNE r0,#1
000760 1a000017 BNE |L1.1988|
;;;802 }
;;;803 OS_ENTER_CRITICAL();
000764 ebfffffe BL OS_CPU_SR_Save
;;;804 p_q_data->OSEventGrp = pevent->OSEventGrp; /* Copy message queue wait list */
000768 e5d5100a LDRB r1,[r5,#0xa]
;;;805 psrc = &pevent->OSEventTbl[0];
00076c e285200b ADD r2,r5,#0xb
;;;806 pdest = &p_q_data->OSEventTbl[0];
000770 e2843008 ADD r3,r4,#8
000774 e5c4100c STRB r1,[r4,#0xc] ;804
;;;807 for (i = 0; i < OS_EVENT_TBL_SIZE; i++) {
000778 e3a01000 MOV r1,#0
|L1.1916|
;;;808 *pdest++ = *psrc++;
00077c e4d2c001 LDRB r12,[r2],#1
000780 e2811001 ADD r1,r1,#1 ;807
000784 e20110ff AND r1,r1,#0xff ;807
000788 e3510004 CMP r1,#4 ;807
00078c e4c3c001 STRB r12,[r3],#1
000790 3afffff9 BCC |L1.1916|
;;;809 }
;;;810 pq = (OS_Q *)pevent->OSEventPtr;
000794 e5951004 LDR r1,[r5,#4]
;;;811 if (pq->OSQEntries > 0) {
000798 e1d121b6 LDRH r2,[r1,#0x16]
00079c e3520000 CMP r2,#0
;;;812 p_q_data->OSMsg = *pq->OSQOut; /* Get next message to return if available */
0007a0 15912010 LDRNE r2,[r1,#0x10]
0007a4 15922000 LDRNE r2,[r2,#0]
;;;813 } else {
;;;814 p_q_data->OSMsg = (void *)0;
0007a8 e5842000 STR r2,[r4,#0]
;;;815 }
;;;816 p_q_data->OSNMsgs = pq->OSQEntries;
0007ac e1d121b6 LDRH r2,[r1,#0x16]
0007b0 e1c420b4 STRH r2,[r4,#4]
;;;817 p_q_data->OSQSize = pq->OSQSize;
0007b4 e1d111b4 LDRH r1,[r1,#0x14]
0007b8 e1c410b6 STRH r1,[r4,#6]
;;;818 OS_EXIT_CRITICAL();
0007bc ebfffffe BL OS_CPU_SR_Restore
;;;819 return (OS_ERR_NONE);
0007c0 e3a00000 MOV r0,#0
|L1.1988|
0007c4 e8bd4070 POP {r4-r6,lr}
;;;820 }
0007c8 e12fff1e BX lr
;;;821 #endif /* OS_Q_QUERY_EN */
ENDP
OS_QInit PROC
;;;839 void OS_QInit (void)
;;;840 {
0007cc e92d4010 PUSH {r4,lr}
;;;841 #if OS_MAX_QS == 1
;;;842 OSQFreeList = &OSQTbl[0]; /* Only ONE queue! */
;;;843 OSQFreeList->OSQPtr = (OS_Q *)0;
;;;844 #endif
;;;845
;;;846 #if OS_MAX_QS >= 2
;;;847 INT16U i;
;;;848 OS_Q *pq1;
;;;849 OS_Q *pq2;
;;;850
;;;851
;;;852
;;;853 OS_MemClr((INT8U *)&OSQTbl[0], sizeof(OSQTbl)); /* Clear the queue table */
0007d0 e59f0058 LDR r0,|L1.2096|
0007d4 e3a01060 MOV r1,#0x60
0007d8 ebfffffe BL OS_MemClr
;;;854 pq1 = &OSQTbl[0];
0007dc e59f004c LDR r0,|L1.2096|
;;;855 pq2 = &OSQTbl[1];
;;;856 for (i = 0; i < (OS_MAX_QS - 1); i++) { /* Init. list of free QUEUE control blocks */
0007e0 e3a02000 MOV r2,#0
0007e4 e2803000 ADD r3,r0,#0 ;855
0007e8 e2831018 ADD r1,r3,#0x18 ;855
|L1.2028|
0007ec e2822001 ADD r2,r2,#1
0007f0 e3c22801 BIC r2,r2,#0x10000
;;;857 pq1->OSQPtr = pq2;
0007f4 e4801018 STR r1,[r0],#0x18
0007f8 e3520003 CMP r2,#3 ;856
;;;858 pq1++;
;;;859 pq2++;
0007fc e2811018 ADD r1,r1,#0x18
000800 3afffff9 BCC |L1.2028|
;;;860 }
;;;861 pq1->OSQPtr = (OS_Q *)0;
000804 e3a01000 MOV r1,#0
000808 e5801000 STR r1,[r0,#0]
;;;862 OSQFreeList = &OSQTbl[0];
00080c e59f0010 LDR r0,|L1.2084|
000810 e5803000 STR r3,[r0,#0] ; OSQFreeList
;;;863 #endif
;;;864 }
000814 e8bd4010 POP {r4,lr}
000818 e12fff1e BX lr
;;;865 #endif /* OS_Q_EN */
ENDP
|L1.2076|
00081c 00000000 DCD OSIntNesting
|L1.2080|
000820 00000000 DCD OSEventFreeList
|L1.2084|
000824 00000000 DCD OSQFreeList
|L1.2088|
000828 00000000 DCD OSLockNesting
|L1.2092|
00082c 00000000 DCD OSTCBCur
|L1.2096|
000830 00000000 DCD OSQTbl
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -