FreeRTOS 任务通知模拟事件标志组

实验

//设置事件位的任务
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;
            }
        }
    }
}

实验现象
1

原文地址:https://www.cnblogs.com/zhangxuechao/p/11709421.html