📄 os_flag.txt
字号:
000500 e1a08002 MOV r8,r2 ;561
;;;583 *perr = OS_ERR_PEND_ISR; /* ... can't PEND from an ISR */
000504 13a00002 MOVNE r0,#2
;;;584 return ((OS_FLAGS)0);
000508 1a00006f BNE |L1.1740|
;;;585 }
;;;586 if (OSLockNesting > 0) { /* See if called with scheduler locked ... */
00050c e59f03e8 LDR r0,|L1.2300|
000510 e5d00000 LDRB r0,[r0,#0] ; OSLockNesting
000514 e3500000 CMP r0,#0
;;;587 *perr = OS_ERR_PEND_LOCKED; /* ... can't PEND when locked */
000518 13a0000d MOVNE r0,#0xd
;;;588 return ((OS_FLAGS)0);
00051c 1a00006a BNE |L1.1740|
;;;589 }
;;;590 if (pgrp->OSFlagType != OS_EVENT_TYPE_FLAG) { /* Validate event block type */
000520 e5d40000 LDRB r0,[r4,#0]
000524 e3500005 CMP r0,#5
;;;591 *perr = OS_ERR_EVENT_TYPE;
000528 13a00001 MOVNE r0,#1
;;;592 return ((OS_FLAGS)0);
00052c 1a000066 BNE |L1.1740|
;;;593 }
;;;594 result = (INT8U)(wait_type & OS_FLAG_CONSUME);
000530 e3180080 TST r8,#0x80
;;;595 if (result != (INT8U)0) { /* See if we need to consume the flags */
;;;596 wait_type &= ~(INT8U)OS_FLAG_CONSUME;
;;;597 consume = OS_TRUE;
;;;598 } else {
;;;599 consume = OS_FALSE;
000534 03a06000 MOVEQ r6,#0
000538 13c88080 BICNE r8,r8,#0x80 ;596
00053c 13a06001 MOVNE r6,#1 ;597
;;;600 }
;;;601 /*$PAGE*/
;;;602 OS_ENTER_CRITICAL();
000540 ebfffffe BL OS_CPU_SR_Save
000544 e59fb3ac LDR r11,|L1.2296|
;;;603 switch (wait_type) {
000548 e3580000 CMP r8,#0
00054c e3a0a000 MOV r10,#0 ;602
000550 e58d0004 STR r0,[sp,#4]
000554 0a000011 BEQ |L1.1440|
000558 e3580001 CMP r8,#1
00055c 0a000020 BEQ |L1.1508|
000560 e3580002 CMP r8,#2
000564 0a000005 BEQ |L1.1408|
000568 e3580003 CMP r8,#3
00056c 1a00003b BNE |L1.1632|
;;;604 case OS_FLAG_WAIT_SET_ALL: /* See if all required flags are set */
;;;605 flags_rdy = (OS_FLAGS)(pgrp->OSFlagFlags & flags); /* Extract only the bits we want */
;;;606 if (flags_rdy == flags) { /* Must match ALL the bits that we want */
;;;607 if (consume == OS_TRUE) { /* See if we need to consume the flags */
;;;608 pgrp->OSFlagFlags &= ~flags_rdy; /* Clear ONLY the flags that we wanted */
;;;609 }
;;;610 OSTCBCur->OSTCBFlagsRdy = flags_rdy; /* Save flags that were ready */
;;;611 OS_EXIT_CRITICAL(); /* Yes, condition met, return to caller */
;;;612 *perr = OS_ERR_NONE;
;;;613 return (flags_rdy);
;;;614 } else { /* Block task until events occur or timeout */
;;;615 OS_FlagBlock(pgrp, &node, flags, wait_type, timeout);
;;;616 OS_EXIT_CRITICAL();
;;;617 }
;;;618 break;
;;;619
;;;620 case OS_FLAG_WAIT_SET_ANY:
;;;621 flags_rdy = (OS_FLAGS)(pgrp->OSFlagFlags & flags); /* Extract only the bits we want */
000570 e1d400b8 LDRH r0,[r4,#8]
000574 e0109007 ANDS r9,r0,r7
;;;622 if (flags_rdy != (OS_FLAGS)0) { /* See if any flag set */
000578 0a00001c BEQ |L1.1520|
00057c ea000003 B |L1.1424|
|L1.1408|
000580 e1d400b8 LDRH r0,[r4,#8] ;605
000584 e0009007 AND r9,r0,r7 ;605
000588 e1590007 CMP r9,r7 ;606
00058c 1a000017 BNE |L1.1520|
|L1.1424|
000590 e3560001 CMP r6,#1 ;607
000594 1a000009 BNE |L1.1472|
000598 e1c00009 BIC r0,r0,r9 ;608
00059c ea000006 B |L1.1468|
|L1.1440|
;;;623 if (consume == OS_TRUE) { /* See if we need to consume the flags */
;;;624 pgrp->OSFlagFlags &= ~flags_rdy; /* Clear ONLY the flags that we got */
;;;625 }
;;;626 OSTCBCur->OSTCBFlagsRdy = flags_rdy; /* Save flags that were ready */
;;;627 OS_EXIT_CRITICAL(); /* Yes, condition met, return to caller */
;;;628 *perr = OS_ERR_NONE;
;;;629 return (flags_rdy);
;;;630 } else { /* Block task until events occur or timeout */
;;;631 OS_FlagBlock(pgrp, &node, flags, wait_type, timeout);
;;;632 OS_EXIT_CRITICAL();
;;;633 }
;;;634 break;
;;;635
;;;636 #if OS_FLAG_WAIT_CLR_EN > 0
;;;637 case OS_FLAG_WAIT_CLR_ALL: /* See if all required flags are cleared */
;;;638 flags_rdy = (OS_FLAGS)(~pgrp->OSFlagFlags & flags); /* Extract only the bits we want */
0005a0 e1d400b8 LDRH r0,[r4,#8]
0005a4 e1c79000 BIC r9,r7,r0
;;;639 if (flags_rdy == flags) { /* Must match ALL the bits that we want */
0005a8 e1590007 CMP r9,r7
0005ac 1a00000f BNE |L1.1520|
|L1.1456|
;;;640 if (consume == OS_TRUE) { /* See if we need to consume the flags */
0005b0 e3560001 CMP r6,#1
0005b4 1a000001 BNE |L1.1472|
;;;641 pgrp->OSFlagFlags |= flags_rdy; /* Set ONLY the flags that we wanted */
;;;642 }
;;;643 OSTCBCur->OSTCBFlagsRdy = flags_rdy; /* Save flags that were ready */
;;;644 OS_EXIT_CRITICAL(); /* Yes, condition met, return to caller */
;;;645 *perr = OS_ERR_NONE;
;;;646 return (flags_rdy);
;;;647 } else { /* Block task until events occur or timeout */
;;;648 OS_FlagBlock(pgrp, &node, flags, wait_type, timeout);
;;;649 OS_EXIT_CRITICAL();
;;;650 }
;;;651 break;
;;;652
;;;653 case OS_FLAG_WAIT_CLR_ANY:
;;;654 flags_rdy = (OS_FLAGS)(~pgrp->OSFlagFlags & flags); /* Extract only the bits we want */
;;;655 if (flags_rdy != (OS_FLAGS)0) { /* See if any flag cleared */
;;;656 if (consume == OS_TRUE) { /* See if we need to consume the flags */
;;;657 pgrp->OSFlagFlags |= flags_rdy; /* Set ONLY the flags that we got */
0005b8 e1800009 ORR r0,r0,r9
|L1.1468|
0005bc e1c400b8 STRH r0,[r4,#8] ;608
|L1.1472|
;;;658 }
;;;659 OSTCBCur->OSTCBFlagsRdy = flags_rdy; /* Save flags that were ready */
0005c0 e59b0000 LDR r0,[r11,#0] ; OSTCBCur
0005c4 e1c092b8 STRH r9,[r0,#0x28]
;;;660 OS_EXIT_CRITICAL(); /* Yes, condition met, return to caller */
0005c8 e59d0004 LDR r0,[sp,#4]
0005cc ebfffffe BL OS_CPU_SR_Restore
;;;661 *perr = OS_ERR_NONE;
;;;662 return (flags_rdy);
0005d0 e1a00009 MOV r0,r9
0005d4 e5c5a000 STRB r10,[r5,#0] ;661
|L1.1496|
0005d8 e28dd02c ADD sp,sp,#0x2c
0005dc e8bd4ff0 POP {r4-r11,lr}
;;;663 } else { /* Block task until events occur or timeout */
;;;664 OS_FlagBlock(pgrp, &node, flags, wait_type, timeout);
;;;665 OS_EXIT_CRITICAL();
;;;666 }
;;;667 break;
;;;668 #endif
;;;669
;;;670 default:
;;;671 OS_EXIT_CRITICAL();
;;;672 flags_rdy = (OS_FLAGS)0;
;;;673 *perr = OS_ERR_FLAG_WAIT_TYPE;
;;;674 return (flags_rdy);
;;;675 }
;;;676 /*$PAGE*/
;;;677 OS_Sched(); /* Find next HPT ready to run */
;;;678 OS_ENTER_CRITICAL();
;;;679 if (OSTCBCur->OSTCBStatPend != OS_STAT_PEND_OK) { /* Have we timed-out or aborted? */
;;;680 pend_stat = OSTCBCur->OSTCBStatPend;
;;;681 OSTCBCur->OSTCBStatPend = OS_STAT_PEND_OK;
;;;682 OS_FlagUnlink(&node);
;;;683 OSTCBCur->OSTCBStat = OS_STAT_RDY; /* Yes, make task ready-to-run */
;;;684 OS_EXIT_CRITICAL();
;;;685 flags_rdy = (OS_FLAGS)0;
;;;686 switch (pend_stat) {
;;;687 case OS_STAT_PEND_TO:
;;;688 default:
;;;689 *perr = OS_ERR_TIMEOUT; /* Indicate that we timed-out waiting */
;;;690 break;
;;;691
;;;692 case OS_STAT_PEND_ABORT:
;;;693 *perr = OS_ERR_PEND_ABORT; /* Indicate that we aborted waiting */
;;;694 break;
;;;695 }
;;;696 return (flags_rdy);
;;;697 }
;;;698 flags_rdy = OSTCBCur->OSTCBFlagsRdy;
;;;699 if (consume == OS_TRUE) { /* See if we need to consume the flags */
;;;700 switch (wait_type) {
;;;701 case OS_FLAG_WAIT_SET_ALL:
;;;702 case OS_FLAG_WAIT_SET_ANY: /* Clear ONLY the flags we got */
;;;703 pgrp->OSFlagFlags &= ~flags_rdy;
;;;704 break;
;;;705
;;;706 #if OS_FLAG_WAIT_CLR_EN > 0
;;;707 case OS_FLAG_WAIT_CLR_ALL:
;;;708 case OS_FLAG_WAIT_CLR_ANY: /* Set ONLY the flags we got */
;;;709 pgrp->OSFlagFlags |= flags_rdy;
;;;710 break;
;;;711 #endif
;;;712 default:
;;;713 OS_EXIT_CRITICAL();
;;;714 *perr = OS_ERR_FLAG_WAIT_TYPE;
;;;715 return ((OS_FLAGS)0);
;;;716 }
;;;717 }
;;;718 OS_EXIT_CRITICAL();
;;;719 *perr = OS_ERR_NONE; /* Event(s) must have occurred */
;;;720 return (flags_rdy);
;;;721 }
0005e0 e12fff1e BX lr
|L1.1508|
0005e4 e1d400b8 LDRH r0,[r4,#8] ;654
0005e8 e1d79000 BICS r9,r7,r0 ;654
0005ec 1affffef BNE |L1.1456|
|L1.1520|
0005f0 e59d3028 LDR r3,[sp,#0x28] ;664
0005f4 e1a02007 MOV r2,r7 ;664
0005f8 e58d3000 STR r3,[sp,#0] ;664
0005fc e1a03008 MOV r3,r8 ;664
000600 e28d1008 ADD r1,sp,#8 ;664
000604 e1a00004 MOV r0,r4 ;664
000608 ebfffffe BL OS_FlagBlock
00060c e59d0004 LDR r0,[sp,#4] ;665
000610 ebfffffe BL OS_CPU_SR_Restore
000614 ebfffffe BL OS_Sched
000618 ebfffffe BL OS_CPU_SR_Save
00061c e1a0c000 MOV r12,r0 ;678
000620 e59b0000 LDR r0,[r11,#0] ;679 ; OSTCBCur
000624 e5d0702d LDRB r7,[r0,#0x2d] ;679
000628 e3570000 CMP r7,#0 ;679
00062c 0a000010 BEQ |L1.1652|
000630 e5c0a02d STRB r10,[r0,#0x2d] ;681
000634 e28d0008 ADD r0,sp,#8 ;682
000638 ebfffffe BL OS_FlagUnlink
00063c e59b0000 LDR r0,[r11,#0] ;683 ; OSTCBCur
000640 e5c0a02c STRB r10,[r0,#0x2c] ;683
000644 e1a0000c MOV r0,r12 ;684
000648 ebfffffe BL OS_CPU_SR_Restore
00064c e3570002 CMP r7,#2 ;686
000650 e3a00000 MOV r0,#0 ;685
000654 03a0100e MOVEQ r1,#0xe ;693
000658 13a0100a MOVNE r1,#0xa ;689
00065c ea000002 B |L1.1644|
|L1.1632|
000660 ebfffffe BL OS_CPU_SR_Restore
000664 e3a00000 MOV r0,#0 ;672
000668 e3a0106f MOV r1,#0x6f ;673
|L1.1644|
00066c e5c51000 STRB r1,[r5,#0] ;693
000670 eaffffd8 B |L1.1496|
|L1.1652|
000674 e1d072b8 LDRH r7,[r0,#0x28] ;698
000678 e3560001 CMP r6,#1 ;699
00067c 1a00000a BNE |L1.1708|
000680 e3580000 CMP r8,#0 ;700
000684 13580001 CMPNE r8,#1 ;700
000688 01d400b8 LDRHEQ r0,[r4,#8] ;709
00068c 01800007 ORREQ r0,r0,r7 ;709
000690 0a000004 BEQ |L1.1704|
000694 e3580002 CMP r8,#2 ;700
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -