📄 os_flag.txt
字号:
000724 e1a00009 MOV r0,r9 ;453
000728 eaffff9d B |L1.1444| ;453
|L1.1836|
00072c e1a03006 MOV r3,r6 ;455
000730 e1a02005 MOV r2,r5 ;455
000734 e58d7000 STR r7,[sp,#0] ;455
000738 e28d1008 ADD r1,sp,#8 ;455
00073c e1a00004 MOV r0,r4 ;455
000740 ebfffffe BL OS_FlagBlock ;455
000744 ef000003 SVC 0x3 ; formerly SWI ;456
000748 ea000020 B |L1.2000| ;458
|L1.1868|
00074c e1a00000 MOV r0,r0 ;460
000750 e1d400b8 LDRH r0,[r4,#8] ;461
000754 e1c50000 BIC r0,r5,r0 ;461
000758 e1a0a800 LSL r10,r0,#16 ;461
00075c e1a0a82a LSR r10,r10,#16 ;461
000760 e35a0000 CMP r10,#0 ;462
000764 0a00000a BEQ |L1.1940| ;462
000768 e35b0001 CMP r11,#1 ;463
00076c 1a000002 BNE |L1.1916| ;463
000770 e1d400b8 LDRH r0,[r4,#8] ;464
000774 e180000a ORR r0,r0,r10 ;464
000778 e1c400b8 STRH r0,[r4,#8] ;464
|L1.1916|
00077c e1d490b8 LDRH r9,[r4,#8] ;466
000780 ef000003 SVC 0x3 ; formerly SWI ;467
000784 e3a00000 MOV r0,#0 ;468
000788 e5c80000 STRB r0,[r8,#0] ;468
00078c e1a00009 MOV r0,r9 ;469
000790 eaffff83 B |L1.1444| ;469
|L1.1940|
000794 e1a03006 MOV r3,r6 ;471
000798 e1a02005 MOV r2,r5 ;471
00079c e58d7000 STR r7,[sp,#0] ;471
0007a0 e28d1008 ADD r1,sp,#8 ;471
0007a4 e1a00004 MOV r0,r4 ;471
0007a8 ebfffffe BL OS_FlagBlock ;471
0007ac ef000003 SVC 0x3 ; formerly SWI ;472
0007b0 ea000006 B |L1.2000| ;474
|L1.1972|
0007b4 e1a00000 MOV r0,r0 ;477
0007b8 ef000003 SVC 0x3 ; formerly SWI ;478
0007bc e3a09000 MOV r9,#0 ;479
0007c0 e3a00097 MOV r0,#0x97 ;480
0007c4 e5c80000 STRB r0,[r8,#0] ;480
0007c8 e1a00009 MOV r0,r9 ;481
0007cc eaffff74 B |L1.1444| ;481
|L1.2000|
0007d0 e1a00000 MOV r0,r0 ;425
0007d4 ebfffffe BL OS_Sched ;483
0007d8 ef000002 SVC 0x2 ; formerly SWI ;484
0007dc e59f0384 LDR r0,|L1.2920| ;485
0007e0 e5900000 LDR r0,[r0,#0] ;485 ; OSTCBCur
0007e4 e5d0002c LDRB r0,[r0,#0x2c] ;485
0007e8 e3100020 TST r0,#0x20 ;485
0007ec 0a00000a BEQ |L1.2076| ;485
0007f0 e28d0008 ADD r0,sp,#8 ;486
0007f4 ebfffffe BL OS_FlagUnlink ;486
0007f8 e3a00000 MOV r0,#0 ;487
0007fc e59f1364 LDR r1,|L1.2920| ;487
000800 e5911000 LDR r1,[r1,#0] ;487 ; OSTCBCur
000804 e5c1002c STRB r0,[r1,#0x2c] ;487
000808 ef000003 SVC 0x3 ; formerly SWI ;488
00080c e3a09000 MOV r9,#0 ;489
000810 e3a0000a MOV r0,#0xa ;490
000814 e5c80000 STRB r0,[r8,#0] ;490
000818 ea000021 B |L1.2212| ;490
|L1.2076|
00081c e35b0001 CMP r11,#1 ;492
000820 1a00001b BNE |L1.2196| ;492
000824 e3560000 CMP r6,#0 ;493
000828 0a00000f BEQ |L1.2156| ;493
00082c e3560001 CMP r6,#1 ;493
000830 0a00000f BEQ |L1.2164| ;493
000834 e3560002 CMP r6,#2 ;493
000838 0a000002 BEQ |L1.2120| ;493
00083c e3560003 CMP r6,#3 ;493
000840 1a000012 BNE |L1.2192| ;493
000844 ea000001 B |L1.2128| ;493
|L1.2120|
000848 e1a00000 MOV r0,r0 ;494
00084c e1a00000 MOV r0,r0 ;495
|L1.2128|
000850 e1d400b8 LDRH r0,[r4,#8] ;496
000854 e59f130c LDR r1,|L1.2920| ;496
000858 e5911000 LDR r1,[r1,#0] ;496 ; OSTCBCur
00085c e1d112b8 LDRH r1,[r1,#0x28] ;496
000860 e1c00001 BIC r0,r0,r1 ;496
000864 e1c400b8 STRH r0,[r4,#8] ;496
000868 ea000008 B |L1.2192| ;497
|L1.2156|
00086c e1a00000 MOV r0,r0 ;500
000870 e1a00000 MOV r0,r0 ;501
|L1.2164|
000874 e1d400b8 LDRH r0,[r4,#8] ;502
000878 e59f12e8 LDR r1,|L1.2920| ;502
00087c e5911000 LDR r1,[r1,#0] ;502 ; OSTCBCur
000880 e1d112b8 LDRH r1,[r1,#0x28] ;502
000884 e1800001 ORR r0,r0,r1 ;502
000888 e1c400b8 STRH r0,[r4,#8] ;502
00088c e1a00000 MOV r0,r0 ;503
|L1.2192|
000890 e1a00000 MOV r0,r0 ;497
|L1.2196|
000894 e1d490b8 LDRH r9,[r4,#8] ;507
000898 ef000003 SVC 0x3 ; formerly SWI ;508
00089c e3a00000 MOV r0,#0 ;509
0008a0 e5c80000 STRB r0,[r8,#0] ;509
|L1.2212|
0008a4 e1a00009 MOV r0,r9 ;511
0008a8 eaffff3d B |L1.1444| ;511
ENDP
OSFlagPost PROC
;;;555 OS_FLAGS OSFlagPost (OS_FLAG_GRP *pgrp, OS_FLAGS flags, INT8U opt, INT8U *err)
;;;556 {
0008ac e92d5ff0 PUSH {r4-r12,lr}
0008b0 e1a04000 MOV r4,r0
0008b4 e1a05001 MOV r5,r1
0008b8 e1a06002 MOV r6,r2
0008bc e1a07003 MOV r7,r3
;;;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' */
0008c0 e3540000 CMP r4,#0
0008c4 1a000004 BNE |L1.2268|
;;;568 *err = OS_FLAG_INVALID_PGRP;
0008c8 e3a00096 MOV r0,#0x96
0008cc e5c70000 STRB r0,[r7,#0]
;;;569 return ((OS_FLAGS)0);
0008d0 e3a00000 MOV r0,#0
|L1.2260|
0008d4 e8bd5ff0 POP {r4-r12,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 }
0008d8 e12fff1e BX lr
|L1.2268|
0008dc e5d40000 LDRB r0,[r4,#0] ;571
0008e0 e3500005 CMP r0,#5 ;571
0008e4 0a000003 BEQ |L1.2296| ;571
0008e8 e3a00001 MOV r0,#1 ;572
0008ec e5c70000 STRB r0,[r7,#0] ;572
0008f0 e3a00000 MOV r0,#0 ;573
0008f4 eafffff6 B |L1.2260| ;573
|L1.2296|
0008f8 ef000002 SVC 0x2 ; formerly SWI ;577
0008fc e356
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -