os_flag.txt
来自「uc/os在lpc2100系列的KEIL模板 uc/os在lpc2100系列的」· 文本 代码 · 共 1,195 行 · 第 1/5 页
TXT
1,195 行
;;;557 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;558 OS_CPU_SR cpu_sr;
;;;559 #endif
;;;560 OS_FLAG_NODE *pnode;
;;;561 BOOLEAN sched;
;;;562 OS_FLAGS flags_cur;
;;;563 OS_FLAGS flags_rdy;
;;;564
;;;565
;;;566 #if OS_ARG_CHK_EN > 0
;;;567 if (pgrp == (OS_FLAG_GRP *)0) { /* Validate 'pgrp' */
00074c e3550000 CMP r5,#0
000750 1a000004 BNE |L1.1896|
;;;568 *err = OS_FLAG_INVALID_PGRP;
000754 e3a00096 MOV r0,#0x96
000758 e5c70000 STRB r0,[r7,#0]
;;;569 return ((OS_FLAGS)0);
00075c e3a00000 MOV r0,#0
|L1.1888|
000760 e8bd41f0 POP {r4-r8,lr}
;;;570 }
;;;571 if (pgrp->OSFlagType != OS_EVENT_TYPE_FLAG) { /* Make sure we are pointing to an event flag grp */
;;;572 *err = OS_ERR_EVENT_TYPE;
;;;573 return ((OS_FLAGS)0);
;;;574 }
;;;575 #endif
;;;576 /*$PAGE*/
;;;577 OS_ENTER_CRITICAL();
;;;578 switch (opt) {
;;;579 case OS_FLAG_CLR:
;;;580 pgrp->OSFlagFlags &= ~flags; /* Clear the flags specified in the group */
;;;581 break;
;;;582
;;;583 case OS_FLAG_SET:
;;;584 pgrp->OSFlagFlags |= flags; /* Set the flags specified in the group */
;;;585 break;
;;;586
;;;587 default:
;;;588 OS_EXIT_CRITICAL(); /* INVALID option */
;;;589 *err = OS_FLAG_INVALID_OPT;
;;;590 return ((OS_FLAGS)0);
;;;591 }
;;;592 sched = FALSE; /* Indicate that we don't need rescheduling */
;;;593 pnode = (OS_FLAG_NODE *)pgrp->OSFlagWaitList;
;;;594 while (pnode != (OS_FLAG_NODE *)0) { /* Go through all tasks waiting on event flag(s) */
;;;595 switch (pnode->OSFlagNodeWaitType) {
;;;596 case OS_FLAG_WAIT_SET_ALL: /* See if all req. flags are set for current node */
;;;597 flags_rdy = pgrp->OSFlagFlags & pnode->OSFlagNodeFlags;
;;;598 if (flags_rdy == pnode->OSFlagNodeFlags) {
;;;599 if (OS_FlagTaskRdy(pnode, flags_rdy) == TRUE) { /* Make task RTR, event(s) Rx'd */
;;;600 sched = TRUE; /* When done we will reschedule */
;;;601 }
;;;602 }
;;;603 break;
;;;604
;;;605 case OS_FLAG_WAIT_SET_ANY: /* See if any flag set */
;;;606 flags_rdy = pgrp->OSFlagFlags & pnode->OSFlagNodeFlags;
;;;607 if (flags_rdy != (OS_FLAGS)0) {
;;;608 if (OS_FlagTaskRdy(pnode, flags_rdy) == TRUE) { /* Make task RTR, event(s) Rx'd */
;;;609 sched = TRUE; /* When done we will reschedule */
;;;610 }
;;;611 }
;;;612 break;
;;;613
;;;614 #if OS_FLAG_WAIT_CLR_EN > 0
;;;615 case OS_FLAG_WAIT_CLR_ALL: /* See if all req. flags are set for current node */
;;;616 flags_rdy = ~pgrp->OSFlagFlags & pnode->OSFlagNodeFlags;
;;;617 if (flags_rdy == pnode->OSFlagNodeFlags) {
;;;618 if (OS_FlagTaskRdy(pnode, flags_rdy) == TRUE) { /* Make task RTR, event(s) Rx'd */
;;;619 sched = TRUE; /* When done we will reschedule */
;;;620 }
;;;621 }
;;;622 break;
;;;623
;;;624 case OS_FLAG_WAIT_CLR_ANY: /* See if any flag set */
;;;625 flags_rdy = ~pgrp->OSFlagFlags & pnode->OSFlagNodeFlags;
;;;626 if (flags_rdy != (OS_FLAGS)0) {
;;;627 if (OS_FlagTaskRdy(pnode, flags_rdy) == TRUE) { /* Make task RTR, event(s) Rx'd */
;;;628 sched = TRUE; /* When done we will reschedule */
;;;629 }
;;;630 }
;;;631 break;
;;;632 #endif
;;;633 }
;;;634 pnode = (OS_FLAG_NODE *)pnode->OSFlagNodeNext; /* Point to next task waiting for event flag(s) */
;;;635 }
;;;636 OS_EXIT_CRITICAL();
;;;637 if (sched == TRUE) {
;;;638 OS_Sched();
;;;639 }
;;;640 OS_ENTER_CRITICAL();
;;;641 flags_cur = pgrp->OSFlagFlags;
;;;642 OS_EXIT_CRITICAL();
;;;643 *err = OS_NO_ERR;
;;;644 return (flags_cur);
;;;645 }
000764 e12fff1e BX lr
|L1.1896|
000768 e5d50000 LDRB r0,[r5,#0] ;571
00076c e3500005 CMP r0,#5 ;571
000770 0a000003 BEQ |L1.1924|
000774 e3a00001 MOV r0,#1 ;572
000778 e5c70000 STRB r0,[r7,#0] ;572
00077c e3a00000 MOV r0,#0 ;573
000780 eafffff6 B |L1.1888|
|L1.1924|
000784 ef000002 SVC #0x2 ;577
000788 e3540000 CMP r4,#0 ;578
00078c 0a000005 BEQ |L1.1960|
000790 e3540001 CMP r4,#1 ;578
000794 1a000009 BNE |L1.1984|
000798 e1d500b8 LDRH r0,[r5,#8] ;584
00079c e1800006 ORR r0,r0,r6 ;584
0007a0 e1c500b8 STRH r0,[r5,#8] ;584
0007a4 ea000002 B |L1.1972|
|L1.1960|
0007a8 e1d500b8 LDRH r0,[r5,#8] ;580
0007ac e1c00006 BIC r0,r0,r6 ;580
0007b0 e1c500b8 STRH r0,[r5,#8] ;580
|L1.1972|
0007b4 e3a06000 MOV r6,#0 ;592
0007b8 e5954004 LDR r4,[r5,#4] ;593
0007bc ea000039 B |L1.2216|
|L1.1984|
0007c0 ef000003 SVC #0x3 ;588
0007c4 e3a00099 MOV r0,#0x99 ;589
0007c8 e5c70000 STRB r0,[r7,#0] ;589
0007cc e3a00000 MOV r0,#0 ;590
0007d0 eaffffe2 B |L1.1888|
|L1.2004|
0007d4 e5d40012 LDRB r0,[r4,#0x12] ;595
0007d8 e3500000 CMP r0,#0 ;595
0007dc 0a00001b BEQ |L1.2128|
0007e0 e3500001 CMP r0,#1 ;595
0007e4 0a000024 BEQ |L1.2172|
0007e8 e3500002 CMP r0,#2 ;595
0007ec 0a00000c BEQ |L1.2084|
0007f0 e3500003 CMP r0,#3 ;595
0007f4 1a00002a BNE |L1.2212|
0007f8 e1d500b8 LDRH r0,[r5,#8] ;606
0007fc e1d411b0 LDRH r1,[r4,#0x10] ;606
000800 e0011000 AND r1,r1,r0 ;606
000804 e3510000 CMP r1,#0 ;607
000808 0a000025 BEQ |L1.2212|
00080c e1a00004 MOV r0,r4 ;608
000810 ebfffffe BL OS_FlagTaskRdy
000814 e3500001 CMP r0,#1 ;608
000818 1a000021 BNE |L1.2212|
00081c e3a06001 MOV r6,#1 ;609
000820 ea00001f B |L1.2212|
|L1.2084|
000824 e1d510b8 LDRH r1,[r5,#8] ;597
000828 e1d401b0 LDRH r0,[r4,#0x10] ;597
00082c e0011000 AND r1,r1,r0 ;597
000830 e1500001 CMP r0,r1 ;598
000834 1a00001a BNE |L1.2212|
000838 e1a00004 MOV r0,r4 ;599
00083c ebfffffe BL OS_FlagTaskRdy
000840 e3500001 CMP r0,#1 ;599
000844 1a000016 BNE |L1.2212|
000848 e3a06001 MOV r6,#1 ;600
00084c ea000014 B |L1.2212|
|L1.2128|
000850 e1d401b0 LDRH r0,[r4,#0x10] ;616
000854 e1d510b8 LDRH r1,[r5,#8] ;616
000858 e1c01001 BIC r1,r0,r1 ;616
00085c e1500001 CMP r0,r1 ;617
000860 1a00000f BNE |L1.2212|
000864 e1a00004 MOV r0,r4 ;618
000868 ebfffffe BL OS_FlagTaskRdy
00086c e3500001 CMP r0,#1 ;618
000870 1a00000b BNE |L1.2212|
000874 e3a06001 MOV r6,#1 ;619
000878 ea000009 B |L1.2212|
|L1.2172|
00087c e1d401b0 LDRH r0,[r4,#0x10] ;625
000880 e1d510b8 LDRH r1,[r5,#8] ;625
000884 e1c01001 BIC r1,r0,r1 ;625
000888 e3510000 CMP r1,#0 ;626
00088c 0a000004 BEQ |L1.2212|
000890 e1a00004 MOV r0,r4 ;627
000894 ebfffffe BL OS_FlagTaskRdy
000898 e3500001 CMP r0,#1 ;627
00089c 1a000000 BNE |L1.2212|
0008a0 e3a06001 MOV r6,#1 ;628
|L1.2212|
0008a4 e5944000 LDR r4,[r4,#0] ;634
|L1.2216|
0008a8 e3540000 CMP r4,#0 ;594
0008ac 1affffc8 BNE |L1.2004|
0008b0 ef000003 SVC #0x3 ;636
0008b4 e3560001 CMP r6,#1 ;637
0008b8 1a000000 BNE |L1.2240|
0008bc ebfffffe BL OS_Sched
|L1.2240|
0008c0 ef000002 SVC #0x2 ;640
0008c4 e1d540b8 LDRH r4,[r5,#8] ;641
0008c8 ef000003 SVC #0x3 ;642
0008cc e3a00000 MOV r0,#0 ;643
0008d0 e5c70000 STRB r0,[r7,#0] ;643
0008d4 e1a00004 MOV r0,r4 ;644
0008d8 eaffffa0 B |L1.1888|
;;;646 /*$PAGE*/
ENDP
OSFlagQuery PROC
;;;667 OS_FLAGS OSFlagQuery (OS_FLAG_GRP *pgrp, INT8U *err)
;;;668 {
0008dc e92d4070 PUSH {r4-r6,lr}
0008e0 e1a05000 MOV r5,r0
0008e4 e1a04001 MOV r4,r1
;;;669 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;670 OS_CPU_SR cpu_sr;
;;;671 #endif
;;;672 OS_FLAGS flags;
;;;673
;;;674
;;;675 #if OS_ARG_CHK_EN > 0
;;;676 if (pgrp == (OS_FLAG_GRP *)0) { /* Validate 'pgrp' */
0008e8 e3550000 CMP r5,#0
0008ec 1a000004 BNE |L1.2308|
;;;677 *err = OS_FLAG_INVALID_PGRP;
0008f0 e3a00096 MOV r0,#0x96
0008f4 e5c40000 STRB r0,[r4,#0]
;;;678 return ((OS_FLAGS)0);
0008f8 e3a00000 MOV r0,#0
|L1.2300|
0008fc e8bd4070 POP {r4-r6,lr}
;;;679 }
;;;680 if (pgrp->OSFlagType != OS_EVENT_TYPE_FLAG) { /* Validate event block type */
;;;681 *err = OS_ERR_EVENT_TYPE;
;;;682 return ((OS_FLAGS)0);
;;;683 }
;;;684 #endif
;;;685 OS_ENTER_CRITICAL();
;;;686 flags = pgrp->OSFlagFlags;
;;;687 OS_EXIT_CRITICAL();
;;;688 *err = OS_NO_ERR;
;;;689 return (flags);
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?