os_flag.c
2016-02-21 19:16
197 查看
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,
4000
否则调用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。
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。
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,
4000
否则调用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。
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。
相关文章推荐
- HttpClient请求网络
- Toast类
- iOS 常用解析方式(XML、Json)
- AnguarJS 第二天----数据绑定
- 【慕课笔记】第四章 JAVA中的集合框架(上) 第2节 Collection接口&List接口简介
- 【三层架构】三层总结(代码型)
- [Docker]初次接触
- 随记
- os_mem.c
- 用HttpUtils加载网络数据
- os_mutex.c
- Android 版本更新的实现
- 【PS3】二之国 白色圣灰的女王 日本制造的视觉效果
- 谈汇编
- ThinkPHP pdo连接Oracle的配置写法,提示报错
- NoSQL学习笔记安装和配置
- JAVA UUID 生成
- Android笔记---四大组件之Broadcast Receive广播接收器详解
- 联网获取Json并且解析
- C++ Primer Plus Chapter4