• 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小时.

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

    消息?

  • 相关阅读:
    git常用命令
    springcloud 心得记录
    Spring Boot整合RabbitMQ
    docker安装rabbitmq
    Linux按顺序启动多个jar的shell脚本
    idea连接docker实现一键部署
    docker安装mysql
    阿里云CentOS服务器挂载数据盘
    【selenium学习中级篇 -26】HTMLTestRunner生成测试报告
    【selenium学习中级篇 -25】Unittest框架
  • 原文地址:https://www.cnblogs.com/Montauk/p/10567514.html
Copyright © 2020-2023  润新知