os_flag.c

来源:互联网 发布:农村淘宝怎么赚钱 编辑:程序博客网 时间:2024/05/21 09:43
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

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。
0 0
原创粉丝点击