?? os_q.txt
字號(hào):
000396 4604 MOV r4,r0
000398 460d MOV r5,r1
;;;570 OS_Q *pq;
;;;571 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;572 OS_CPU_SR cpu_sr = 0;
;;;573 #endif
;;;574
;;;575
;;;576
;;;577 #if OS_ARG_CHK_EN > 0
;;;578 if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
00039a b90c CBNZ r4,|L1.928|
;;;579 return (OS_ERR_PEVENT_NULL);
00039c 2004 MOVS r0,#4
;;;580 }
;;;581 #endif
;;;582 if (pevent->OSEventType != OS_EVENT_TYPE_Q) { /* Validate event block type */
;;;583 return (OS_ERR_EVENT_TYPE);
;;;584 }
;;;585 OS_ENTER_CRITICAL();
;;;586 if (pevent->OSEventGrp != 0) { /* See if any task pending on queue */
;;;587 /* Ready highest priority task waiting on event */
;;;588 (void)OS_EventTaskRdy(pevent, pmsg, OS_STAT_Q, OS_STAT_PEND_OK);
;;;589 OS_EXIT_CRITICAL();
;;;590 OS_Sched(); /* Find highest priority task ready to run */
;;;591 return (OS_ERR_NONE);
;;;592 }
;;;593 pq = (OS_Q *)pevent->OSEventPtr; /* Point to queue control block */
;;;594 if (pq->OSQEntries >= pq->OSQSize) { /* Make sure queue is not full */
;;;595 OS_EXIT_CRITICAL();
;;;596 return (OS_ERR_Q_FULL);
;;;597 }
;;;598 *pq->OSQIn++ = pmsg; /* Insert message into queue */
;;;599 pq->OSQEntries++; /* Update the nbr of entries in the queue */
;;;600 if (pq->OSQIn == pq->OSQEnd) { /* Wrap IN ptr if we are at end of queue */
;;;601 pq->OSQIn = pq->OSQStart;
;;;602 }
;;;603 OS_EXIT_CRITICAL();
;;;604 return (OS_ERR_NONE);
;;;605 }
00039e bd70 POP {r4-r6,pc}
|L1.928|
0003a0 7820 LDRB r0,[r4,#0]
0003a2 2802 CMP r0,#2
0003a4 d001 BEQ |L1.938|
0003a6 2001 MOVS r0,#1
0003a8 bd70 POP {r4-r6,pc}
|L1.938|
0003aa f7fff7ff BL OS_CPU_SR_Save
0003ae 4606 MOV r6,r0
0003b0 7aa0 LDRB r0,[r4,#0xa]
0003b2 b160 CBZ r0,|L1.974|
0003b4 2300 MOVS r3,#0
0003b6 2204 MOVS r2,#4
0003b8 4629 MOV r1,r5
0003ba 4620 MOV r0,r4
0003bc f7fff7ff BL OS_EventTaskRdy
0003c0 4630 MOV r0,r6
0003c2 f7fff7ff BL OS_CPU_SR_Restore
0003c6 f7fff7ff BL OS_Sched
0003ca 2000 MOVS r0,#0
0003cc bd70 POP {r4-r6,pc}
|L1.974|
0003ce 6860 LDR r0,[r4,#4]
0003d0 8ac1 LDRH r1,[r0,#0x16]
0003d2 8a82 LDRH r2,[r0,#0x14]
0003d4 4291 CMP r1,r2
0003d6 d304 BCC |L1.994|
0003d8 4630 MOV r0,r6
0003da f7fff7ff BL OS_CPU_SR_Restore
0003de 201e MOVS r0,#0x1e
0003e0 bd70 POP {r4-r6,pc}
|L1.994|
0003e2 68c1 LDR r1,[r0,#0xc]
0003e4 1d0a ADDS r2,r1,#4
0003e6 60c2 STR r2,[r0,#0xc]
0003e8 600d STR r5,[r1,#0]
0003ea 8ac1 LDRH r1,[r0,#0x16]
0003ec 1c49 ADDS r1,r1,#1
0003ee 82c1 STRH r1,[r0,#0x16]
0003f0 6882 LDR r2,[r0,#8]
0003f2 68c1 LDR r1,[r0,#0xc]
0003f4 4291 CMP r1,r2
0003f6 d101 BNE |L1.1020|
0003f8 6841 LDR r1,[r0,#4]
0003fa 60c1 STR r1,[r0,#0xc]
|L1.1020|
0003fc 4630 MOV r0,r6
0003fe f7fff7ff BL OS_CPU_SR_Restore
000402 2000 MOVS r0,#0
000404 bd70 POP {r4-r6,pc}
;;;606 #endif
ENDP
OSQPostFront PROC
;;;630 INT8U OSQPostFront (OS_EVENT *pevent, void *pmsg)
;;;631 {
000406 b570 PUSH {r4-r6,lr}
000408 4604 MOV r4,r0
00040a 460d MOV r5,r1
;;;632 OS_Q *pq;
;;;633 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;634 OS_CPU_SR cpu_sr = 0;
;;;635 #endif
;;;636
;;;637
;;;638
;;;639 #if OS_ARG_CHK_EN > 0
;;;640 if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
00040c b90c CBNZ r4,|L1.1042|
;;;641 return (OS_ERR_PEVENT_NULL);
00040e 2004 MOVS r0,#4
;;;642 }
;;;643 #endif
;;;644 if (pevent->OSEventType != OS_EVENT_TYPE_Q) { /* Validate event block type */
;;;645 return (OS_ERR_EVENT_TYPE);
;;;646 }
;;;647 OS_ENTER_CRITICAL();
;;;648 if (pevent->OSEventGrp != 0) { /* See if any task pending on queue */
;;;649 /* Ready highest priority task waiting on event */
;;;650 (void)OS_EventTaskRdy(pevent, pmsg, OS_STAT_Q, OS_STAT_PEND_OK);
;;;651 OS_EXIT_CRITICAL();
;;;652 OS_Sched(); /* Find highest priority task ready to run */
;;;653 return (OS_ERR_NONE);
;;;654 }
;;;655 pq = (OS_Q *)pevent->OSEventPtr; /* Point to queue control block */
;;;656 if (pq->OSQEntries >= pq->OSQSize) { /* Make sure queue is not full */
;;;657 OS_EXIT_CRITICAL();
;;;658 return (OS_ERR_Q_FULL);
;;;659 }
;;;660 if (pq->OSQOut == pq->OSQStart) { /* Wrap OUT ptr if we are at the 1st queue entry */
;;;661 pq->OSQOut = pq->OSQEnd;
;;;662 }
;;;663 pq->OSQOut--;
;;;664 *pq->OSQOut = pmsg; /* Insert message into queue */
;;;665 pq->OSQEntries++; /* Update the nbr of entries in the queue */
;;;666 OS_EXIT_CRITICAL();
;;;667 return (OS_ERR_NONE);
;;;668 }
000410 bd70 POP {r4-r6,pc}
|L1.1042|
000412 7820 LDRB r0,[r4,#0]
000414 2802 CMP r0,#2
000416 d001 BEQ |L1.1052|
000418 2001 MOVS r0,#1
00041a bd70 POP {r4-r6,pc}
|L1.1052|
00041c f7fff7ff BL OS_CPU_SR_Save
000420 4606 MOV r6,r0
000422 7aa0 LDRB r0,[r4,#0xa]
000424 b160 CBZ r0,|L1.1088|
000426 2300 MOVS r3,#0
000428 2204 MOVS r2,#4
00042a 4629 MOV r1,r5
00042c 4620 MOV r0,r4
00042e f7fff7ff BL OS_EventTaskRdy
000432 4630 MOV r0,r6
000434 f7fff7ff BL OS_CPU_SR_Restore
000438 f7fff7ff BL OS_Sched
00043c 2000 MOVS r0,#0
00043e bd70 POP {r4-r6,pc}
|L1.1088|
000440 6860 LDR r0,[r4,#4]
000442 8ac1 LDRH r1,[r0,#0x16]
000444 8a82 LDRH r2,[r0,#0x14]
000446 4291 CMP r1,r2
000448 d30e BCC |L1.1128|
00044a 4630 MOV r0,r6
00044c f7fff7ff BL OS_CPU_SR_Restore
000450 201e MOVS r0,#0x1e
|L1.1106|
000452 bd70 POP {r4-r6,pc}
|L1.1108|
000454 00000000 DCD OSIntNesting
|L1.1112|
000458 00000000 DCD OSEventFreeList
|L1.1116|
00045c 00000000 DCD OSQFreeList
|L1.1120|
000460 00000000 DCD OSLockNesting
|L1.1124|
000464 00000000 DCD OSTCBCur
|L1.1128|
000468 6842 LDR r2,[r0,#4]
00046a 6901 LDR r1,[r0,#0x10]
00046c 4291 CMP r1,r2
00046e d101 BNE |L1.1140|
000470 6881 LDR r1,[r0,#8]
000472 6101 STR r1,[r0,#0x10]
|L1.1140|
000474 6901 LDR r1,[r0,#0x10]
000476 1f09 SUBS r1,r1,#4
000478 6101 STR r1,[r0,#0x10]
00047a 600d STR r5,[r1,#0]
00047c 8ac1 LDRH r1,[r0,#0x16]
00047e 1c49 ADDS r1,r1,#1
000480 82c1 STRH r1,[r0,#0x16]
000482 4630 MOV r0,r6
000484 f7fff7ff BL OS_CPU_SR_Restore
000488 2000 MOVS r0,#0
00048a e7e2 B |L1.1106|
;;;669 #endif
ENDP
OSQPostOpt PROC
;;;701 INT8U OSQPostOpt (OS_EVENT *pevent, void *pmsg, INT8U opt)
;;;702 {
00048c e92de92d PUSH {r4-r8,lr}
000490 4604 MOV r4,r0
000492 460e MOV r6,r1
000494 4615 MOV r5,r2
;;;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' */
000496 b914 CBNZ r4,|L1.1182|
;;;712 return (OS_ERR_PEVENT_NULL);
000498 2004 MOVS r0,#4
00049a e8bde8bd POP {r4-r8,pc}
|L1.1182|
;;;713 }
;;;714 #endif
;;;715 if (pevent->OSEventType != OS_EVENT_TYPE_Q) { /* Validate event block type */
00049e 7820 LDRB r0,[r4,#0]
0004a0 2802 CMP r0,#2
0004a2 d002 BEQ |L1.1194|
;;;716 return (OS_ERR_EVENT_TYPE);
0004a4 2001 MOVS r0,#1
0004a6 e8bde8bd POP {r4-r8,pc}
|L1.1194|
;;;717 }
;;;718 OS_ENTER_CRITICAL();
0004aa f7fff7ff BL OS_CPU_SR_Save
0004ae 4607 MOV r7,r0
;;;719 if (pevent->OSEventGrp != 0x00) { /* See if any task pending on queue */
0004b0 7aa0 LDRB r0,[r4,#0xa]
0004b2 b1e8 CBZ r0,|L1.1264|
;;;720 if ((opt & OS_POST_OPT_BROADCAST) != 0x00) { /* Do we need to post msg to ALL waiting tasks ? */
0004b4 f015f015 TST r5,#1
0004b8 d009 BEQ |L1.1230|
|L1.1210|
0004ba 2300 MOVS r3,#0
0004bc 2204 MOVS r2,#4
0004be 4631 MOV r1,r6
0004c0 4620 MOV r0,r4
0004c2 f7fff7ff BL OS_EventTaskRdy
;;;721 while (pevent->OSEventGrp != 0) { /* Yes, Post to ALL tasks waiting on queue */
0004c6 7aa1 LDRB r1,[r4,#0xa]
0004c8 2900 CMP r1,#0
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -