理解:
这个其实很好理解,比如想完成这样一个功能,任务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;
}
}