?? os_q.txt
字號:
0004ca d1f6 BNE |L1.1210|
0004cc e005 B |L1.1242|
|L1.1230|
;;;722 (void)OS_EventTaskRdy(pevent, pmsg, OS_STAT_Q, OS_STAT_PEND_OK);
;;;723 }
;;;724 } else { /* No, Post to HPT waiting on queue */
;;;725 (void)OS_EventTaskRdy(pevent, pmsg, OS_STAT_Q, OS_STAT_PEND_OK);
0004ce 2300 MOVS r3,#0
0004d0 2204 MOVS r2,#4
0004d2 4631 MOV r1,r6
0004d4 4620 MOV r0,r4
0004d6 f7fff7ff BL OS_EventTaskRdy
|L1.1242|
;;;726 }
;;;727 OS_EXIT_CRITICAL();
0004da 4638 MOV r0,r7
0004dc f7fff7ff BL OS_CPU_SR_Restore
;;;728 if ((opt & OS_POST_OPT_NO_SCHED) == 0) { /* See if scheduler needs to be invoked */
0004e0 f015f015 TST r5,#4
0004e4 d101 BNE |L1.1258|
;;;729 OS_Sched(); /* Find highest priority task ready to run */
0004e6 f7fff7ff BL OS_Sched
|L1.1258|
;;;730 }
;;;731 return (OS_ERR_NONE);
0004ea 2000 MOVS r0,#0
0004ec e8bde8bd POP {r4-r8,pc}
|L1.1264|
;;;732 }
;;;733 pq = (OS_Q *)pevent->OSEventPtr; /* Point to queue control block */
0004f0 6861 LDR r1,[r4,#4]
;;;734 if (pq->OSQEntries >= pq->OSQSize) { /* Make sure queue is not full */
0004f2 8ac8 LDRH r0,[r1,#0x16]
0004f4 8a8a LDRH r2,[r1,#0x14]
0004f6 4290 CMP r0,r2
0004f8 d305 BCC |L1.1286|
;;;735 OS_EXIT_CRITICAL();
0004fa 4638 MOV r0,r7
0004fc f7fff7ff BL OS_CPU_SR_Restore
;;;736 return (OS_ERR_Q_FULL);
000500 201e MOVS r0,#0x1e
000502 e8bde8bd POP {r4-r8,pc}
|L1.1286|
;;;737 }
;;;738 if ((opt & OS_POST_OPT_FRONT) != 0x00) { /* Do we post to the FRONT of the queue? */
000506 f015f015 TST r5,#2
00050a d00a BEQ |L1.1314|
;;;739 if (pq->OSQOut == pq->OSQStart) { /* Yes, Post as LIFO, Wrap OUT pointer if we ... */
00050c 684a LDR r2,[r1,#4]
00050e 6908 LDR r0,[r1,#0x10]
000510 4290 CMP r0,r2
000512 d101 BNE |L1.1304|
;;;740 pq->OSQOut = pq->OSQEnd; /* ... are at the 1st queue entry */
000514 6888 LDR r0,[r1,#8]
000516 6108 STR r0,[r1,#0x10]
|L1.1304|
;;;741 }
;;;742 pq->OSQOut--;
000518 6908 LDR r0,[r1,#0x10]
00051a 1f02 SUBS r2,r0,#4
00051c 610a STR r2,[r1,#0x10]
;;;743 *pq->OSQOut = pmsg; /* Insert message into queue */
00051e 6016 STR r6,[r2,#0]
000520 e009 B |L1.1334|
|L1.1314|
;;;744 } else { /* No, Post as FIFO */
;;;745 *pq->OSQIn++ = pmsg; /* Insert message into queue */
000522 68c8 LDR r0,[r1,#0xc]
000524 1d02 ADDS r2,r0,#4
000526 60ca STR r2,[r1,#0xc]
000528 6006 STR r6,[r0,#0]
;;;746 if (pq->OSQIn == pq->OSQEnd) { /* Wrap IN ptr if we are at end of queue */
00052a 688a LDR r2,[r1,#8]
00052c 68c8 LDR r0,[r1,#0xc]
00052e 4290 CMP r0,r2
000530 d101 BNE |L1.1334|
;;;747 pq->OSQIn = pq->OSQStart;
000532 6848 LDR r0,[r1,#4]
000534 60c8 STR r0,[r1,#0xc]
|L1.1334|
;;;748 }
;;;749 }
;;;750 pq->OSQEntries++; /* Update the nbr of entries in the queue */
000536 8ac8 LDRH r0,[r1,#0x16]
000538 1c40 ADDS r0,r0,#1
00053a 82c8 STRH r0,[r1,#0x16]
;;;751 OS_EXIT_CRITICAL();
00053c 4638 MOV r0,r7
00053e f7fff7ff BL OS_CPU_SR_Restore
;;;752 return (OS_ERR_NONE);
000542 2000 MOVS r0,#0
;;;753 }
000544 e8bde8bd POP {r4-r8,pc}
;;;754 #endif
ENDP
OSQQuery PROC
;;;775 INT8U OSQQuery (OS_EVENT *pevent, OS_Q_DATA *p_q_data)
;;;776 {
000548 b570 PUSH {r4-r6,lr}
00054a 4605 MOV r5,r0
00054c 460c MOV r4,r1
;;;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' */
00054e b90d CBNZ r5,|L1.1364|
;;;794 return (OS_ERR_PEVENT_NULL);
000550 2004 MOVS r0,#4
;;;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 */
;;;801 return (OS_ERR_EVENT_TYPE);
;;;802 }
;;;803 OS_ENTER_CRITICAL();
;;;804 p_q_data->OSEventGrp = pevent->OSEventGrp; /* Copy message queue wait list */
;;;805 psrc = &pevent->OSEventTbl[0];
;;;806 pdest = &p_q_data->OSEventTbl[0];
;;;807 for (i = 0; i < OS_EVENT_TBL_SIZE; i++) {
;;;808 *pdest++ = *psrc++;
;;;809 }
;;;810 pq = (OS_Q *)pevent->OSEventPtr;
;;;811 if (pq->OSQEntries > 0) {
;;;812 p_q_data->OSMsg = *pq->OSQOut; /* Get next message to return if available */
;;;813 } else {
;;;814 p_q_data->OSMsg = (void *)0;
;;;815 }
;;;816 p_q_data->OSNMsgs = pq->OSQEntries;
;;;817 p_q_data->OSQSize = pq->OSQSize;
;;;818 OS_EXIT_CRITICAL();
;;;819 return (OS_ERR_NONE);
;;;820 }
000552 bd70 POP {r4-r6,pc}
|L1.1364|
000554 b90c CBNZ r4,|L1.1370|
000556 2009 MOVS r0,#9
000558 bd70 POP {r4-r6,pc}
|L1.1370|
00055a 7828 LDRB r0,[r5,#0]
00055c 2802 CMP r0,#2
00055e d001 BEQ |L1.1380|
000560 2001 MOVS r0,#1
000562 bd70 POP {r4-r6,pc}
|L1.1380|
000564 f7fff7ff BL OS_CPU_SR_Save
000568 7aa9 LDRB r1,[r5,#0xa]
00056a 7321 STRB r1,[r4,#0xc]
00056c f105f105 ADD r2,r5,#0xb
000570 f104f104 ADD r3,r4,#8
000574 2100 MOVS r1,#0
|L1.1398|
000576 f812f812 LDRB r12,[r2],#1
00057a f803f803 STRB r12,[r3],#1
00057e 1c49 ADDS r1,r1,#1
000580 b2c9 UXTB r1,r1
000582 2904 CMP r1,#4
000584 d3f7 BCC |L1.1398|
000586 6869 LDR r1,[r5,#4]
000588 8aca LDRH r2,[r1,#0x16]
00058a b11a CBZ r2,|L1.1428|
00058c 690a LDR r2,[r1,#0x10]
00058e 6812 LDR r2,[r2,#0]
000590 6022 STR r2,[r4,#0]
000592 e001 B |L1.1432|
|L1.1428|
000594 2200 MOVS r2,#0
000596 6022 STR r2,[r4,#0]
|L1.1432|
000598 8aca LDRH r2,[r1,#0x16]
00059a 80a2 STRH r2,[r4,#4]
00059c 8a89 LDRH r1,[r1,#0x14]
00059e 80e1 STRH r1,[r4,#6]
0005a0 f7fff7ff BL OS_CPU_SR_Restore
0005a4 2000 MOVS r0,#0
0005a6 bd70 POP {r4-r6,pc}
;;;821 #endif /* OS_Q_QUERY_EN */
ENDP
OS_QInit PROC
;;;839 void OS_QInit (void)
;;;840 {
0005a8 b510 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 */
0005aa 2160 MOVS r1,#0x60
0005ac 4809 LDR r0,|L1.1492|
0005ae f7fff7ff BL OS_MemClr
;;;854 pq1 = &OSQTbl[0];
0005b2 4808 LDR r0,|L1.1492|
;;;855 pq2 = &OSQTbl[1];
0005b4 4603 MOV r3,r0
0005b6 f103f103 ADD r1,r3,#0x18
;;;856 for (i = 0; i < (OS_MAX_QS - 1); i++) { /* Init. list of free QUEUE control blocks */
0005ba 2200 MOVS r2,#0
|L1.1468|
;;;857 pq1->OSQPtr = pq2;
0005bc 6001 STR r1,[r0,#0]
;;;858 pq1++;
0005be 3018 ADDS r0,r0,#0x18
;;;859 pq2++;
0005c0 3118 ADDS r1,r1,#0x18
0005c2 1c52 ADDS r2,r2,#1
0005c4 b292 UXTH r2,r2
0005c6 2a03 CMP r2,#3
0005c8 d3f8 BCC |L1.1468|
;;;860 }
;;;861 pq1->OSQPtr = (OS_Q *)0;
0005ca 2100 MOVS r1,#0
0005cc 6001 STR r1,[r0,#0]
;;;862 OSQFreeList = &OSQTbl[0];
0005ce 4802 LDR r0,|L1.1496|
0005d0 6003 STR r3,[r0,#0] ; OSQFreeList
;;;863 #endif
;;;864 }
0005d2 bd10 POP {r4,pc}
;;;865 #endif /* OS_Q_EN */
ENDP
|L1.1492|
0005d4 00000000 DCD OSQTbl
|L1.1496|
0005d8 00000000 DCD OSQFreeList
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -