📄 os_flag.txt
字号:
000698 13580003 CMPNE r8,#3 ;700
00069c 1a000007 BNE |L1.1728|
0006a0 e1d400b8 LDRH r0,[r4,#8] ;703
0006a4 e1c00007 BIC r0,r0,r7 ;703
|L1.1704|
0006a8 e1c400b8 STRH r0,[r4,#8] ;709
|L1.1708|
0006ac e1a0000c MOV r0,r12 ;718
0006b0 ebfffffe BL OS_CPU_SR_Restore
0006b4 e1a00007 MOV r0,r7 ;720
0006b8 e5c5a000 STRB r10,[r5,#0] ;719
0006bc eaffffc5 B |L1.1496|
|L1.1728|
0006c0 e1a0000c MOV r0,r12 ;713
0006c4 ebfffffe BL OS_CPU_SR_Restore
0006c8 e3a0006f MOV r0,#0x6f ;714
|L1.1740|
0006cc e5c50000 STRB r0,[r5,#0] ;714
0006d0 e3a00000 MOV r0,#0 ;715
0006d4 eaffffbf B |L1.1496|
;;;722 /*$PAGE*/
ENDP
OSFlagPendGetFlagsRdy PROC
;;;738 OS_FLAGS OSFlagPendGetFlagsRdy (void)
;;;739 {
0006d8 e92d4010 PUSH {r4,lr}
;;;740 OS_FLAGS flags;
;;;741 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;742 OS_CPU_SR cpu_sr = 0;
;;;743 #endif
;;;744
;;;745
;;;746
;;;747 OS_ENTER_CRITICAL();
0006dc ebfffffe BL OS_CPU_SR_Save
;;;748 flags = OSTCBCur->OSTCBFlagsRdy;
0006e0 e59f1210 LDR r1,|L1.2296|
0006e4 e5911000 LDR r1,[r1,#0] ; OSTCBCur
0006e8 e1d142b8 LDRH r4,[r1,#0x28]
;;;749 OS_EXIT_CRITICAL();
0006ec ebfffffe BL OS_CPU_SR_Restore
;;;750 return (flags);
0006f0 e1a00004 MOV r0,r4
0006f4 e8bd4010 POP {r4,lr}
;;;751 }
0006f8 e12fff1e BX lr
;;;752
ENDP
OSFlagPost PROC
;;;795 OS_FLAGS OSFlagPost (OS_FLAG_GRP *pgrp, OS_FLAGS flags, INT8U opt, INT8U *perr)
;;;796 {
0006fc e92d41f0 PUSH {r4-r8,lr}
000700 e1a05000 MOV r5,r0
;;;797 OS_FLAG_NODE *pnode;
;;;798 BOOLEAN sched;
;;;799 OS_FLAGS flags_cur;
;;;800 OS_FLAGS flags_rdy;
;;;801 BOOLEAN rdy;
;;;802 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;803 OS_CPU_SR cpu_sr = 0;
;;;804 #endif
;;;805
;;;806
;;;807
;;;808 #if OS_ARG_CHK_EN > 0
;;;809 if (perr == (INT8U *)0) { /* Validate 'perr' */
;;;810 return ((OS_FLAGS)0);
;;;811 }
;;;812 if (pgrp == (OS_FLAG_GRP *)0) { /* Validate 'pgrp' */
;;;813 *perr = OS_ERR_FLAG_INVALID_PGRP;
;;;814 return ((OS_FLAGS)0);
;;;815 }
;;;816 #endif
;;;817 if (pgrp->OSFlagType != OS_EVENT_TYPE_FLAG) { /* Make sure we are pointing to an event flag grp */
000704 e5d00000 LDRB r0,[r0,#0]
000708 e1a06001 MOV r6,r1 ;796
00070c e1a04002 MOV r4,r2 ;796
000710 e3500005 CMP r0,#5
000714 e1a07003 MOV r7,r3 ;796
;;;818 *perr = OS_ERR_EVENT_TYPE;
000718 13a00001 MOVNE r0,#1
;;;819 return ((OS_FLAGS)0);
00071c 1a000041 BNE |L1.2088|
;;;820 }
;;;821 /*$PAGE*/
;;;822 OS_ENTER_CRITICAL();
000720 ebfffffe BL OS_CPU_SR_Save
;;;823 switch (opt) {
000724 e3540000 CMP r4,#0
000728 e1a08000 MOV r8,r0 ;822
;;;824 case OS_FLAG_CLR:
;;;825 pgrp->OSFlagFlags &= ~flags; /* Clear the flags specified in the group */
00072c 01d500b8 LDRHEQ r0,[r5,#8]
000730 01c00006 BICEQ r0,r0,r6
;;;826 break;
000734 0a000003 BEQ |L1.1864|
000738 e3540001 CMP r4,#1 ;823
00073c 1a000005 BNE |L1.1880|
;;;827
;;;828 case OS_FLAG_SET:
;;;829 pgrp->OSFlagFlags |= flags; /* Set the flags specified in the group */
000740 e1d500b8 LDRH r0,[r5,#8]
000744 e1800006 ORR r0,r0,r6
|L1.1864|
000748 e1c500b8 STRH r0,[r5,#8] ;825
;;;830 break;
;;;831
;;;832 default:
;;;833 OS_EXIT_CRITICAL(); /* INVALID option */
;;;834 *perr = OS_ERR_FLAG_INVALID_OPT;
;;;835 return ((OS_FLAGS)0);
;;;836 }
;;;837 sched = OS_FALSE; /* Indicate that we don't need rescheduling */
;;;838 pnode = (OS_FLAG_NODE *)pgrp->OSFlagWaitList;
00074c e5954004 LDR r4,[r5,#4]
000750 e3a06000 MOV r6,#0 ;837
;;;839 while (pnode != (OS_FLAG_NODE *)0) { /* Go through all tasks waiting on event flag(s) */
000754 ea000022 B |L1.2020|
|L1.1880|
000758 e1a00008 MOV r0,r8 ;833
00075c ebfffffe BL OS_CPU_SR_Restore
000760 e3a00071 MOV r0,#0x71 ;834
000764 ea00002f B |L1.2088|
|L1.1896|
;;;840 switch (pnode->OSFlagNodeWaitType) {
000768 e5d41012 LDRB r1,[r4,#0x12]
00076c e3510000 CMP r1,#0
;;;841 case OS_FLAG_WAIT_SET_ALL: /* See if all req. flags are set for current node */
;;;842 flags_rdy = (OS_FLAGS)(pgrp->OSFlagFlags & pnode->OSFlagNodeFlags);
;;;843 if (flags_rdy == pnode->OSFlagNodeFlags) {
;;;844 rdy = OS_FlagTaskRdy(pnode, flags_rdy); /* Make task RTR, event(s) Rx'd */
;;;845 if (rdy == OS_TRUE) {
;;;846 sched = OS_TRUE; /* When done we will reschedule */
;;;847 }
;;;848 }
;;;849 break;
;;;850
;;;851 case OS_FLAG_WAIT_SET_ANY: /* See if any flag set */
;;;852 flags_rdy = (OS_FLAGS)(pgrp->OSFlagFlags & pnode->OSFlagNodeFlags);
;;;853 if (flags_rdy != (OS_FLAGS)0) {
;;;854 rdy = OS_FlagTaskRdy(pnode, flags_rdy); /* Make task RTR, event(s) Rx'd */
;;;855 if (rdy == OS_TRUE) {
;;;856 sched = OS_TRUE; /* When done we will reschedule */
;;;857 }
;;;858 }
;;;859 break;
;;;860
;;;861 #if OS_FLAG_WAIT_CLR_EN > 0
;;;862 case OS_FLAG_WAIT_CLR_ALL: /* See if all req. flags are set for current node */
;;;863 flags_rdy = (OS_FLAGS)(~pgrp->OSFlagFlags & pnode->OSFlagNodeFlags);
000770 01d401b0 LDRHEQ r0,[r4,#0x10]
000774 01d510b8 LDRHEQ r1,[r5,#8]
000778 01c01001 BICEQ r1,r0,r1
;;;864 if (flags_rdy == pnode->OSFlagNodeFlags) {
00077c 0a000011 BEQ |L1.1992|
000780 e3510001 CMP r1,#1 ;840
;;;865 rdy = OS_FlagTaskRdy(pnode, flags_rdy); /* Make task RTR, event(s) Rx'd */
;;;866 if (rdy == OS_TRUE) {
;;;867 sched = OS_TRUE; /* When done we will reschedule */
;;;868 }
;;;869 }
;;;870 break;
;;;871
;;;872 case OS_FLAG_WAIT_CLR_ANY: /* See if any flag set */
;;;873 flags_rdy = (OS_FLAGS)(~pgrp->OSFlagFlags & pnode->OSFlagNodeFlags);
000784 01d401b0 LDRHEQ r0,[r4,#0x10]
000788 01d510b8 LDRHEQ r1,[r5,#8]
00078c 01c01001 BICEQ r1,r0,r1
;;;874 if (flags_rdy != (OS_FLAGS)0) {
000790 0a000006 BEQ |L1.1968|
000794 e3510002 CMP r1,#2 ;840
000798 0a000007 BEQ |L1.1980|
00079c e3510003 CMP r1,#3 ;840
0007a0 1a00001d BNE |L1.2076|
0007a4 e1d500b8 LDRH r0,[r5,#8] ;852
0007a8 e1d411b0 LDRH r1,[r4,#0x10] ;852
0007ac e0011000 AND r1,r1,r0 ;852
|L1.1968|
0007b0 e3510000 CMP r1,#0
0007b4 0a000009 BEQ |L1.2016|
0007b8 ea000004 B |L1.2000|
|L1.1980|
0007bc e1d510b8 LDRH r1,[r5,#8] ;842
0007c0 e1d401b0 LDRH r0,[r4,#0x10] ;842
0007c4 e0011000 AND r1,r1,r0 ;842
|L1.1992|
0007c8 e1500001 CMP r0,r1 ;864
0007cc 1a000003 BNE |L1.2016|
|L1.2000|
;;;875 rdy = OS_FlagTaskRdy(pnode, flags_rdy); /* Make task RTR, event(s) Rx'd */
0007d0 e1a00004 MOV r0,r4
0007d4 ebfffffe BL OS_FlagTaskRdy
;;;876 if (rdy == OS_TRUE) {
0007d8 e3500001 CMP r0,#1
;;;877 sched = OS_TRUE; /* When done we will reschedule */
0007dc 03a06001 MOVEQ r6,#1
|L1.2016|
;;;878 }
;;;879 }
;;;880 break;
;;;881 #endif
;;;882 default:
;;;883 OS_EXIT_CRITICAL();
;;;884 *perr = OS_ERR_FLAG_WAIT_TYPE;
;;;885 return ((OS_FLAGS)0);
;;;886 }
;;;887 pnode = (OS_FLAG_NODE *)pnode->OSFlagNodeNext; /* Point to next task waiting for event flag(s) */
0007e0 e5944000 LDR r4,[r4,#0]
|L1.2020|
0007e4 e3540000 CMP r4,#0 ;839
0007e8 1affffde BNE |L1.1896|
;;;888 }
;;;889 OS_EXIT_CRITICAL();
0007ec e1a00008 MOV r0,r8
0007f0 ebfffffe BL OS_CPU_SR_Restore
;;;890 if (sched == OS_TRUE) {
0007f4 e3560001 CMP r6,#1
;;;891 OS_Sched();
0007f8 0bfffffe BLEQ OS_Sched
;;;892 }
;;;893 OS_ENTER_CRITICAL();
0007fc ebfffffe BL OS_CPU_SR_Save
;;;894 flags_cur = pgrp->OSFlagFlags;
000800 e1d540b8 LDRH r4,[r5,#8]
;;;895 OS_EXIT_CRITICAL();
000804 ebfffffe BL OS_CPU_SR_Restore
;;;896 *perr = OS_ERR_NONE;
000808 e3a00000 MOV r0,#0
00080c e5c70000 STRB r0,[r7,#0]
;;;897 return (flags_cur);
000810 e1a00004 MOV r0,r4
|L1.2068|
000814 e8bd41f0 POP {r4-r8,lr}
;;;898 }
000818 e12fff1e BX lr
|L1.2076|
00081c e1a00008 MOV r0,r8 ;883
000820 ebfffffe BL OS_CPU_SR_Restore
000824 e3a0006f MOV r0,#0x6f ;884
|L1.2088|
000828 e5c70000 STRB r0,[r7,#0] ;884
00082c e3a00000 MOV r0,#0 ;885
000830 eafffff7 B |L1.2068|
;;;899 /*$PAGE*/
ENDP
OSFlagQuery PROC
;;;920 OS_FLAGS OSFlagQuery (OS_FLAG_GRP *pgrp, INT8U *perr)
;;;921
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -