其他分享
首页 > 其他分享> > uCOS-III学习笔记(9)----任务标志组

uCOS-III学习笔记(9)----任务标志组

作者:互联网

理解:

这个其实很好理解,比如想完成这样一个功能,任务1的按键1按下并且按键2按下,此时任务2的灯才会亮,(这里说的并且也可以改成任意一个事件触发)。

OS_FLAG_GRP MyEventFlag;	
OSFlagCreate((OS_FLAG_GRP  *)&MyEventFlag,
			(CPU_CHAR     *)"MyEventFlag",
			(OS_FLAGS      )0,                //状态的初始值,这里写0后面就要写置位,反之相同
			(OS_ERR       *)&err);


//=======================================================================================
extern OS_FLAG_GRP MyEventFlag;

void Task_1(void *p_arg)
{
	OS_ERR err;
	
	(void)p_arg;
	
	while(1)
	{
		if(Key_Scan(GPIOA, GPIO_Pin_0) == KEY_ON)       //按键1按下控制led1 并且给第一位置位
		{
			LED1_TOGGLE;
			OSFlagPost((OS_FLAG_GRP *)&MyEventFlag,
					  (OS_FLAGS    )0x01,
					  (OS_OPT      )OS_OPT_POST_FLAG_SET,
					  (OS_ERR     *)&err);
			
		}
		if(Key_Scan(GPIOA, GPIO_Pin_5) == KEY_ON)       //按键2按下控制led2 并且给第二位置位
		{
			LED2_TOGGLE;
			OSFlagPost((OS_FLAG_GRP *)&MyEventFlag,
					  (OS_FLAGS    )0x02,
					  (OS_OPT      )OS_OPT_POST_FLAG_SET,
					  (OS_ERR     *)&err);		
		}
		OSTimeDlyHMSM(0, 0, 0, 20, OS_OPT_TIME_HMSM_STRICT, &err);
	}
}

void Task_2(void *p_arg)
{
	OS_ERR err;
	
	(void)p_arg;
	
	while(1)
	{
		OSFlagPend((OS_FLAG_GRP *)&MyEventFlag,
				   (OS_FLAGS      )0x03,          //检测1和2
				   (OS_TICK       )0,
				   (OS_OPT        )OS_OPT_PEND_FLAG_SET_ALL | OS_OPT_PEND_FLAG_CONSUME | OS_OPT_PEND_BLOCKING,
                //这里就是检测所有位置位(这里就是位1和位2),并且消耗意思触发了下次就得重新触发,阻塞
				   (CPU_TS       *)0,
			       (OS_ERR       *)&err);	
		
		LED3_TOGGLE;  
	}
}

标签:OPT,err,uCOS,III,void,----,FLAG,MyEventFlag,OS
来源: https://blog.csdn.net/m0_58457065/article/details/121988945