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

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值