当前位置: 首页 > backend >正文

B站Michale_ee——ESP32_IDF SDK——FreeRTOS_5 事件组同步与等待

一、事件组等待

1.API简介

(1)创建事件组

在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

(2)等待事件组中是否有相应的位被设置

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

(3)设置事件组中相应位

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

2.示例代码及运行结果

#include <stdio.h>
#include <inttypes.h>
#include "sdkconfig.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_chip_info.h"
#include "esp_flash.h"
#include "esp_system.h"
#include "freertos/event_groups.h"       // add by lxl#define BIT_0 ( 1 << 0 )
#define BIT_4 ( 1 << 4 )
EventGroupHandle_t xCreatedEventGroup;
TaskHandle_t Task1Handle = NULL;void Task1(void *pvparam)
{while(1){printf("Task1 begin to wait\n");xEventGroupWaitBits(xCreatedEventGroup, BIT_0 | BIT_4, pdTRUE, pdTRUE,  portMAX_DELAY);printf("Task1 BIT_0 and BIT_4 is Set!\n");vTaskDelay(pdMS_TO_TICKS(1000));}
}void Task2(void *pvparam)
{vTaskDelay(pdMS_TO_TICKS(1000));while(1){printf("Task2 begin to set bit0\n");xEventGroupSetBits(xCreatedEventGroup, BIT_0);vTaskDelay(pdMS_TO_TICKS(5000));printf("Task2 begin to set bit0\n");xEventGroupSetBits(xCreatedEventGroup, BIT_4);vTaskDelay(pdMS_TO_TICKS(5000));}
}void app_main(void)
{xCreatedEventGroup = xEventGroupCreate();if( xCreatedEventGroup == NULL ){printf("EventGroup create fail.\n");}else{printf("EventGroup create success.\n");vTaskSuspendAll();xTaskCreatePinnedToCore(Task1, "Task1", 1024*5, NULL, 1, &Task1Handle, 1);      //! ESP32-S3为双核,CPU0主要运行WiFi和蓝牙;CPU1用于运行应用程序;xTaskCreatePinnedToCore(Task2, "Task2", 1024*5, NULL, 1, NULL, 1);xTaskResumeAll();}
}

在这里插入图片描述

二、事件组同步

1.事件组等待与事件组同步的区别

在这里插入图片描述在这里插入图片描述

2.API 简介

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.示例代码及运行结果

#include <stdio.h>
#include <inttypes.h>
#include "sdkconfig.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_chip_info.h"
#include "esp_flash.h"
#include "esp_system.h"
#include "freertos/event_groups.h"       // add by lxl#define TASK_0_BIT ( 1 << 0 )
#define TASK_1_BIT ( 1 << 1 )
#define TASK_2_BIT ( 1 << 2 )
#define ALL_SYNC_BITS ( TASK_0_BIT | TASK_1_BIT | TASK_2_BIT )EventGroupHandle_t xEventBits;
TaskHandle_t Task1Handle = NULL;void Task0(void *pvparam)
{while(1){printf("Task0 begin\n");vTaskDelay(pdMS_TO_TICKS(1000));printf("Task0 Set BIT_0!\n");xEventGroupSync(xEventBits, TASK_0_BIT, ALL_SYNC_BITS, portMAX_DELAY);printf("Task0 Sync\n");vTaskDelay(pdMS_TO_TICKS(10000));}
}void Task1(void *pvparam)
{while(1){printf("Task1 begin\n");vTaskDelay(pdMS_TO_TICKS(3000));printf("Task1 Set BIT_1!\n");xEventGroupSync(xEventBits, TASK_1_BIT, ALL_SYNC_BITS, portMAX_DELAY);printf("Task1 Sync\n");vTaskDelay(pdMS_TO_TICKS(10000));}
}void Task2(void *pvparam)
{while(1){printf("Task2 begin\n");vTaskDelay(pdMS_TO_TICKS(5000));printf("Task2 Set BIT_2!\n");xEventGroupSync(xEventBits, TASK_2_BIT, ALL_SYNC_BITS, portMAX_DELAY);printf("Task2 Sync\n");vTaskDelay(pdMS_TO_TICKS(10000));}
}void app_main(void)
{xEventBits = xEventGroupCreate();if( xEventBits == NULL ){printf("EventGroup create fail.\n");}else{printf("EventGroup create success.\n");vTaskSuspendAll();xTaskCreatePinnedToCore(Task0, "Task0", 1024*5, NULL, 1, NULL, 1);      //! ESP32-S3为双核,CPU0主要运行WiFi和蓝牙;CPU1用于运行应用程序;xTaskCreatePinnedToCore(Task1, "Task1", 1024*5, NULL, 1, NULL, 1);xTaskCreatePinnedToCore(Task2, "Task2", 1024*5, NULL, 1, NULL, 1);xTaskResumeAll();}
}

在这里插入图片描述

http://www.xdnf.cn/news/3581.html

相关文章:

  • 驱动开发系列56 - Linux Graphics QXL显卡驱动代码分析(三)显示模式设置
  • wpf 输入框 在输入时去除水印
  • 开闭原则与依赖倒置原则区别:原类不变,新增类(功能)vs 接口类不变,原实现类可变
  • 十分钟用Docker搭建功能齐全的Poste.io邮件服务器
  • 分布式理论:常见分布式协议的概览与解析
  • 原地轮转数组的两种高效实现详解
  • 使用 Java 实现一个简单且高效的任务调度框架
  • HTTPS协议:更安全的HTTP
  • Qt通过QXlsx库文件写入到excl文件,读取excl文件
  • PowerBI实现点击空白处隐藏弹窗(详细教程)
  • pip 常用命令及配置
  • Linux发展史、开源文化与技术生态全景
  • 10 种微服务设计模式
  • python实现基于Windows系统计算器程序
  • 【Linux】Linux奇技淫巧
  • 【AI论文】Sadeed:通过小型语言模型推进阿拉伯语变音
  • (36)VTK C++开发示例 ---纹理贴图四边形
  • 【重走C++学习之路】26、类型转换
  • Python爬虫基础总结
  • [android]MT6835 Android 关闭selinux方法
  • 【自然语言处理与大模型】使用Xtuner进行QLoRA微调实操
  • 【中间件】brpc_基础_bthread头文件
  • 【AI面试准备】Git与CI/CD及单元测试实战指南
  • 从 “零” 做个开源音乐软件“SteadyBeat”吧!<1> 准备
  • NVIDIA NPP 库入门
  • c++_csp-j算法 (6)_高精度算法(加减乘除)
  • PostgreSQL:pgJDBC 下载和安装
  • TensorZero开源程序创建了一个反馈循环来优化 LLM 应用程序,将生产数据转化为更智能、更快、更便宜的模型
  • Leetcode刷题记录26——轮转数组
  • 数字时代,如何为个人信息与隐私筑牢安全防线?