typedef struct os_flag_grp
OS_FLAG_GRP;
struct os_flag_grp { /* Event Flag Group */
/* ------------------ GENERIC MEMBERS ------------------ */
OS_OBJ_TYPE Type; /* Should be set to OS_OBJ_TYPE_FLAG */
CPU_CHAR *NamePtr; /* Pointer to Event Flag Name (NUL terminated ASCII) */
OS_PEND_LIST PendList; /* List of tasks waiting on event flag group */
#if OS_CFG_DBG_EN > 0u
OS_FLAG_GRP *DbgPrevPtr;
OS_FLAG_GRP *DbgNextPtr;
CPU_CHAR *DbgNamePtr;
#endif
/* ------------------ SPECIFIC MEMBERS ------------------ */
OS_FLAGS Flags; /* 8, 16 or 32 bit flags */
CPU_TS TS; /* Timestamp of when last post occurred */
};
void OSFlagCreate (OS_FLAG_GRP *p_grp,
CPU_CHAR *p_name,
OS_FLAGS flags,
OS_ERR *p_err):
根据flags创建一个OS_FLAG_GRP,设置p_grp->Type、NamePtr、Flags、TS,初始化p_grp->PendList。
OS_OBJ_QTY OSFlagDel (OS_FLAG_GRP *p_grp,
OS_OPT opt,
OS_ERR *p_err):
删除一个OS_FLAG_GRP,
OS_OPT_DEL_NO_PEND:当没有任务等待时删除,调用
OS_FlagClr
(),如果有任务则设置错误代码。
OS_OPT_DEL_ALWAYS:即使有任务等待也删除,对等待列表中的将所有的任务调用OS_PendObjDel(),调用
OS_FlagClr
(),启动调度
。
void OS_FlagClr (OS_FLAG_GRP *p_grp):
清空
p_grp
中的内容,OS内部函数,被OSFlagDel()调用。
OS_FLAGS OSFlagPend (OS_FLAG_GRP *p_grp,
OS_FLAGS flags,
OS_TICK timeout,
OS_OPT opt,
CPU_TS *p_ts,
OS_ERR *p_err):
等待别的任务或者ISR对p_grp中bit的操作。
判断opt:
OS_OPT_PEND_FLAG_SET_ALL、
OS_OPT_PEND_FLAG_SET_ANY:从p_grp中获取我们关心的flags,如果是判断是否需要将p_grp->Flags清空回去,返回flags,否则调用OS_FlagBlock(),启动调度器等待事件的发生。
OS_OPT_PEND_FLAG_CLR_ALL、
OS_OPT_PEND_FLAG_CLR_ANY:从p_grp中获取我们关心的flags,如果是判断是否需要将p_grp->Flags置高回去,返回flags,否则调用OS_FlagBlock(),启动调度器等待事件的发生。
任务被再次唤醒时在此继续往下运行---->
判断
OSTCBCurPtr->PendStatus:
如果OS_STATUS_PEND_ABORT、OS_STATUS_PEND_TIMEOUT、OS_STATUS_PEND_DEL,设置错误代码,返回。
如果OS_STATUS_PEND_OK,*p_err = OS_ERR_NONE,从OSTCBCurPtr->FlagsRdy中取出flags_rdy,判断是否需要消除事件标志,返回flags_rdy。
如果OS_STATUS_PEND_OK,*p_err = OS_ERR_NONE,从OSTCBCurPtr->FlagsRdy中取出flags_rdy,判断是否需要消除事件标志,返回flags_rdy。
void OS_FlagBlock (OS_PEND_DATA *p_pend_data,
OS_FLAG_GRP *p_grp,
OS_FLAGS flags,
OS_OPT opt,
OS_TICK timeout):
设置
OSTCBCurPtr->FlagsPend、FlagsOpt、FlagsRdy,调用OS_Pend(),OS内部函数,被OSFlagPend()调用。
OS_OBJ_QTY OSFlagPendAbort (OS_FLAG_GRP *p_grp,
OS_OPT opt,
OS_ERR *p_err):
终止任务对p_grp的等待。
根据opt对p_grp中等待列表中的任务调用
OS_PendAbort(),根据opt是否启动调度。
OS_FLAGS OSFlagPendGetFlagsRdy (OS_ERR *p_err):
获取当前任务的
OSTCBCurPtr->FlagsRdy,使任务准备运行的Flags。
OS_FLAGS OSFlagPost (OS_FLAG_GRP *p_grp,
OS_FLAGS flags,
OS_OPT opt,
OS_ERR *p_err):
设置清空p_grp中对应的flags。
如果
OS_CFG_ISR_POST_DEFERRED_EN>0&&
OSIntNestingCtr>0,调用
OS_IntQPost()(Post到ISR Queue~
OS_OBJ_TYPE_FLAG
),否则调用
OS_FlagPost
()。
OS_FLAGS OS_FlagPost (OS_FLAG_GRP *p_grp,
OS_FLAGS flags,
OS_OPT opt,
CPU_TS ts,
OS_ERR *p_err):
设置清空p_grp中对应的flags,OSFlagPost调用。
根据opt、flags设置p_grp->Flags。查看p_grp等待链表中是否任务等待,没有返回p_grp->Flags,有则遍历等待链表--->
--->根据
p_tcb->FlagsOpt,判断p_tcb->FlagsPend与
p_grp->Flags & p_tcb->FlagsPend,调用
OS_FlagTaskRdy()。
遍历完,根据opt启动调度器。
void OS_FlagTaskRdy (OS_TCB *p_tcb,
OS_FLAGS flags_rdy,
CPU_TS ts):
p_tcb等待的Flags发生,Ready 任务。
设置p_tcb->FlagsRdy、PendStatus、PendOn、TS,根据p_tcb->State激活任务,将p_tcb从等待列表中删除。
void OS_FlagInit (OS_ERR *p_err):
OSInit()调用,初始化Flag模块,设置OSFlagQty=0。