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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值