ucos-iii 事件標誌組

一  事件標誌組相關函數

創建事件標誌組 OSFlagCreate()   OS_CFG_FLAG_EN

OS_FLAG_GRP EngineStatus;

OS_ERR err;

OSFlagCreate(&EngineStatus,
     “Engine Status”,(OS_FLAGS)0,&err); 

刪除事件標誌組 OSFlagDel()  

OS_CFG_FLAG_EN

OS_CFG_FLAG_DEL_EN

OS_FLAG_GRP Flags;

OS_ERR err;
OS_OBJ_QTY qty;

qty = OSFlagDel(&Flags,
            OS_OPT_DEL_ALWAYS,&err);

等待事件標誌組 OSFlagPend() OS_CFG_FLAG_EN

OS_FLAG_GRP EngineStatus;

OS_ERR err;
OS_FLAGS value;
CPU_TS ts;

OSFlagPend(&EngineStatus,0x01,
10,OS_OPT_PEND_BLOCKING,&ts,&err);

取消等待事件標誌組 OSFlagPendAbort() 

OS_CFG_FLAG_EN

OS_CFG_FLAG_PEND_ABORT_EN

OS_FLAG_GRP EngineStatus;

OS_ERR err;
OS_OBJ_QTY nbr_tasks;

nbr_tasks = OSFlagPendAbort(&EngineStatus,
OS_OPT_PEND_ABORT_ALL,&err);

獲取使任務就緒的事件標誌 OSFlagPendGetFlagsRdy()  OS_CFG_FLAG_EN

OS_ERR err;
OS_FLAGS flags_rdy;

flags_rdy = OSFlagPendGetFlagsRdy(&err);

向事件標誌組發佈標誌 OSFlagPost() OS_CFG_FLAG_EN

OS_FLAG_GRP EngineStatusFlags;

OS_ERR err;
OS_FLAGS flags;

flags = OSFlagPost(&EngineStatusFlags,
ENGINE_START,OS_OPT_POST_FLAG_SET,
&err);

二 使用時間標誌組

一個任務可能需要和多個事件同步,這個時候就需要使用事件標誌組

下面是使用事件標誌組的例子:

OS_FLAG_GRP flag_grp; //聲明事件標誌組
#define BIT0_EVENT (0x01 << 0)//設置事件掩碼的位 0
#define BIT1_EVENT (0x01 << 1)//設置事件掩碼的位 1

OSFlagCreate ((OS_FLAG_GRP *)&flag_grp, //指向事件標誌組的指針
                  (CPU_CHAR *)"FLAG For Test", //事件標誌組的名字
                  (OS_FLAGS )0,    //事件標誌組的初始值
                  (OS_ERR *)&err); //返回錯誤類型

void flag_grp0_task(void *p_arg)
{
    OS_ERR err;
    p_arg = p_arg;
    while(1)
    {
        OSFlagPost ((OS_FLAG_GRP *)&flag_grp,
                    (OS_FLAGS )BIT0_EVENT, //將標誌組的 BIT0 置 1
                    (OS_OPT )OS_OPT_POST_FLAG_SET,
                    (OS_ERR *)&err);
        
        OSFlagPost ((OS_FLAG_GRP *)&flag_grp,
                    (OS_FLAGS )BIT1_EVENT,//將標誌組的 BIT1 置 1
                    (OS_OPT )OS_OPT_POST_FLAG_SET,
                    (OS_ERR *)&err);
        
        OSTimeDly (1000, OS_OPT_TIME_DLY, &err );//延時
    }
}

void flag_grp1_task(void *p_arg)
{
    OS_ERR err;
    OS_FLAGS flags_rdy;
    p_arg = p_arg;
    while(1)
    {
        //等待標誌組的的 BIT0 和 BIT1 均被置 1
        flags_rdy = OSFlagPend ((OS_FLAG_GRP *)&flag_grp,
                                (OS_FLAGS )( BIT0_EVENT | BIT1_EVENT ),
                                (OS_TICK )0,
                                (OS_OPT)OS_OPT_PEND_FLAG_SET_ALL |
                                OS_OPT_PEND_BLOCKING |
                                OS_OPT_PEND_FLAG_CONSUME,
                                (CPU_TS *)0,
                                (OS_ERR *)&err);
        if ((flags_rdy & (BIT0_EVENT|BIT1_EVENT)) == (BIT0_EVENT|BIT1_EVENT))
        {
            /* 如果接收完成並且正確 */
            printf ( "標誌組的BIT0與BIT1 均被置 1\n");
        }
        OSTimeDly (1000, OS_OPT_TIME_DLY, &err );//延時
    }
}

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章