📄 os_flag.txt
字号:
00070c eaffff9e B |L1.1420| ;454
|L1.1808|
000710 e1a03006 MOV r3,r6 ;456
000714 e1a02005 MOV r2,r5 ;456
000718 e58d7000 STR r7,[sp,#0] ;456
00071c e28d1008 ADD r1,sp,#8 ;456
000720 e1a00004 MOV r0,r4 ;456
000724 ebfffffe BL OS_FlagBlock ;456
000728 ef000003 SVC 0x3 ; formerly SWI ;457
00072c ea000020 B |L1.1972| ;459
|L1.1840|
000730 e1a00000 MOV r0,r0 ;461
000734 e1d400b8 LDRH r0,[r4,#8] ;462
000738 e1c50000 BIC r0,r5,r0 ;462
00073c e1a0a800 LSL r10,r0,#16 ;462
000740 e1a0a82a LSR r10,r10,#16 ;462
000744 e35a0000 CMP r10,#0 ;463
000748 0a00000a BEQ |L1.1912| ;463
00074c e35b0001 CMP r11,#1 ;464
000750 1a000002 BNE |L1.1888| ;464
000754 e1d400b8 LDRH r0,[r4,#8] ;465
000758 e180000a ORR r0,r0,r10 ;465
00075c e1c400b8 STRH r0,[r4,#8] ;465
|L1.1888|
000760 e1d490b8 LDRH r9,[r4,#8] ;467
000764 ef000003 SVC 0x3 ; formerly SWI ;468
000768 e3a00000 MOV r0,#0 ;469
00076c e5c80000 STRB r0,[r8,#0] ;469
000770 e1a00009 MOV r0,r9 ;470
000774 eaffff84 B |L1.1420| ;470
|L1.1912|
000778 e1a03006 MOV r3,r6 ;472
00077c e1a02005 MOV r2,r5 ;472
000780 e58d7000 STR r7,[sp,#0] ;472
000784 e28d1008 ADD r1,sp,#8 ;472
000788 e1a00004 MOV r0,r4 ;472
00078c ebfffffe BL OS_FlagBlock ;472
000790 ef000003 SVC 0x3 ; formerly SWI ;473
000794 ea000006 B |L1.1972| ;475
|L1.1944|
000798 e1a00000 MOV r0,r0 ;478
00079c ef000003 SVC 0x3 ; formerly SWI ;479
0007a0 e3a09000 MOV r9,#0 ;480
0007a4 e3a00097 MOV r0,#0x97 ;481
0007a8 e5c80000 STRB r0,[r8,#0] ;481
0007ac e1a00009 MOV r0,r9 ;482
0007b0 eaffff75 B |L1.1420| ;482
|L1.1972|
0007b4 e1a00000 MOV r0,r0 ;426
0007b8 ebfffffe BL OS_Sched ;484
0007bc ef000002 SVC 0x2 ; formerly SWI ;485
0007c0 e59f037c LDR r0,|L1.2884| ;486
0007c4 e5900000 LDR r0,[r0,#0] ;486 ; OSTCBCur
0007c8 e5d0001c LDRB r0,[r0,#0x1c] ;486
0007cc e3100020 TST r0,#0x20 ;486
0007d0 0a00000a BEQ |L1.2048| ;486
0007d4 e28d0008 ADD r0,sp,#8 ;487
0007d8 ebfffffe BL OS_FlagUnlink ;487
0007dc e3a00000 MOV r0,#0 ;488
0007e0 e59f135c LDR r1,|L1.2884| ;488
0007e4 e5911000 LDR r1,[r1,#0] ;488 ; OSTCBCur
0007e8 e5c1001c STRB r0,[r1,#0x1c] ;488
0007ec ef000003 SVC 0x3 ; formerly SWI ;489
0007f0 e3a09000 MOV r9,#0 ;490
0007f4 e3a0000a MOV r0,#0xa ;491
0007f8 e5c80000 STRB r0,[r8,#0] ;491
0007fc ea000021 B |L1.2184| ;491
|L1.2048|
000800 e35b0001 CMP r11,#1 ;493
000804 1a00001b BNE |L1.2168| ;493
000808 e3560000 CMP r6,#0 ;494
00080c 0a00000f BEQ |L1.2128| ;494
000810 e3560001 CMP r6,#1 ;494
000814 0a00000f BEQ |L1.2136| ;494
000818 e3560002 CMP r6,#2 ;494
00081c 0a000002 BEQ |L1.2092| ;494
000820 e3560003 CMP r6,#3 ;494
000824 1a000012 BNE |L1.2164| ;494
000828 ea000001 B |L1.2100| ;494
|L1.2092|
00082c e1a00000 MOV r0,r0 ;495
000830 e1a00000 MOV r0,r0 ;496
|L1.2100|
000834 e1d400b8 LDRH r0,[r4,#8] ;497
000838 e59f1304 LDR r1,|L1.2884| ;497
00083c e5911000 LDR r1,[r1,#0] ;497 ; OSTCBCur
000840 e1d111b8 LDRH r1,[r1,#0x18] ;497
000844 e1c00001 BIC r0,r0,r1 ;497
000848 e1c400b8 STRH r0,[r4,#8] ;497
00084c ea000008 B |L1.2164| ;498
|L1.2128|
000850 e1a00000 MOV r0,r0 ;501
000854 e1a00000 MOV r0,r0 ;502
|L1.2136|
000858 e1d400b8 LDRH r0,[r4,#8] ;503
00085c e59f12e0 LDR r1,|L1.2884| ;503
000860 e5911000 LDR r1,[r1,#0] ;503 ; OSTCBCur
000864 e1d111b8 LDRH r1,[r1,#0x18] ;503
000868 e1800001 ORR r0,r0,r1 ;503
00086c e1c400b8 STRH r0,[r4,#8] ;503
000870 e1a00000 MOV r0,r0 ;504
|L1.2164|
000874 e1a00000 MOV r0,r0 ;498
|L1.2168|
000878 e1d490b8 LDRH r9,[r4,#8] ;508
00087c ef000003 SVC 0x3 ; formerly SWI ;509
000880 e3a00000 MOV r0,#0 ;510
000884 e5c80000 STRB r0,[r8,#0] ;510
|L1.2184|
000888 e1a00009 MOV r0,r9 ;512
00088c eaffff3e B |L1.1420| ;512
ENDP
OSFlagPost PROC
;;;556 OS_FLAGS OSFlagPost (OS_FLAG_GRP *pgrp, OS_FLAGS flags, INT8U opt, INT8U *err)
;;;557 {
000890 e92d5ff0 PUSH {r4-r12,lr}
000894 e1a04000 MOV r4,r0
000898 e1a05001 MOV r5,r1
00089c e1a06002 MOV r6,r2
0008a0 e1a07003 MOV r7,r3
;;;558 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;559 OS_CPU_SR cpu_sr;
;;;560 #endif
;;;561 OS_FLAG_NODE *pnode;
;;;562 BOOLEAN sched;
;;;563 OS_FLAGS flags_cur;
;;;564 OS_FLAGS flags_rdy;
;;;565
;;;566
;;;567 #if OS_ARG_CHK_EN > 0
;;;568 if (pgrp == (OS_FLAG_GRP *)0) { /* Validate 'pgrp' */
0008a4 e3540000 CMP r4,#0
0008a8 1a000003 BNE |L1.2236|
;;;569 *err = OS_FLAG_INVALID_PGRP;
0008ac e3a00096 MOV r0,#0x96
0008b0 e5c70000 STRB r0,[r7,#0]
;;;570 return ((OS_FLAGS)0);
0008b4 e3a00000 MOV r0,#0
;;;571 }
;;;572 if (pgrp->OSFlagType != OS_EVENT_TYPE_FLAG) { /* Make sure we are pointing to an event flag grp */
;;;573 *err = OS_ERR_EVENT_TYPE;
;;;574 return ((OS_FLAGS)0);
;;;575 }
;;;576 #endif
;;;577 /*$PAGE*/
;;;578 OS_ENTER_CRITICAL();
;;;579 switch (opt) {
;;;580 case OS_FLAG_CLR:
;;;581 pgrp->OSFlagFlags &= ~flags; /* Clear the flags specified in the group */
;;;582 break;
;;;583
;;;584 case OS_FLAG_SET:
;;;585 pgrp->OSFlagFlags |= flags; /* Set the flags specified in the group */
;;;586 break;
;;;587
;;;588 default:
;;;589 OS_EXIT_CRITICAL(); /* INVALID option */
;;;590 *err = OS_FLAG_INVALID_OPT;
;;;591 return ((OS_FLAGS)0);
;;;592 }
;;;593 sched = FALSE; /* Indicate that we don't need rescheduling */
;;;594 pnode = pgrp->OSFlagWaitList;
;;;595 while (pnode != (OS_FLAG_NODE *)0) { /* Go through all tasks waiting on event flag(s) */
;;;596 switch (pnode->OSFlagNodeWaitType) {
;;;597 case OS_FLAG_WAIT_SET_ALL: /* See if all req. flags are set for current node */
;;;598 flags_rdy = pgrp->OSFlagFlags & pnode->OSFlagNodeFlags;
;;;599 if (flags_rdy == pnode->OSFlagNodeFlags) {
;;;600 if (OS_FlagTaskRdy(pnode, flags_rdy) == TRUE) { /* Make task RTR, event(s) Rx'd */
;;;601 sched = TRUE; /* When done we will reschedule */
;;;602 }
;;;603 }
;;;604 break;
;;;605
;;;606 case OS_FLAG_WAIT_SET_ANY: /* See if any flag set */
;;;607 flags_rdy = pgrp->OSFlagFlags & pnode->OSFlagNodeFlags;
;;;608 if (flags_rdy != (OS_FLAGS)0) {
;;;609 if (OS_FlagTaskRdy(pnode, flags_rdy) == TRUE) { /* Make task RTR, event(s) Rx'd */
;;;610 sched = TRUE; /* When done we will reschedule */
;;;611 }
;;;612 }
;;;613 break;
;;;614
;;;615 #if OS_FLAG_WAIT_CLR_EN > 0
;;;616 case OS_FLAG_WAIT_CLR_ALL: /* See if all req. flags are set for current node */
;;;617 flags_rdy = ~pgrp->OSFlagFlags & pnode->OSFlagNodeFlags;
;;;618 if (flags_rdy == pnode->OSFlagNodeFlags) {
;;;619 if (OS_FlagTaskRdy(pnode, flags_rdy) == TRUE) { /* Make task RTR, event(s) Rx'd */
;;;620 sched = TRUE; /* When done we will reschedule */
;;;621 }
;;;622 }
;;;623 break;
;;;624
;;;625 case OS_FLAG_WAIT_CLR_ANY: /* See if any flag set */
;;;626 flags_rdy = ~pgrp->OSFlagFlags & pnode->OSFlagNodeFlags;
;;;627 if (flags_rdy != (OS_FLAGS)0) {
;;;628 if (OS_FlagTaskRdy(pnode, flags_rdy) == TRUE) { /* Make task RTR, event(s) Rx'd */
;;;629 sched = TRUE; /* When done we will reschedule */
;;;630 }
;;;631 }
;;;632 break;
;;;633 #endif
;;;634 }
;;;635 pnode = pnode->OSFlagNodeNext; /* Point to next task waiting for event flag(s) */
;;;636 }
;;;637 OS_EXIT_CRITICAL();
;;;638 if (sched == TRUE) {
;;;639 OS_Sched();
;;;640 }
;;;641 OS_ENTER_CRITICAL();
;;;642 flags_cur = pgrp->OSFlagFlags;
;;;643 OS_EXIT_CRITICAL();
;;;644 *err = OS_NO_ERR;
;;;645 return (flags_cur);
;;;646 }
|L1.2232|
0008b8 e8bd9ff0 POP {r4-r12,pc}
|L1.2236|
0008bc e5d40000 LDRB r0,[r4,#0] ;572
0008c0 e3500005 CMP r0,#5 ;572
0008c4 0a000003 BEQ |L1.2264| ;572
0008c8 e3a00001 MOV r0,#1 ;573
0008cc e5c70000 STRB r0,[r7,#0] ;573
0008d0 e3a00000 MOV r0,#0 ;574
0008d4 eafffff7 B |L1.2232| ;574
|L1.2264|
0008d8 ef000002 SVC 0x2 ; formerly SWI ;578
0008dc e3560000 CMP r6,#0 ;579
0008e0 0a000002 BEQ |L1.2288| ;579
0008e4 e3560001 CMP r6,#1 ;579
0008e8 1a00000a BNE |L1.2328|
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -