ucosiii之事件标志组

事件标志组
有时候一个任务需要多个事件同步时,就需要用到事件标志组了。
相关函数

ucosiii之事件标志组
一般情况下只用到OSFlagPost(),OSFlagPend(),OSFlagCreate()三个函数
ucosiii之事件标志组
ucosiii之事件标志组
ucosiii之事件标志组
ucosiii之事件标志组
OSFlagPost()函数的返回值是当前的事件标志组的事件标志位的值

//例子如下
//创建事件标志组
OS_FLAG_GRP 里有一个OS_FLAGS 是一个32位事件标志位,也就是说一个事件标志组可以同时标志32个事件

OS_FLAG_GRP	EventFlags;		//定义一个事件标志组

//创建一个事件标志组
OSFlagCreate((OS_FLAG_GRP*)&EventFlags,		//指向事件标志组
                (CPU_CHAR*	  )"Event_Flags",	//名字
                (OS_FLAGS	  )0,				//事件标志组初始值
                (OS_ERR*  	  )&err);			//错误码

//使用OSFlagPost函数

void EventPend_task(void *p_arg)
{
	OS_FLAGS flags_num;
	OS_ERR err;
	while(1)
	{

		//向事件标志组EventFlags发送标志
		flags_num=OSFlagPost((OS_FLAG_GRP*)&EventFlags,
							 (OS_FLAGS	  )0x01,					//设置标志位对应的位的值,当前设置标志位的bit0位
							 (OS_OPT	  )OS_OPT_POST_FLAG_SET,	//对事件标志位置1,如果OS_OPT_POST_FLAG_CLR则对事件标志位置0
							 (OS_ERR*	  )&err);
	
		printf("事件标志组111111:%d\r\n",flags_num);	//打印当前事件标志位的值

		//向事件标志组EventFlags发送标志
		flags_num=OSFlagPost((OS_FLAG_GRP*)&EventFlags,
							 (OS_FLAGS	  )0x02,					//设置标志位对应的位,当前设置标志位的bit1位
							(OS_OPT	  )OS_OPT_POST_FLAG_SET,		/对事件标志位对应位置1,如果OS_OPT_POST_FLAG_CLR则对事件标志位对应位置0
							 (OS_ERR*     )&err);
	
		printf("事件标志组222222:%d\r\n",flags_num);	//打印当前事件标志位的值
	
		OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_PERIODIC,&err);   
	}	

}

//使用OSFlagPend()事件请求函数

void EventPost_task(void *p_arg)
{
	OS_ERR err; 
	while(1)
	{
		//等待事件标志组
		OSFlagPend((OS_FLAG_GRP*)&EventFlags,
				   (OS_FLAGS	)1+2,				//事件标志位的bit0和bit1位为该事件的标志位,如果满足条件则执行,不满足则挂起
		     	   (OS_TICK     )0,
				   (OS_OPT	    )OS_OPT_PEND_FLAG_SET_ALL+OS_OPT_PEND_FLAG_CONSUME,	//当1+2的标志位被置位时,条件满足,OS_OPT_PEND_FLAG_CONSUME满足条件后标志位清0。OS_OPT_PEND_FLAG_SET_ALL:bit0和bit1都要满足条件
				   (CPU_TS*     )0,
				   (OS_ERR*	    )&err);
		
		printf("事件标志组Post:%d\r\n",EventFlags.Flags);	//EventFlags.Flags事件标志组的标志位的值
	}	
}

//程序效果
ucosiii之事件标志组