📄 os_flag.src
字号:
; *err = OS_FLAG_INVALID_PGRP;
; return ((OS_FLAGS)0);
; }
; if (pgrp->OSFlagType != OS_EVENT_TYPE_FLAG) { /* Validate event block type */
; *err = OS_ERR_EVENT_TYPE;
; return ((OS_FLAGS)0);
; }
; #endif
; if (wait_type & OS_FLAG_CONSUME) { /* See if we need to consume the flags */
; wait_type &= ~OS_FLAG_CONSUME;
; consume = TRUE;
; } else {
; consume = FALSE;
; }
; /*$PAGE*/
; OS_ENTER_CRITICAL();
; switch (wait_type) {
; case OS_FLAG_WAIT_SET_ALL: /* See if all required flags are set */
; flags_rdy = pgrp->OSFlagFlags & flags; /* Extract only the bits we want */
; if (flags_rdy == flags) { /* Must match ALL the bits that we want */
; if (consume == TRUE) { /* See if we need to consume the flags */
; pgrp->OSFlagFlags &= ~flags_rdy; /* Clear ONLY the flags that we wanted */
; }
; flags_cur = pgrp->OSFlagFlags; /* Will return the state of the group */
; OS_EXIT_CRITICAL(); /* Yes, condition met, return to caller */
; *err = OS_NO_ERR;
; return (flags_cur);
; } else { /* Block task until events occur or timeout */
; OS_FlagBlock(pgrp, &node, flags, wait_type, timeout);
; OS_EXIT_CRITICAL();
; }
; break;
;
; case OS_FLAG_WAIT_SET_ANY:
; flags_rdy = pgrp->OSFlagFlags & flags; /* Extract only the bits we want */
; if (flags_rdy != (OS_FLAGS)0) { /* See if any flag set */
; if (consume == TRUE) { /* See if we need to consume the flags */
; pgrp->OSFlagFlags &= ~flags_rdy; /* Clear ONLY the flags that we got */
; }
; flags_cur = pgrp->OSFlagFlags; /* Will return the state of the group */
; OS_EXIT_CRITICAL(); /* Yes, condition met, return to caller */
; *err = OS_NO_ERR;
; return (flags_cur);
; } else { /* Block task until events occur or timeout */
; OS_FlagBlock(pgrp, &node, flags, wait_type, timeout);
; OS_EXIT_CRITICAL();
; }
; break;
;
; #if OS_FLAG_WAIT_CLR_EN > 0
; case OS_FLAG_WAIT_CLR_ALL: /* See if all required flags are cleared */
; flags_rdy = ~pgrp->OSFlagFlags & flags; /* Extract only the bits we want */
; if (flags_rdy == flags) { /* Must match ALL the bits that we want */
; if (consume == TRUE) { /* See if we need to consume the flags */
; pgrp->OSFlagFlags |= flags_rdy; /* Set ONLY the flags that we wanted */
; }
; flags_cur = pgrp->OSFlagFlags; /* Will return the state of the group */
; OS_EXIT_CRITICAL(); /* Yes, condition met, return to caller */
; *err = OS_NO_ERR;
; return (flags_cur);
; } else { /* Block task until events occur or timeout */
; OS_FlagBlock(pgrp, &node, flags, wait_type, timeout);
; OS_EXIT_CRITICAL();
; }
; break;
;
; case OS_FLAG_WAIT_CLR_ANY:
; flags_rdy = ~pgrp->OSFlagFlags & flags; /* Extract only the bits we want */
; if (flags_rdy != (OS_FLAGS)0) { /* See if any flag cleared */
; if (consume == TRUE) { /* See if we need to consume the flags */
; pgrp->OSFlagFlags |= flags_rdy; /* Set ONLY the flags that we got */
; }
; flags_cur = pgrp->OSFlagFlags; /* Will return the state of the group */
; OS_EXIT_CRITICAL(); /* Yes, condition met, return to caller */
; *err = OS_NO_ERR;
; return (flags_cur);
; } else { /* Block task until events occur or timeout */
; OS_FlagBlock(pgrp, &node, flags, wait_type, timeout);
; OS_EXIT_CRITICAL();
; }
; break;
; #endif
;
; default:
; OS_EXIT_CRITICAL();
; flags_cur = (OS_FLAGS)0;
; *err = OS_FLAG_ERR_WAIT_TYPE;
; return (flags_cur);
; }
; OS_Sched(); /* Find next HPT ready to run */
; OS_ENTER_CRITICAL();
; if (OSTCBCur->OSTCBStat & OS_STAT_FLAG) { /* Have we timed-out? */
; OS_FlagUnlink(&node);
; OSTCBCur->OSTCBStat = OS_STAT_RDY; /* Yes, make task ready-to-run */
; OS_EXIT_CRITICAL();
; flags_cur = (OS_FLAGS)0;
; *err = OS_TIMEOUT; /* Indicate that we timed-out waiting */
; } else {
; if (consume == TRUE) { /* See if we need to consume the flags */
; switch (wait_type) {
; case OS_FLAG_WAIT_SET_ALL:
; case OS_FLAG_WAIT_SET_ANY: /* Clear ONLY the flags we got */
; pgrp->OSFlagFlags &= ~OSTCBCur->OSTCBFlagsRdy;
; break;
;
; #if OS_FLAG_WAIT_CLR_EN > 0
; case OS_FLAG_WAIT_CLR_ALL:
; case OS_FLAG_WAIT_CLR_ANY: /* Set ONLY the flags we got */
; pgrp->OSFlagFlags |= OSTCBCur->OSTCBFlagsRdy;
; break;
; #endif
; }
; }
; flags_cur = pgrp->OSFlagFlags;
; OS_EXIT_CRITICAL();
; *err = OS_NO_ERR; /* Event(s) must have occurred */
; }
; return (flags_cur);
; }
; /*$PAGE*/
; /*
; *********************************************************************************************************
; * POST EVENT FLAG BIT(S)
; *
; * Description: This function is called to set or clear some bits in an event flag group. The bits to
; * set or clear are specified by a 'bit mask'.
; *
; * Arguments : pgrp is a pointer to the desired event flag group.
; *
; * flags If 'opt' (see below) is OS_FLAG_SET, each bit that is set in 'flags' will
; * set the corresponding bit in the event flag group. e.g. to set bits 0, 4
; * and 5 you would set 'flags' to:
; *
; * 0x31 (note, bit 0 is least significant bit)
; *
; * If 'opt' (see below) is OS_FLAG_CLR, each bit that is set in 'flags' will
; * CLEAR the corresponding bit in the event flag group. e.g. to clear bits 0,
; * 4 and 5 you would specify 'flags' as:
; *
; * 0x31 (note, bit 0 is least significant bit)
; *
; * opt indicates whether the flags will be:
; * set (OS_FLAG_SET) or
; * cleared (OS_FLAG_CLR)
; *
; * err is a pointer to an error code and can be:
; * OS_NO_ERR The call was successfull
; * OS_FLAG_INVALID_PGRP You passed a NULL pointer
; * OS_ERR_EVENT_TYPE You are not pointing to an event flag group
; * OS_FLAG_INVALID_OPT You specified an invalid option
; *
; * Returns : the new value of the event flags bits that are still set.
; *
; * Called From: Task or ISR
; *
; * WARNING(s) : 1) The execution time of this function depends on the number of tasks waiting on the event
; * flag group.
; * 2) The amount of time interrupts are DISABLED depends on the number of tasks waiting on
; * the event flag group.
; *********************************************************************************************************
; */
; OS_FLAGS OSFlagPost (OS_FLAG_GRP *pgrp, OS_FLAGS flags, INT8U opt, INT8U *err)LG_REENTRANT
; {
; #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
; OS_CPU_SR cpu_sr;
; #endif
; OS_FLAG_NODE *pnode;
; BOOLEAN sched;
; OS_FLAGS flags_cur;
; OS_FLAGS flags_rdy;
;
;
; #if OS_ARG_CHK_EN > 0
; if (pgrp == (OS_FLAG_GRP *)0) { /* Validate 'pgrp' */
; *err = OS_FLAG_INVALID_PGRP;
; return ((OS_FLAGS)0);
; }
; if (pgrp->OSFlagType != OS_EVENT_TYPE_FLAG) { /* Make sure we are pointing to an event flag grp */
; *err = OS_ERR_EVENT_TYPE;
; return ((OS_FLAGS)0);
; }
; #endif
; /*$PAGE*/
; OS_ENTER_CRITICAL();
; switch (opt) {
; case OS_FLAG_CLR:
; pgrp->OSFlagFlags &= ~flags; /* Clear the flags specified in the group */
; break;
;
; case OS_FLAG_SET:
; pgrp->OSFlagFlags |= flags; /* Set the flags specified in the group */
; break;
;
; default:
; OS_EXIT_CRITICAL(); /* INVALID option */
; *err = OS_FLAG_INVALID_OPT;
; return ((OS_FLAGS)0);
; }
; sched = FALSE; /* Indicate that we don't need rescheduling */
; pnode = (OS_FLAG_NODE *)pgrp->OSFlagWaitList;
; while (pnode != (OS_FLAG_NODE *)0) { /* Go through all tasks waiting on event flag(s) */
; switch (pnode->OSFlagNodeWaitType) {
; case OS_FLAG_WAIT_SET_ALL: /* See if all req. flags are set for current node */
; flags_rdy = pgrp->OSFlagFlags & pnode->OSFlagNodeFlags;
; if (flags_rdy == pnode->OSFlagNodeFlags) {
; if (OS_FlagTaskRdy(pnode, flags_rdy) == TRUE) { /* Make task RTR, event(s) Rx'd */
; sched = TRUE; /* When done we will reschedule */
; }
; }
; break;
;
; case OS_FLAG_WAIT_SET_ANY: /* See if any flag set */
; flags_rdy = pgrp->OSFlagFlags & pnode->OSFlagNodeFlags;
; if (flags_rdy != (OS_FLAGS)0) {
; if (OS_FlagTaskRdy(pnode, flags_rdy) == TRUE) { /* Make task RTR, event(s) Rx'd */
; sched = TRUE; /* When done we will reschedule */
; }
; }
; break;
;
; #if OS_FLAG_WAIT_CLR_EN > 0
; case OS_FLAG_WAIT_CLR_ALL: /* See if all req. flags are set for current node */
; flags_rdy = ~pgrp->OSFlagFlags & pnode->OSFlagNodeFlags;
; if (flags_rdy == pnode->OSFlagNodeFlags) {
; if (OS_FlagTaskRdy(pnode, flags_rdy) == TRUE) { /* Make task RTR, event(s) Rx'd */
; sched = TRUE; /* When done we will reschedule */
; }
; }
; break;
;
; case OS_FLAG_WAIT_CLR_ANY: /* See if any flag set */
; flags_rdy = ~pgrp->OSFlagFlags & pnode->OSFlagNodeFlags;
; if (flags_rdy != (OS_FLAGS)0) {
; if (OS_FlagTaskRdy(pnode, flags_rdy) == TRUE) { /* Make task RTR, event(s) Rx'd */
; sched = TRUE; /* When done we will reschedule */
; }
; }
; break;
; #endif
; }
; pnode = (OS_FLAG_NODE *)pnode->OSFlagNodeNext; /* Point to next task waiting for event flag(s) */
; }
; OS_EXIT_CRITICAL();
; if (sched == TRUE) {
; OS_Sched();
; }
; OS_ENTER_CRITICAL();
; flags_cur = pgrp->OSFlagFlags;
; OS_EXIT_CRITICAL();
; *err = OS_NO_ERR;
; return (flags_cur);
; }
; /*$PAGE*/
; /*
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -