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小时.
接下来时琢磨一下, 如果上位机下达指令, 应该通过哪种方式, 给状态机管理任务传输命令.
消息?