μC/OS-II—Event flag group management 2 (os_flag.c)

Directory

    • Event flag group flag is set or cleared to 0
    • event flag group get/no wait
    • Event flag group status query
    • Set event flag group naming
    • Get event flag group naming

The event flag group flag is set to 1 or cleared to 0

  • Set event flag bit: You can set or clear the specified flag bit. If a task waiting for the event flag group happens to be satisfied after setting the flag bit, the task will switch to the ready state.
  • pgrp: pointer to the event flag group, the return value of OSFlagCreate(); Flags: specify the flag bit that needs to be set, and the set bit will be set; opt: setting method: OS_FLAG_CLR: clear the specified flag bit to 0; OS_FLAG_SET: set Flag bit.
OS_FLAGS OSFlagPost (OS_FLAG_GRP *pgrp,
OS_FLAGS flags,
INT8U opt,
INT8U *perr)
{<!-- -->
OS_FLAG_NODE *pnode;
BOOLEAN scheduled;
OS_FLAGS flags_cur;
OS_FLAGS flags_rdy;
BOOLEAN rdy;
#if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */
OS_CPU_SR cpu_sr = 0u;
#endif
#ifdef OS_SAFETY_CRITICAL
\t
if (perr == (INT8U *)0)
{<!-- -->
OS_SAFETY_CRITICAL_EXCEPTION();
return ((OS_FLAGS)0);
}
\t
#endif
#if OS_ARG_CHK_EN > 0u
\t
if (pgrp == (OS_FLAG_GRP *)0) /* Validate 'pgrp' */
{<!-- -->
*perr = OS_ERR_FLAG_INVALID_PGRP;
return ((OS_FLAGS)0);
}
\t
#endif
\t
if (pgrp->OSFlagType != OS_EVENT_TYPE_FLAG) /* Make sure we are pointing to an event flag grp */
{<!-- -->
*perr = OS_ERR_EVENT_TYPE;
return ((OS_FLAGS)0);
}
\t
/*$PAGE*/
OS_ENTER_CRITICAL();
\t
switch (opt)
{<!-- -->
case OS_FLAG_CLR:
pgrp->OSFlagFlags & amp;= (OS_FLAGS)~flags; /* Clear the flags specified in the group */
break;
\t\t\t
case OS_FLAG_SET:
pgrp->OSFlagFlags |= flags; /* Set the flags specified in the group */
break;
\t\t\t
default:
OS_EXIT_CRITICAL(); /* INVALID option */
*perr = OS_ERR_FLAG_INVALID_OPT;
return ((OS_FLAGS)0);
}
\t
sched = OS_FALSE; /* Indicate that we don't need rescheduling */
pnode = (OS_FLAG_NODE *)pgrp->OSFlagWaitList;
\t
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 = (OS_FLAGS) (pgrp->OSFlagFlags & amp; pnode->OSFlagNodeFlags);
\t\t\t\t
if (flags_rdy == pnode->OSFlagNodeFlags) /* Make task RTR, event(s) Rx'd */
{<!-- -->
rdy = OS_FlagTaskRdy (pnode, flags_rdy, OS_STAT_PEND_OK);
\t\t\t\t\t
if (rdy == OS_TRUE)
{<!-- -->
sched = OS_TRUE; /* When done we will reschedule */
}
}
\t\t\t\t
break;
\t\t\t\t
case OS_FLAG_WAIT_SET_ANY: /* See if any flag set */
flags_rdy = (OS_FLAGS) (pgrp->OSFlagFlags & amp; pnode->OSFlagNodeFlags);
\t\t\t\t
if (flags_rdy != (OS_FLAGS)0) /* Make task RTR, event(s) Rx'd */
{<!-- -->
rdy = OS_FlagTaskRdy (pnode, flags_rdy, OS_STAT_PEND_OK);
\t\t\t\t\t
if (rdy == OS_TRUE)
{<!-- -->
sched = OS_TRUE; /* When done we will reschedule */
}
}
\t\t\t\t
break;
#if OS_FLAG_WAIT_CLR_EN > 0u
\t\t\t\t
case OS_FLAG_WAIT_CLR_ALL: /* See if all req. flags are set for current node */
flags_rdy = (OS_FLAGS)~pgrp->OSFlagFlags & amp; pnode->OSFlagNodeFlags;
\t\t\t\t
if (flags_rdy == pnode->OSFlagNodeFlags) /* Make task RTR, event(s) Rx'd */
{<!-- -->
rdy = OS_FlagTaskRdy (pnode, flags_rdy, OS_STAT_PEND_OK);
\t\t\t\t\t
if (rdy == OS_TRUE)
{<!-- -->
sched = OS_TRUE; /* When done we will reschedule */
}
}
\t\t\t\t
break;
\t\t\t\t
case OS_FLAG_WAIT_CLR_ANY: /* See if any flag set */
flags_rdy = (OS_FLAGS)~pgrp->OSFlagFlags & amp; pnode->OSFlagNodeFlags;
\t\t\t\t
if (flags_rdy != (OS_FLAGS)0) /* Make task RTR, event(s) Rx'd */
{<!-- -->
rdy = OS_FlagTaskRdy (pnode, flags_rdy, OS_STAT_PEND_OK);
\t\t\t\t\t
if (rdy == OS_TRUE)
{<!-- -->
sched = OS_TRUE; /* When done we will reschedule */
}
}
\t\t\t\t
break;
#endif
\t\t\t\t
default:
OS_EXIT_CRITICAL();
*perr = OS_ERR_FLAG_WAIT_TYPE;
return ((OS_FLAGS)0);
}
\t\t
pnode = (OS_FLAG_NODE *)pnode->OSFlagNodeNext; /* Point to next task waiting for event flag(s) */
}
\t
OS_EXIT_CRITICAL();
\t
if (sched == OS_TRUE)
{<!-- -->
OS_Sched();
}
\t
OS_ENTER_CRITICAL();
flags_cur = pgrp->OSFlagFlags;
OS_EXIT_CRITICAL();
*perr = OS_ERR_NONE;
return (flags_cur);
}

Event flag group acquisition/no waiting

#if OS_FLAG_ACCEPT_EN > 0u
OS_FLAGS OSFlagAccept (OS_FLAG_GRP *pgrp,
OS_FLAGS flags,
INT8U wait_type,
INT8U *perr)
{<!-- -->
OS_FLAGS flags_rdy;
INT8U result;
BOOLEAN consume;
#if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */
OS_CPU_SR cpu_sr = 0u;
#endif
#ifdef OS_SAFETY_CRITICAL
\t
if (perr == (INT8U *)0)
{<!-- -->
OS_SAFETY_CRITICAL_EXCEPTION();
return ((OS_FLAGS)0);
}
\t
#endif
#if OS_ARG_CHK_EN > 0u
\t
if (pgrp == (OS_FLAG_GRP *)0) /* Validate 'pgrp' */
{<!-- -->
*perr = OS_ERR_FLAG_INVALID_PGRP;
return ((OS_FLAGS)0);
}
\t
#endif
\t
if (pgrp->OSFlagType != OS_EVENT_TYPE_FLAG) /* Validate event block type */
{<!-- -->
*perr = OS_ERR_EVENT_TYPE;
return ((OS_FLAGS)0);
}
\t
result = (INT8U) (wait_type & amp; OS_FLAG_CONSUME);
\t
if (result != (INT8U)0) /* See if we need to consume the flags */
{<!-- -->
wait_type &= ~OS_FLAG_CONSUME;
consume = OS_TRUE;
}
\t
else
{<!-- -->
consume = OS_FALSE;
}
\t
/*$PAGE*/
*perr = OS_ERR_NONE; /* Assume NO error until proven otherwise. */
OS_ENTER_CRITICAL();
\t
switch(wait_type)
{<!-- -->
case OS_FLAG_WAIT_SET_ALL: /* See if all required flags are set */
flags_rdy = (OS_FLAGS) (pgrp->OSFlagFlags & flags); /* Extract only the bits we want */
\t\t\t
if (flags_rdy == flags) /* Must match ALL the bits that we want */
{<!-- -->
if (consume == OS_TRUE) /* See if we need to consume the flags */
{<!-- -->
pgrp->OSFlagFlags & amp;= (OS_FLAGS)~flags_rdy; /* Clear ONLY the flags we wanted */
}
}
\t\t\t
else
{<!-- -->
*perr = OS_ERR_FLAG_NOT_RDY;
}
\t\t\t
OS_EXIT_CRITICAL();
break;
\t\t\t
case OS_FLAG_WAIT_SET_ANY:
flags_rdy = (OS_FLAGS) (pgrp->OSFlagFlags & flags); /* Extract only the bits we want */
\t\t\t
if (flags_rdy != (OS_FLAGS)0) /* See if any flag set */
{<!-- -->
if (consume == OS_TRUE) /* See if we need to consume the flags */
{<!-- -->
pgrp->OSFlagFlags & amp;= (OS_FLAGS)~flags_rdy; /* Clear ONLY the flags we got */
}
}
\t\t\t
else
{<!-- -->
*perr = OS_ERR_FLAG_NOT_RDY;
}
\t\t\t
OS_EXIT_CRITICAL();
break;
#if OS_FLAG_WAIT_CLR_EN > 0u
\t\t\t
case OS_FLAG_WAIT_CLR_ALL: /* See if all required flags are cleared */
flags_rdy = (OS_FLAGS)~pgrp->OSFlagFlags & flags; /* Extract only the bits we want */
\t\t\t
if (flags_rdy == flags) /* Must match ALL the bits that we want */
{<!-- -->
if (consume == OS_TRUE) /* See if we need to consume the flags */
{<!-- -->
pgrp->OSFlagFlags |= flags_rdy; /* Set ONLY the flags that we wanted */
}
}
\t\t\t
else
{<!-- -->
*perr = OS_ERR_FLAG_NOT_RDY;
}
\t\t\t
OS_EXIT_CRITICAL();
break;
\t\t\t
case OS_FLAG_WAIT_CLR_ANY:
flags_rdy = (OS_FLAGS)~pgrp->OSFlagFlags & flags; /* Extract only the bits we want */
\t\t\t
if (flags_rdy != (OS_FLAGS)0) /* See if any flag cleared */
{<!-- -->
if (consume == OS_TRUE) /* See if we need to consume the flags */
{<!-- -->
pgrp->OSFlagFlags |= flags_rdy; /* Set ONLY the flags that we got */
}
}
\t\t\t
else
{<!-- -->
*perr = OS_ERR_FLAG_NOT_RDY;
}
\t\t\t
OS_EXIT_CRITICAL();
break;
#endif
\t\t\t
default:
OS_EXIT_CRITICAL();
flags_rdy = (OS_FLAGS)0;
*perr = OS_ERR_FLAG_WAIT_TYPE;
break;
}
\t
return (flags_rdy);
}
#endif

Event flag group status query

#if OS_FLAG_QUERY_EN > 0u
OS_FLAGS OSFlagQuery (OS_FLAG_GRP *pgrp,
INT8U *perr)
{<!-- -->
OS_FLAGS flags;
#if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */
OS_CPU_SR cpu_sr = 0u;
#endif
#ifdef OS_SAFETY_CRITICAL
\t
if (perr == (INT8U *)0)
{<!-- -->
OS_SAFETY_CRITICAL_EXCEPTION();
return ((OS_FLAGS)0);
}
\t
#endif
#if OS_ARG_CHK_EN > 0u
\t
if (pgrp == (OS_FLAG_GRP *)0) /* Validate 'pgrp' */
{<!-- -->
*perr = OS_ERR_FLAG_INVALID_PGRP;
return ((OS_FLAGS)0);
}
\t
#endif
\t
if (pgrp->OSFlagType != OS_EVENT_TYPE_FLAG) /* Validate event block type */
{<!-- -->
*perr = OS_ERR_EVENT_TYPE;
return ((OS_FLAGS)0);
}
\t
OS_ENTER_CRITICAL();
flags = pgrp->OSFlagFlags;
OS_EXIT_CRITICAL();
*perr = OS_ERR_NONE;
return (flags); /* Return the current value of the event flags */
}
#endif

Set event flag group naming

#if OS_FLAG_NAME_EN > 0u
void OSFlagNameSet (OS_FLAG_GRP *pgrp,
INT8U *pname,
INT8U *perr)
{<!-- -->
#if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */
OS_CPU_SR cpu_sr = 0u;
#endif
#ifdef OS_SAFETY_CRITICAL
\t
if (perr == (INT8U *)0)
{<!-- -->
OS_SAFETY_CRITICAL_EXCEPTION();
return;
}
\t
#endif
#if OS_ARG_CHK_EN > 0u
\t
if (pgrp == (OS_FLAG_GRP *)0) /* Is 'pgrp' a NULL pointer? */
{<!-- -->
*perr = OS_ERR_FLAG_INVALID_PGRP;
return;
}
\t
if (pname == (INT8U *)0) /* Is 'pname' a NULL pointer? */
{<!-- -->
*perr = OS_ERR_PNAME_NULL;
return;
}
\t
#endif
\t
if (OSIntNesting > 0u) /* See if trying to call from an ISR */
{<!-- -->
*perr = OS_ERR_NAME_SET_ISR;
return;
}
\t
OS_ENTER_CRITICAL();
\t
if (pgrp->OSFlagType != OS_EVENT_TYPE_FLAG)
{<!-- -->
OS_EXIT_CRITICAL();
*perr = OS_ERR_EVENT_TYPE;
return;
}
\t
pgrp->OSFlagName = pname;
OS_EXIT_CRITICAL();
*perr = OS_ERR_NONE;
return;
}
#endif

Get event flag group name

#if OS_FLAG_NAME_EN > 0u
INT8U OSFlagNameGet (OS_FLAG_GRP *pgrp,
INT8U **pname,
INT8U *perr)
{<!-- -->
INT8U len;
#if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */
OS_CPU_SR cpu_sr = 0u;
#endif
#ifdef OS_SAFETY_CRITICAL
\t
if (perr == (INT8U *)0)
{<!-- -->
OS_SAFETY_CRITICAL_EXCEPTION();
return (0u);
}
\t
#endif
#if OS_ARG_CHK_EN > 0u
\t
if (pgrp == (OS_FLAG_GRP *)0) /* Is 'pgrp' a NULL pointer? */
{<!-- -->
*perr = OS_ERR_FLAG_INVALID_PGRP;
return (0u);
}
\t
if (pname == (INT8U **)0) /* Is 'pname' a NULL pointer? */
{<!-- -->
*perr = OS_ERR_PNAME_NULL;
return (0u);
}
\t
#endif
\t
if (OSIntNesting > 0u) /* See if trying to call from an ISR */
{<!-- -->
*perr = OS_ERR_NAME_GET_ISR;
return (0u);
}
\t
OS_ENTER_CRITICAL();
\t
if (pgrp->OSFlagType != OS_EVENT_TYPE_FLAG)
{<!-- -->
OS_EXIT_CRITICAL();
*perr = OS_ERR_EVENT_TYPE;
return (0u);
}
\t
*pname = pgrp->OSFlagName;
len = OS_StrLen (*pname);
OS_EXIT_CRITICAL();
*perr = OS_ERR_NONE;
return (len);
}
#endif