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);

二 使用时间标志组

一个任务可能需要和多个事件同步,这个时候就需要使用事件标志组

ucos-iii 事件标志组_第1张图片

下面是使用事件标志组的例子:

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 );//延时
    }
}

 

 

你可能感兴趣的:(STM32/RT1052)