📄 os_q.txt
字号:
OSQPostOpt PROC
;;;701 INT8U OSQPostOpt (OS_EVENT *pevent, void *msg, INT8U opt)
;;;702 {
000930 e92d41f0 PUSH {r4-r8,lr}
000934 e1a04000 MOV r4,r0
000938 e1a05001 MOV r5,r1
00093c e1a06002 MOV r6,r2
;;;703 OS_Q *pq;
;;;704 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;705 OS_CPU_SR cpu_sr = 0;
000940 e3a08000 MOV r8,#0
;;;706 #endif
;;;707
;;;708
;;;709
;;;710 #if OS_ARG_CHK_EN > 0
;;;711 if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
000944 e3540000 CMP r4,#0
000948 1a000002 BNE |L1.2392|
;;;712 return (OS_ERR_PEVENT_NULL);
00094c e3a00004 MOV r0,#4
|L1.2384|
000950 e8bd41f0 POP {r4-r8,lr}
;;;713 }
;;;714 #endif
;;;715 if (pevent->OSEventType != OS_EVENT_TYPE_Q) { /* Validate event block type */
;;;716 return (OS_ERR_EVENT_TYPE);
;;;717 }
;;;718 OS_ENTER_CRITICAL();
;;;719 if (pevent->OSEventGrp != 0x00) { /* See if any task pending on queue */
;;;720 if ((opt & OS_POST_OPT_BROADCAST) != 0x00) { /* Do we need to post msg to ALL waiting tasks ? */
;;;721 while (pevent->OSEventGrp != 0) { /* Yes, Post to ALL tasks waiting on queue */
;;;722 (void)OS_EventTaskRdy(pevent, msg, OS_STAT_Q, OS_STAT_PEND_OK);
;;;723 }
;;;724 } else { /* No, Post to HPT waiting on queue */
;;;725 (void)OS_EventTaskRdy(pevent, msg, OS_STAT_Q, OS_STAT_PEND_OK);
;;;726 }
;;;727 OS_EXIT_CRITICAL();
;;;728 if ((opt & OS_POST_OPT_NO_SCHED) == 0) { /* See if scheduler needs to be invoked */
;;;729 OS_Sched(); /* Find highest priority task ready to run */
;;;730 }
;;;731 return (OS_ERR_NONE);
;;;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 = msg; /* Insert message into queue */
;;;744 } else { /* No, Post as FIFO */
;;;745 *pq->OSQIn++ = msg; /* 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 }
000954 e12fff1e BX lr
|L1.2392|
000958 e5d40000 LDRB r0,[r4,#0]
00095c e3500002 CMP r0,#2
000960 0a000001 BEQ |L1.2412|
000964 e3a00001 MOV r0,#1
000968 eafffff8 B |L1.2384|
|L1.2412|
00096c ebfffffe BL OS_CPU_SR_Save
000970 e1a08000 MOV r8,r0
000974 e5d4000a LDRB r0,[r4,#0xa]
000978 e3500000 CMP r0,#0
00097c 0a000017 BEQ |L1.2528|
000980 e3160001 TST r6,#1
000984 0a000009 BEQ |L1.2480|
000988 ea000004 B |L1.2464|
|L1.2444|
00098c e3a03000 MOV r3,#0
000990 e3a02004 MOV r2,#4
000994 e1a01005 MOV r1,r5
000998 e1a00004 MOV r0,r4
00099c ebfffffe BL OS_EventTaskRdy
|L1.2464|
0009a0 e5d4000a LDRB r0,[r4,#0xa]
0009a4 e3500000 CMP r0,#0
0009a8 1afffff7 BNE |L1.2444|
0009ac ea000004 B |L1.2500|
|L1.2480|
0009b0 e3a03000 MOV r3,#0
0009b4 e3a02004 MOV r2,#4
0009b8 e1a01005 MOV r1,r5
0009bc e1a00004 MOV r0,r4
0009c0 ebfffffe BL OS_EventTaskRdy
|L1.2500|
0009c4 e1a00008 MOV r0,r8
0009c8 ebfffffe BL OS_CPU_SR_Restore
0009cc e3160004 TST r6,#4
0009d0 1a000000 BNE |L1.2520|
0009d4 ebfffffe BL OS_Sched
|L1.2520|
0009d8 e3a00000 MOV r0,#0
0009dc eaffffdb B |L1.2384|
|L1.2528|
0009e0 e5947004 LDR r7,[r4,#4]
0009e4 e1d701b6 LDRH r0,[r7,#0x16]
0009e8 e1d711b4 LDRH r1,[r7,#0x14]
0009ec e1500001 CMP r0,r1
0009f0 ba000003 BLT |L1.2564|
0009f4 e1a00008 MOV r0,r8
0009f8 ebfffffe BL OS_CPU_SR_Restore
0009fc e3a0001e MOV r0,#0x1e
000a00 eaffffd2 B |L1.2384|
|L1.2564|
000a04 e3160002 TST r6,#2
000a08 0a00000b BEQ |L1.2620|
000a0c e5970010 LDR r0,[r7,#0x10]
000a10 e5971004 LDR r1,[r7,#4]
000a14 e1500001 CMP r0,r1
000a18 1a000001 BNE |L1.2596|
000a1c e5970008 LDR r0,[r7,#8]
000a20 e5870010 STR r0,[r7,#0x10]
|L1.2596|
000a24 e5970010 LDR r0,[r7,#0x10]
000a28 e2400004 SUB r0,r0,#4
000a2c e5870010 STR r0,[r7,#0x10]
000a30 e5970010 LDR r0,[r7,#0x10]
000a34 e5805000 STR r5,[r0,#0]
000a38 ea000009 B |L1.2660|
|L1.2620|
000a3c e597000c LDR r0,[r7,#0xc]
000a40 e2801004 ADD r1,r0,#4
000a44 e587100c STR r1,[r7,#0xc]
000a48 e5805000 STR r5,[r0,#0]
000a4c e597000c LDR r0,[r7,#0xc]
000a50 e5971008 LDR r1,[r7,#8]
000a54 e1500001 CMP r0,r1
000a58 1a000001 BNE |L1.2660|
000a5c e5970004 LDR r0,[r7,#4]
000a60 e587000c STR r0,[r7,#0xc]
|L1.2660|
000a64 e1d701b6 LDRH r0,[r7,#0x16]
000a68 e2800001 ADD r0,r0,#1
000a6c e3c00801 BIC r0,r0,#0x10000
000a70 e1c701b6 STRH r0,[r7,#0x16]
000a74 e1a00008 MOV r0,r8
000a78 ebfffffe BL OS_CPU_SR_Restore
000a7c e3a00000 MOV r0,#0
000a80 eaffffb2 B |L1.2384|
ENDP
OSQQuery PROC
;;;775 INT8U OSQQuery (OS_EVENT *pevent, OS_Q_DATA *p_q_data)
;;;776 {
000a84 e92d47f0 PUSH {r4-r10,lr}
000a88 e1a04000 MOV r4,r0
000a8c e1a05001 MOV r5,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;
000a90 e3a0a000 MOV r10,#0
;;;788 #endif
;;;789
;;;790
;;;791
;;;792 #if OS_ARG_CHK_EN > 0
;;;793 if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
000a94 e3540000 CMP r4,#0
000a98 1a000002 BNE |L1.2728|
;;;794 return (OS_ERR_PEVENT_NULL);
000a9c e3a00004 MOV r0,#4
|L1.2720|
000aa0 e8bd47f0 POP {r4-r10,lr}
;;;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 }
000aa4 e12fff1e BX lr
|L1.2728|
000aa8 e3550000 CMP r5,#0
000aac 1a000001 BNE |L1.2744|
000ab0 e3a00009 MOV r0,#9
000ab4 eafffff9 B |L1.2720|
|L1.2744|
000ab8 e5d40000 LDRB r0,[r4,#0]
000abc e3500002 CMP r0,#2
000ac0 0a000001 BEQ |L1.2764|
000ac4 e3a00001 MOV r0,#1
000ac8 eafffff4 B |L1.2720|
|L1.2764|
000acc ebfffffe BL OS_CPU_SR_Save
000ad0 e1a0a000 MOV r10,r0
000ad4 e5d4000a LDRB r0,[r4,#0xa]
000ad8 e5c5000c STRB r0,[r5,#0xc]
000adc e284800b ADD r8,r4,#0xb
000ae0 e2859008 ADD r9,r5,#8
000ae4 e3a07000 MOV r7,#0
000ae8 ea000003 B |L1.2812|
|L1.2796|
000aec e4d80001 LDRB r0,[r8],#1
000af0 e4c90001 STRB r0,[r9],#1
000af4 e2870001 ADD r0,r7,#1
000af8 e20070ff AND r7,r0,#0xff
|L1.2812|
000afc e3570004 CMP r7,#4
000b00 bafffff9 BLT |L1.2796|
000b04 e5946004 LDR r6,[r4,#4]
000b08 e1d601b6 LDRH r0,[r6,#0x16]
000b0c e3500000 CMP r0,#0
000b10 da000003 BLE |L1.2852|
000b14 e5960010 LDR r0,[r6,#0x10]
000b18 e5900000 LDR r0,[r0,#0]
000b1c e5850000 STR r0,[r5,#0]
000b20 ea000001 B |L1.2860|
|L1.2852|
000b24 e3a00000 MOV r0,#0
000b28 e5850000 STR r0,[r5,#0]
|L1.2860|
000b2c e1d601b6 LDRH r0,[r6,#0x16]
000b30 e1c500b4 STRH r0,[r5,#4]
000b34 e1d601b4 LDRH r0,[r6,#0x14]
000b38 e1c500b6 STRH r0,[r5,#6]
000b3c e1a0000a MOV r0,r10
000b40 ebfffffe BL OS_CPU_SR_Restore
000b44 e3a00000 MOV r0,#0
000b48 eaffffd4 B |L1.2720|
ENDP
OS_QInit PROC
;;;839 void OS_QInit (void)
;;;840 {
000b4c e92d4070 PUSH {r4-r6,lr}
;;;841 #if OS_MAX_QS == 1
;;;842 OSQFreeList = &OSQTbl[0]; /* Only ONE queue! */
;;;843 OSQF
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -