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;  
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值