UCOS的Flags, 事件是什么鬼

flags, 直译过来应该是信号旗, 我觉得是不是用于, 某些任务需要多个信号量, 全部满足后, 才动作.

这个时候可能就可以使用flags.

void flagsprocess_task(void *p_arg)
{
    OS_ERR err;
    DebugOutput("flag 1 task start.
");
    while(0){
        OSTimeDlyHMSM(0,0,1,000,OS_OPT_TIME_HMSM_STRICT,&err); //ÑÓʱ1s
    }
    while(1)
    {
        OSFlagPend((OS_FLAG_GRP*)&EventFlags,
                   (OS_FLAGS    )FRONT_FEEDER_LED_FLAG + FRONT_FEEDER_LED2_FLAG,
                    (OS_TICK     )0,
                   (OS_OPT        )OS_OPT_PEND_FLAG_SET_ALL + OS_OPT_PEND_FLAG_CONSUME,
                   (CPU_TS*     )0,
                   (OS_ERR*        )&err);

        DebugOutput("flag1 task ÊÕµ½Ê¼þ±êÖ¾×éEventFlagsµÄÖµ:%d
",EventFlags.Flags);

    }
}

上面的旗帜处理任务, 首先通过OS_OPT_PEND_FLAG_SET_ALL + OS_OPT_PEND_FLAG_CONSUME, 告诉, 条件之间时AND关系,

然后当满足FRONT_FEEDER_LED_FLAG + FRONT_FEEDER_LED2_FLAG 这两个旗帜都竖了个1时, 才退出pendresume.

最后, 退出之后, OS_OPT_PEND_FLAG_CONSUME会将小旗子置0

竖棋子的动作为:

flags_num=OSFlagPost((OS_FLAG_GRP*)&EventFlags,
                                 (OS_FLAGS      )FRONT_FEEDER_LED_FLAG,
                                 (OS_OPT      )OS_OPT_POST_FLAG_SET,
                                 (OS_ERR*     )&err);
DebugOutput("1 事件标志组EventFlags的值:%d
",flags_num);

下图为: 如果你不consume小旗子, 可以通过串口打印看到棋子的情况, 注意, 3 = 2  + 1, 应该说, 3 = 11 = 01 + 10 ,请用bit的思维去理解它.

如果你的pending的taskconsume 了这个棋子,等你打印出来, 已经完了. 棋子置0了.

大概在这儿停留了3小时.

接下来时琢磨一下, 如果上位机下达指令, 应该通过哪种方式, 给状态机管理任务传输命令.

消息?

原文地址:https://www.cnblogs.com/Montauk/p/10567514.html