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\r\n",enevtvalue);

            if((event0flag==1)&&(event1flag==1)&&(event2flag==1)) //三个事件都同时发生
            {
                event0flag=0; //标志清零
                event1flag=0;
                event2flag=0;
            }
        }
    }
}

实验现象
1

posted @   thomas_blog  阅读(239)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示