📄 os_flag.txt
字号:
;;;482 #endif
;;;483 if (pgrp->OSFlagType != OS_EVENT_TYPE_FLAG) {
;;;484 OS_EXIT_CRITICAL();
;;;485 *err = OS_ERR_EVENT_TYPE;
;;;486 return;
;;;487 }
;;;488 len = OS_StrLen(pname); /* Can we fit the string in the storage area? */
;;;489 if (len > (OS_FLAG_NAME_SIZE - 1)) { /* No */
;;;490 OS_EXIT_CRITICAL();
;;;491 *err = OS_ERR_FLAG_NAME_TOO_LONG;
;;;492 return;
;;;493 }
;;;494 (void)OS_StrCopy(pgrp->OSFlagName, pname); /* Yes, copy name from OS_FLAG_GRP */
;;;495 OS_EXIT_CRITICAL();
;;;496 *err = OS_ERR_NONE;
;;;497 return;
;;;498 }
00062c e8bd41f0 POP {r4-r8,lr}
000630 e12fff1e BX lr
|L1.1588|
000634 e3540000 CMP r4,#0
000638 1a000004 BNE |L1.1616|
00063c e1a00008 MOV r0,r8
000640 ebfffffe BL OS_CPU_SR_Restore
000644 e3a0006e MOV r0,#0x6e
000648 e5c70000 STRB r0,[r7,#0]
00064c eafffff6 B |L1.1580|
|L1.1616|
000650 e3550000 CMP r5,#0
000654 1a000004 BNE |L1.1644|
000658 e1a00008 MOV r0,r8
00065c ebfffffe BL OS_CPU_SR_Restore
000660 e3a0000c MOV r0,#0xc
000664 e5c70000 STRB r0,[r7,#0]
000668 eaffffef B |L1.1580|
|L1.1644|
00066c e5d40000 LDRB r0,[r4,#0]
000670 e3500005 CMP r0,#5
000674 0a000004 BEQ |L1.1676|
000678 e1a00008 MOV r0,r8
00067c ebfffffe BL OS_CPU_SR_Restore
000680 e3a00001 MOV r0,#1
000684 e5c70000 STRB r0,[r7,#0]
000688 eaffffe7 B |L1.1580|
|L1.1676|
00068c e1a00005 MOV r0,r5
000690 ebfffffe BL OS_StrLen
000694 e1a06000 MOV r6,r0
000698 e356000f CMP r6,#0xf
00069c da000004 BLE |L1.1716|
0006a0 e1a00008 MOV r0,r8
0006a4 ebfffffe BL OS_CPU_SR_Restore
0006a8 e3a00073 MOV r0,#0x73
0006ac e5c70000 STRB r0,[r7,#0]
0006b0 eaffffdd B |L1.1580|
|L1.1716|
0006b4 e1a01005 MOV r1,r5
0006b8 e284000a ADD r0,r4,#0xa
0006bc ebfffffe BL OS_StrCopy
0006c0 e1a00008 MOV r0,r8
0006c4 ebfffffe BL OS_CPU_SR_Restore
0006c8 e3a00000 MOV r0,#0
0006cc e5c70000 STRB r0,[r7,#0]
0006d0 eaffffd5 B |L1.1580|
ENDP
OS_FlagBlock PROC
;;;984 static void OS_FlagBlock (OS_FLAG_GRP *pgrp, OS_FLAG_NODE *pnode, OS_FLAGS flags, INT8U wait_type, INT16U timeout)
;;;985 {
0006d4 e92d4070 PUSH {r4-r6,lr}
0006d8 e59de010 LDR lr,[sp,#0x10]
;;;986 OS_FLAG_NODE *pnode_next;
;;;987 INT8U y;
;;;988
;;;989
;;;990 OSTCBCur->OSTCBStat |= OS_STAT_FLAG;
0006dc e59f5890 LDR r5,|L1.3956|
0006e0 e5955000 LDR r5,[r5,#0] ; OSTCBCur
0006e4 e5d5502c LDRB r5,[r5,#0x2c]
0006e8 e3855020 ORR r5,r5,#0x20
0006ec e59f6880 LDR r6,|L1.3956|
0006f0 e5966000 LDR r6,[r6,#0] ; OSTCBCur
0006f4 e5c6502c STRB r5,[r6,#0x2c]
;;;991 OSTCBCur->OSTCBStatPend = OS_STAT_PEND_OK;
0006f8 e3a05000 MOV r5,#0
0006fc e59f6870 LDR r6,|L1.3956|
000700 e5966000 LDR r6,[r6,#0] ; OSTCBCur
000704 e5c6502d STRB r5,[r6,#0x2d]
;;;992 OSTCBCur->OSTCBDly = timeout; /* Store timeout in task's TCB */
000708 e59f5864 LDR r5,|L1.3956|
00070c e5955000 LDR r5,[r5,#0] ; OSTCBCur
000710 e1c5e2ba STRH lr,[r5,#0x2a]
;;;993 #if OS_TASK_DEL_EN > 0
;;;994 OSTCBCur->OSTCBFlagNode = pnode; /* TCB to link to node */
000714 e59f5858 LDR r5,|L1.3956|
000718 e5955000 LDR r5,[r5,#0] ; OSTCBCur
00071c e5851024 STR r1,[r5,#0x24]
;;;995 #endif
;;;996 pnode->OSFlagNodeFlags = flags; /* Save the flags that we need to wait for */
000720 e1c121b0 STRH r2,[r1,#0x10]
;;;997 pnode->OSFlagNodeWaitType = wait_type; /* Save the type of wait we are doing */
000724 e5c13012 STRB r3,[r1,#0x12]
;;;998 pnode->OSFlagNodeTCB = (void *)OSTCBCur; /* Link to task's TCB */
000728 e59f5844 LDR r5,|L1.3956|
00072c e5955000 LDR r5,[r5,#0] ; OSTCBCur
000730 e5815008 STR r5,[r1,#8]
;;;999 pnode->OSFlagNodeNext = pgrp->OSFlagWaitList; /* Add node at beginning of event flag wait list */
000734 e5905004 LDR r5,[r0,#4]
000738 e5815000 STR r5,[r1,#0]
;;;1000 pnode->OSFlagNodePrev = (void *)0;
00073c e3a05000 MOV r5,#0
000740 e5815004 STR r5,[r1,#4]
;;;1001 pnode->OSFlagNodeFlagGrp = (void *)pgrp; /* Link to Event Flag Group */
000744 e581000c STR r0,[r1,#0xc]
;;;1002 pnode_next = (OS_FLAG_NODE *)pgrp->OSFlagWaitList;
000748 e5904004 LDR r4,[r0,#4]
;;;1003 if (pnode_next != (void *)0) { /* Is this the first NODE to insert? */
00074c e3540000 CMP r4,#0
000750 0a000000 BEQ |L1.1880|
;;;1004 pnode_next->OSFlagNodePrev = pnode; /* No, link in doubly linked list */
000754 e5841004 STR r1,[r4,#4]
|L1.1880|
;;;1005 }
;;;1006 pgrp->OSFlagWaitList = (void *)pnode;
000758 e5801004 STR r1,[r0,#4]
;;;1007
;;;1008 y = OSTCBCur->OSTCBY; /* Suspend current task until flag(s) received */
00075c e59f5810 LDR r5,|L1.3956|
000760 e5955000 LDR r5,[r5,#0] ; OSTCBCur
000764 e5d5c030 LDRB r12,[r5,#0x30]
;;;1009 OSRdyTbl[y] &= ~OSTCBCur->OSTCBBitX;
000768 e59f5800 LDR r5,|L1.3952|
00076c e7d5500c LDRB r5,[r5,r12]
000770 e59f67fc LDR r6,|L1.3956|
000774 e5966000 LDR r6,[r6,#0] ; OSTCBCur
000778 e5d66031 LDRB r6,[r6,#0x31]
00077c e1c55006 BIC r5,r5,r6
000780 e59f67e8 LDR r6,|L1.3952|
000784 e7c6500c STRB r5,[r6,r12]
;;;1010 if (OSRdyTbl[y] == 0x00) {
000788 e2865000 ADD r5,r6,#0
00078c e7d5500c LDRB r5,[r5,r12]
000790 e3550000 CMP r5,#0
000794 1a000007 BNE |L1.1976|
;;;1011 OSRdyGrp &= ~OSTCBCur->OSTCBBitY;
000798 e59f57d4 LDR r5,|L1.3956|
00079c e5955000 LDR r5,[r5,#0] ; OSTCBCur
0007a0 e5d55032 LDRB r5,[r5,#0x32]
0007a4 e59f67c0 LDR r6,|L1.3948|
0007a8 e5d66000 LDRB r6,[r6,#0] ; OSRdyGrp
0007ac e1c65005 BIC r5,r6,r5
0007b0 e59f67b4 LDR r6,|L1.3948|
0007b4 e5c65000 STRB r5,[r6,#0] ; OSRdyGrp
|L1.1976|
;;;1012 }
;;;1013 }
0007b8 e8bd4070 POP {r4-r6,lr}
0007bc e12fff1e BX lr
ENDP
OSFlagPend PROC
;;;556 OS_FLAGS OSFlagPend (OS_FLAG_GRP *pgrp, OS_FLAGS flags, INT8U wait_type, INT16U timeout, INT8U *err)
;;;557 {
0007c0 e92d4ff0 PUSH {r4-r11,lr}
0007c4 e24dd024 SUB sp,sp,#0x24
0007c8 e1a04000 MOV r4,r0
0007cc e1a05001 MOV r5,r1
0007d0 e1a06002 MOV r6,r2
0007d4 e1a07003 MOV r7,r3
0007d8 e59d8048 LDR r8,[sp,#0x48]
;;;558 OS_FLAG_NODE node;
;;;559 OS_FLAGS flags_rdy;
;;;560 INT8U result;
;;;561 INT8U pend_stat;
;;;562 BOOLEAN consume;
;;;563 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;564 OS_CPU_SR cpu_sr = 0;
0007dc e3a00000 MOV r0,#0
0007e0 e58d0008 STR r0,[sp,#8]
;;;565 #endif
;;;566
;;;567
;;;568
;;;569 #if OS_ARG_CHK_EN > 0
;;;570 if (err == (INT8U *)0) { /* Validate 'err' */
0007e4 e3580000 CMP r8,#0
0007e8 1a000003 BNE |L1.2044|
;;;571 return ((OS_FLAGS)0);
0007ec e3a00000 MOV r0,#0
|L1.2032|
0007f0 e28dd024 ADD sp,sp,#0x24
0007f4 e8bd4ff0 POP {r4-r11,lr}
;;;572 }
;;;573 if (pgrp == (OS_FLAG_GRP *)0) { /* Validate 'pgrp' */
;;;574 *err = OS_ERR_FLAG_INVALID_PGRP;
;;;575 return ((OS_FLAGS)0);
;;;576 }
;;;577 #endif
;;;578 if (OSIntNesting > 0) { /* See if called from ISR ... */
;;;579 *err = OS_ERR_PEND_ISR; /* ... can't PEND from an ISR */
;;;580 return ((OS_FLAGS)0);
;;;581 }
;;;582 if (OSLockNesting > 0) { /* See if called with scheduler locked ... */
;;;583 *err = OS_ERR_PEND_LOCKED; /* ... can't PEND when locked */
;;;584 return ((OS_FLAGS)0);
;;;585 }
;;;586 if (pgrp->OSFlagType != OS_EVENT_TYPE_FLAG) { /* Validate event block type */
;;;587 *err = OS_ERR_EVENT_TYPE;
;;;588 return ((OS_FLAGS)0);
;;;589 }
;;;590 result = (INT8U)(wait_type & OS_FLAG_CONSUME);
;;;591 if (result != (INT8U)0) { /* See if we need to consume the flags */
;;;592 wait_type &= ~(INT8U)OS_FLAG_CONSUME;
;;;593 consume = OS_TRUE;
;;;594 } else {
;;;595 consume = OS_FALSE;
;;;596 }
;;;597 /*$PAGE*/
;;;598 OS_ENTER_CRITICAL();
;;;599 switch (wait_type) {
;;;600 case OS_FLAG_WAIT_SET_ALL: /* See if all required flags are set */
;;;601 flags_rdy = (OS_FLAGS)(pgrp->OSFlagFlags & flags); /* Extract only the bits we want */
;;;602 if (flags_rdy == flags) { /* Must match ALL the bits that we want */
;;;603 if (consume == OS_TRUE) { /* See if we need to consume the flags */
;;;604 pgrp->OSFlagFlags &= ~flags_rdy; /* Clear ONLY the flags that we wanted */
;;;605 }
;;;606 OSTCBCur->OSTCBFlagsRdy = flags_rdy; /* Save flags that were ready */
;;;607 OS_EXIT_CRITICAL(); /* Yes, condition met, return to caller */
;;;608 *err = OS_ERR_NONE;
;;;609 return (flags_rdy);
;;;610 } else { /* Block task until events occur or timeout */
;;;611 OS_FlagBlock(pgrp, &node, flags, wait_type, timeout);
;;;612 OS_EXIT_CRITICAL();
;;;613 }
;;;614 break;
;;;615
;;;616 case OS_FLAG_WAIT_SET_ANY:
;;;617 flags_rdy = (OS_FLAGS)(pgrp->OSFlagFlags & flags); /* Extract only the bits we want */
;;;618 if (flags_rdy != (OS_FLAGS)0) { /* See if any flag set */
;;;619 if (consume == OS_TRUE) { /* See if we need to consume the flags */
;;;620 pgrp->OSFlagFlags &= ~flags_rdy; /* Clear ONLY the flags that we got */
;;;621 }
;;;622 OSTCBCur->OSTCBFlagsRdy = flags_rdy; /* Save flags that were ready */
;;;623 OS_EXIT_CRITICAL(); /* Yes, condition met, return to caller */
;;;624 *err = OS_ERR_NONE;
;;;625 return (flags_rdy);
;;;626 } else { /* Block task until events occur or timeout */
;;;627 OS_FlagBlock(pgrp, &node, flags, wait_type, timeout);
;;;628 OS_EXIT_CRITICAL();
;;;629 }
;;;630 break;
;;;631
;;;632 #if OS_FLAG_WAIT_CLR_EN > 0
;;;633 case OS_FLAG_WAIT_CLR_ALL: /* See if all required flags are cleared */
;;;634 flags_rdy = (OS_FLAGS)(~pgrp->OSFlagFlags & flags); /* Extract only the bits we want */
;;;635 if (flags_rdy == flags) { /* Must match ALL the bits that we want */
;;;636 if (consume == OS_TRUE) { /* See if we need to consume the flags */
;;;637 pgrp->OSFlagFlags |= flags_rdy; /* Set ONLY the flags that we wanted */
;;;638 }
;;;639 OSTCBCur->OSTCBFlagsRdy = flags_rdy; /* Save flags that were ready */
;;;640 OS_EXIT_CRITICAL(); /* Yes, condition met, return to caller */
;;;641 *err = OS_ERR_NONE;
;;;642 return (flags_rdy);
;;;643 } else { /* Block task until events occur or timeout */
;;;644 OS_FlagBlock(pgrp, &node, flags, wait_type, timeout);
;;;645 OS_EXIT_CRITICAL();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -