📄 os_flag.txt
字号:
00052e 8128 STRH r0,[r5,#8]
|L1.1328|
;;;642 }
;;;643 OSTCBCur->OSTCBFlagsRdy = flags_rdy; /* Save flags that were ready */
000530 f8daf8da LDR r0,[r10,#0] ; OSTCBCur
000534 f8a0f8a0 STRH r11,[r0,#0x28]
;;;644 OS_EXIT_CRITICAL(); /* Yes, condition met, return to caller */
000538 9801 LDR r0,[sp,#4]
00053a f7fff7ff BL OS_CPU_SR_Restore
;;;645 *perr = OS_ERR_NONE;
00053e f884f884 STRB r9,[r4,#0]
;;;646 return (flags_rdy);
000542 4658 MOV r0,r11
000544 e7c3 B |L1.1230|
|L1.1350|
;;;647 } else { /* Block task until events occur or timeout */
;;;648 OS_FlagBlock(pgrp, &node, flags, wait_type, timeout);
000546 9b0a LDR r3,[sp,#0x28]
000548 9300 STR r3,[sp,#0]
00054a 4643 MOV r3,r8
00054c 463a MOV r2,r7
00054e a902 ADD r1,sp,#8
000550 4628 MOV r0,r5
000552 f7fff7ff BL OS_FlagBlock
;;;649 OS_EXIT_CRITICAL();
000556 9801 LDR r0,[sp,#4]
000558 f7fff7ff BL OS_CPU_SR_Restore
00055c e022 B |L1.1444|
00055e e000 B |L1.1378|
|L1.1376|
000560 e03f B |L1.1506|
|L1.1378|
;;;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 */
000562 8928 LDRH r0,[r5,#8]
000564 ea27ea27 BIC r11,r7,r0
;;;655 if (flags_rdy != (OS_FLAGS)0) { /* See if any flag cleared */
000568 f1bbf1bb CMP r11,#0
00056c d00f BEQ |L1.1422|
;;;656 if (consume == OS_TRUE) { /* See if we need to consume the flags */
00056e 2e01 CMP r6,#1
000570 d102 BNE |L1.1400|
;;;657 pgrp->OSFlagFlags |= flags_rdy; /* Set ONLY the flags that we got */
000572 ea40ea40 ORR r0,r0,r11
000576 8128 STRH r0,[r5,#8]
|L1.1400|
;;;658 }
;;;659 OSTCBCur->OSTCBFlagsRdy = flags_rdy; /* Save flags that were ready */
000578 f8daf8da LDR r0,[r10,#0] ; OSTCBCur
00057c f8a0f8a0 STRH r11,[r0,#0x28]
;;;660 OS_EXIT_CRITICAL(); /* Yes, condition met, return to caller */
000580 9801 LDR r0,[sp,#4]
000582 f7fff7ff BL OS_CPU_SR_Restore
;;;661 *perr = OS_ERR_NONE;
000586 f884f884 STRB r9,[r4,#0]
;;;662 return (flags_rdy);
00058a 4658 MOV r0,r11
00058c e79f B |L1.1230|
|L1.1422|
;;;663 } else { /* Block task until events occur or timeout */
;;;664 OS_FlagBlock(pgrp, &node, flags, wait_type, timeout);
00058e 9b0a LDR r3,[sp,#0x28]
000590 9300 STR r3,[sp,#0]
000592 4643 MOV r3,r8
000594 463a MOV r2,r7
000596 a902 ADD r1,sp,#8
000598 4628 MOV r0,r5
00059a f7fff7ff BL OS_FlagBlock
;;;665 OS_EXIT_CRITICAL();
00059e 9801 LDR r0,[sp,#4]
0005a0 f7fff7ff BL OS_CPU_SR_Restore
|L1.1444|
;;;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 */
0005a4 f7fff7ff BL OS_Sched
;;;678 OS_ENTER_CRITICAL();
0005a8 f7fff7ff BL OS_CPU_SR_Save
0005ac 4607 MOV r7,r0
;;;679 if (OSTCBCur->OSTCBStatPend != OS_STAT_PEND_OK) { /* Have we timed-out or aborted? */
0005ae f8daf8da LDR r0,[r10,#0] ; OSTCBCur
0005b2 f890f890 LDRB r11,[r0,#0x2d]
0005b6 f1bbf1bb CMP r11,#0
0005ba d01c BEQ |L1.1526|
;;;680 pend_stat = OSTCBCur->OSTCBStatPend;
;;;681 OSTCBCur->OSTCBStatPend = OS_STAT_PEND_OK;
0005bc f880f880 STRB r9,[r0,#0x2d]
;;;682 OS_FlagUnlink(&node);
0005c0 a802 ADD r0,sp,#8
0005c2 f7fff7ff BL OS_FlagUnlink
;;;683 OSTCBCur->OSTCBStat = OS_STAT_RDY; /* Yes, make task ready-to-run */
0005c6 f8daf8da LDR r0,[r10,#0] ; OSTCBCur
0005ca f880f880 STRB r9,[r0,#0x2c]
;;;684 OS_EXIT_CRITICAL();
0005ce 4638 MOV r0,r7
0005d0 f7fff7ff BL OS_CPU_SR_Restore
;;;685 flags_rdy = (OS_FLAGS)0;
0005d4 2000 MOVS r0,#0
;;;686 switch (pend_stat) {
0005d6 f1bbf1bb CMP r11,#2
0005da d009 BEQ |L1.1520|
;;;687 case OS_STAT_PEND_TO:
;;;688 default:
;;;689 *perr = OS_ERR_TIMEOUT; /* Indicate that we timed-out waiting */
0005dc 210a MOVS r1,#0xa
0005de 7021 STRB r1,[r4,#0]
;;;690 break;
0005e0 e775 B |L1.1230|
|L1.1506|
0005e2 9801 LDR r0,[sp,#4]
0005e4 f7fff7ff BL OS_CPU_SR_Restore
0005e8 2000 MOVS r0,#0
0005ea 216f MOVS r1,#0x6f
0005ec 7021 STRB r1,[r4,#0]
0005ee e76e B |L1.1230|
|L1.1520|
;;;691
;;;692 case OS_STAT_PEND_ABORT:
;;;693 *perr = OS_ERR_PEND_ABORT; /* Indicate that we aborted waiting */
0005f0 210e MOVS r1,#0xe
0005f2 7021 STRB r1,[r4,#0]
;;;694 break;
0005f4 e76b B |L1.1230|
|L1.1526|
;;;695 }
;;;696 return (flags_rdy);
;;;697 }
;;;698 flags_rdy = OSTCBCur->OSTCBFlagsRdy;
0005f6 f8b0f8b0 LDRH r10,[r0,#0x28]
;;;699 if (consume == OS_TRUE) { /* See if we need to consume the flags */
0005fa 2e01 CMP r6,#1
0005fc d114 BNE |L1.1576|
;;;700 switch (wait_type) {
0005fe f1b8f1b8 CMP r8,#0
000602 d00d BEQ |L1.1568|
000604 f1b8f1b8 CMP r8,#1
000608 d00a BEQ |L1.1568|
00060a f1b8f1b8 CMP r8,#2
00060e d002 BEQ |L1.1558|
000610 f1b8f1b8 CMP r8,#3
000614 d10f BNE |L1.1590|
|L1.1558|
;;;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;
000616 8928 LDRH r0,[r5,#8]
000618 ea20ea20 BIC r0,r0,r10
00061c 8128 STRH r0,[r5,#8]
;;;704 break;
00061e e003 B |L1.1576|
|L1.1568|
;;;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;
000620 8928 LDRH r0,[r5,#8]
000622 ea40ea40 ORR r0,r0,r10
000626 8128 STRH r0,[r5,#8]
|L1.1576|
000628 4638 MOV r0,r7
00062a f7fff7ff BL OS_CPU_SR_Restore
00062e f884f884 STRB r9,[r4,#0]
000632 4650 MOV r0,r10
;;;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);
000634 e74b B |L1.1230|
|L1.1590|
000636 4638 MOV r0,r7
000638 f7fff7ff BL OS_CPU_SR_Restore
00063c 206f MOVS r0,#0x6f
00063e 7020 STRB r0,[r4,#0]
000640 2000 MOVS r0,#0
000642 e744 B |L1.1230|
;;;721 }
;;;722 /*$PAGE*/
ENDP
OSFlagPendGetFlagsRdy PROC
;;;738 OS_FLAGS OSFlagPendGetFlagsRdy (void)
;;;739 {
000644 b510 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();
000646 f7fff7ff BL OS_CPU_SR_Save
;;;748 flags = OSTCBCur->OSTCBFlagsRdy;
00064a 4965 LDR r1,|L1.2016|
00064c 6809 LDR r1,[r1,#0] ; OSTCBCur
00064e 8d0c LDRH r4,[r1,#0x28]
;;;749 OS_EXIT_CRITICAL();
000650 f7fff7ff BL OS_CPU_SR_Restore
;;;750 return (flags);
000654 4620 MOV r0,r4
;;;751 }
000656 bd10 POP {r4,pc}
;;;752
ENDP
OSFlagPost PROC
;;;795 OS_FLAGS OSFlagPost (OS_FLAG_GRP *pgrp, OS_FLAGS flags, INT8U opt, INT8U *perr)
;;;796 {
000658 e92de92d PUSH {r4-r8,lr}
00065c 4605 MOV r5,r0
00065e 460e MOV r6,r1
000660 4614 MOV r4,r2
000662 461f MOV r7,r3
;;;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' */
000664 b917 CBNZ r7,|L1.1644|
;;;810 return ((OS_FLAGS)0);
000666 2000 MOVS r0,#0
000668 e8bde8bd POP {r4-r8,pc}
|L1.1644|
;;;811 }
;;;812 if (pgrp == (OS_FLAG_GRP *)0) { /* Validate 'pgrp' */
00066c b925 CBNZ r5,|L1.1656|
;;;813 *perr = OS_ERR_FLAG_INVALID_PGRP;
00066e 206e MOVS r0,#0x6e
000670 7038 STRB r0,[r7,#0]
;;;814 return ((OS_FLAGS)0);
000672 2000 MOVS r0,#0
000674 e8bde8bd POP {r4-r8,pc}
|L1.1656|
;;;815 }
;;;816 #endif
;;;817 if (pgrp->OSFlagType != OS_EVENT_TYPE_FLAG) { /* Make sure we are poi
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -