实验
//设置事件位的任务
void eventsetbit_task(void *pvParameters)
{
u8 key;
while(1)
{
if(EventGroupTask_Handler!=NULL)
{
key=KEY_Scan(0);
switch(key)
{
case KEY0_PRES:
xTaskNotify((TaskHandle_t )EventGroupTask_Handler,//接收任务通知的任务句柄
(uint32_t )EVENTBIT_0, //要更新的bit
(eNotifyAction )eSetBits); //更新指定的bit
break;
case KEY1_PRES:
xTaskNotify((TaskHandle_t )EventGroupTask_Handler,//接收任务通知的任务句柄
(uint32_t )EVENTBIT_1, //要更新的bit
(eNotifyAction )eSetBits); //更新指定的bit
break;
case KEY2_PRES:
xTaskNotify((TaskHandle_t )EventGroupTask_Handler,//接收任务通知的任务句柄
(uint32_t )EVENTBIT_2, //要更新的bit
(eNotifyAction )eSetBits); //更新指定的bit
break;
}
}
vTaskDelay(10); //延时10ms,也就是10个时钟节拍
}
}
//事件标志组处理任务
void eventgroup_task(void *pvParameters)
{
u8 enevtvalue;
static u8 event0flag,event1flag,event2flag;
uint32_t NotifyValue;
BaseType_t err;
while(1)
{
//获取任务通知值
err=xTaskNotifyWait((uint32_t )0x00, //进入函数的时候不清除任务bit
(uint32_t )ULONG_MAX, //退出函数的时候清除所有的bit
(uint32_t* )&NotifyValue, //保存任务通知值
(TickType_t )portMAX_DELAY); //阻塞时间
if(err==pdPASS) //任务通知获取成功
{
if((NotifyValue&EVENTBIT_0)!=0) //事件0发生
{
event0flag=1;
}
else if((NotifyValue&EVENTBIT_1)!=0) //事件1发生
{
event1flag=1;
}
else if((NotifyValue&EVENTBIT_2)!=0) //事件2发生
{
event2flag=1;
}
enevtvalue=event0flag|(event1flag<<1)|(event2flag<<2); //模拟事件标志组值
printf("任务通知值为:%d
",enevtvalue);
if((event0flag==1)&&(event1flag==1)&&(event2flag==1)) //三个事件都同时发生
{
event0flag=0; //标志清零
event1flag=0;
event2flag=0;
}
}
}
}
实验现象