📄 os_flag.txt
字号:
000302 f844f844 STR r1,[r4],#-0x28
;;;999 #endif
;;;1000 pnode->OSFlagNodeFlags = flags; /* Save the flags that we need to wait for */
000306 820a STRH r2,[r1,#0x10]
;;;1001 pnode->OSFlagNodeWaitType = wait_type; /* Save the type of wait we are doing */
000308 748b STRB r3,[r1,#0x12]
;;;1002 pnode->OSFlagNodeTCB = (void *)OSTCBCur; /* Link to task's TCB */
00030a 608c STR r4,[r1,#8]
;;;1003 pnode->OSFlagNodeNext = pgrp->OSFlagWaitList; /* Add node at beginning of event flag wait list */
00030c 6842 LDR r2,[r0,#4]
00030e 600a STR r2,[r1,#0]
;;;1004 pnode->OSFlagNodePrev = (void *)0;
000310 604e STR r6,[r1,#4]
;;;1005 pnode->OSFlagNodeFlagGrp = (void *)pgrp; /* Link to Event Flag Group */
000312 60c8 STR r0,[r1,#0xc]
;;;1006 pnode_next = (OS_FLAG_NODE *)pgrp->OSFlagWaitList;
000314 6842 LDR r2,[r0,#4]
;;;1007 if (pnode_next != (void *)0) { /* Is this the first NODE to insert? */
000316 b102 CBZ r2,|L1.794|
;;;1008 pnode_next->OSFlagNodePrev = pnode; /* No, link in doubly linked list */
000318 6051 STR r1,[r2,#4]
|L1.794|
;;;1009 }
;;;1010 pgrp->OSFlagWaitList = (void *)pnode;
00031a 6041 STR r1,[r0,#4]
;;;1011
;;;1012 y = OSTCBCur->OSTCBY; /* Suspend current task until flag(s) received */
00031c 6829 LDR r1,[r5,#0] ; OSTCBCur
00031e f891f891 LDRB r0,[r1,#0x34]
;;;1013 OSRdyTbl[y] &= ~OSTCBCur->OSTCBBitX;
000322 4a65 LDR r2,|L1.1208|
000324 f891f891 LDRB r4,[r1,#0x35]
000328 5c13 LDRB r3,[r2,r0]
00032a 43a3 BICS r3,r3,r4
00032c 5413 STRB r3,[r2,r0]
;;;1014 if (OSRdyTbl[y] == 0x00) {
00032e 5c10 LDRB r0,[r2,r0]
000330 2800 CMP r0,#0
000332 d105 BNE |L1.832|
;;;1015 OSRdyGrp &= ~OSTCBCur->OSTCBBitY;
000334 f891f891 LDRB r2,[r1,#0x36]
000338 495e LDR r1,|L1.1204|
00033a 7808 LDRB r0,[r1,#0] ; OSRdyGrp
00033c 4390 BICS r0,r0,r2
00033e 7008 STRB r0,[r1,#0] ; OSRdyGrp
|L1.832|
;;;1016 }
;;;1017 }
000340 bdf0 POP {r4-r7,pc}
;;;1018
ENDP
OSFlagPend PROC
;;;560 OS_FLAGS OSFlagPend (OS_FLAG_GRP *pgrp, OS_FLAGS flags, INT8U wait_type, INT16U timeout, INT8U *perr)
;;;561 {
000342 e92de92d PUSH {r0-r11,lr}
000346 b087 SUB sp,sp,#0x1c
000348 9d14 LDR r5,[sp,#0x50]
00034a 4604 MOV r4,r0
00034c 460f MOV r7,r1
00034e 4691 MOV r9,r2
;;;562 OS_FLAG_NODE node;
;;;563 OS_FLAGS flags_rdy;
;;;564 INT8U result;
;;;565 INT8U pend_stat;
;;;566 BOOLEAN consume;
;;;567 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;568 OS_CPU_SR cpu_sr = 0;
;;;569 #endif
;;;570
;;;571
;;;572
;;;573 #if OS_ARG_CHK_EN > 0
;;;574 if (perr == (INT8U *)0) { /* Validate 'perr' */
;;;575 return ((OS_FLAGS)0);
;;;576 }
;;;577 if (pgrp == (OS_FLAG_GRP *)0) { /* Validate 'pgrp' */
;;;578 *perr = OS_ERR_FLAG_INVALID_PGRP;
;;;579 return ((OS_FLAGS)0);
;;;580 }
;;;581 #endif
;;;582 if (OSIntNesting > 0) { /* See if called from ISR ... */
000350 4856 LDR r0,|L1.1196|
000352 7800 LDRB r0,[r0,#0] ; OSIntNesting
000354 b128 CBZ r0,|L1.866|
;;;583 *perr = OS_ERR_PEND_ISR; /* ... can't PEND from an ISR */
000356 2002 MOVS r0,#2
000358 7028 STRB r0,[r5,#0]
;;;584 return ((OS_FLAGS)0);
00035a 2000 MOVS r0,#0
|L1.860|
;;;585 }
;;;586 if (OSLockNesting > 0) { /* See if called with scheduler locked ... */
;;;587 *perr = OS_ERR_PEND_LOCKED; /* ... can't PEND when locked */
;;;588 return ((OS_FLAGS)0);
;;;589 }
;;;590 if (pgrp->OSFlagType != OS_EVENT_TYPE_FLAG) { /* Validate event block type */
;;;591 *perr = OS_ERR_EVENT_TYPE;
;;;592 return ((OS_FLAGS)0);
;;;593 }
;;;594 result = (INT8U)(wait_type & OS_FLAG_CONSUME);
;;;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;
;;;600 }
;;;601 /*$PAGE*/
;;;602 OS_ENTER_CRITICAL();
;;;603 switch (wait_type) {
;;;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 */
;;;622 if (flags_rdy != (OS_FLAGS)0) { /* See if any flag set */
;;;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 */
;;;639 if (flags_rdy == flags) { /* Must match ALL the bits that we want */
;;;640 if (consume == OS_TRUE) { /* See if we need to consume the flags */
;;;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 */
;;;658 }
;;;659 OSTCBCur->OSTCBFlagsRdy = flags_rdy; /* Save flags that were ready */
;;;660 OS_EXIT_CRITICAL(); /* Yes, condition met, return to caller */
;;;661 *perr = OS_ERR_NONE;
;;;662 return (flags_rdy);
;;;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_ABORT:
;;;688 *perr = OS_ERR_PEND_ABORT; /* Indicate that we aborted waiting */
;;;689 break;
;;;690
;;;691 case OS_STAT_PEND_TO:
;;;692 default:
;;;693 *perr = OS_ERR_TIMEOUT; /* Indicate that we timed-out 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 }
00035c b00b ADD sp,sp,#0x2c
00035e e8bde8bd POP {r4-r11,pc}
|L1.866|
000362 4857 LDR r0,|L1.1216|
000364 7800 LDRB r0,[r0,#0] ;586 ; OSLockNesting
000366 b118 CBZ r0,|L1.880|
000368 200d MOVS r0,#0xd ;587
00036a 7028 STRB r0,[r5,#0] ;587
00036c 2000 MOVS r0,#0 ;588
00036e e7f5 B |L1.860|
|L1.880|
000370 7820 LDRB r0,[r4,#0] ;590
000372 2805 CMP r0,#5 ;590
000374 d003 BEQ |L1.894|
000376 2001 MOVS r0,#1 ;591
000378 7028 STRB r0,[r5,#0] ;591
00037a 2000 MOVS r0,#0 ;592
00037c e7ee B |L1.860|
|L1.894|
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -