(ESP32学习7)双核使用队列进行任务间通信

本文深入探讨ESP32双核架构下任务间通讯的实现方式,重点介绍如何利用队列进行数据交换。通过创建不同类型的队列,如整型、字符串及结构体类型,展示数据在两个核上的发送与接收过程。文章提供了详细的代码示例,解释了队列的创建、初始化及数据读写操作。

这里是调用双核的方法哈,和我们单核使用的方法不兼容,因为有一些函数是不一样的,不通用,但是下一篇博文我会更一篇单核使用队列进行任务间通讯的问题

队列是什么?

队列是可以从一个任务向其他任务以并发安全的方式发送消息的机制,也就是说他的目标是实现任务间的通讯,比如A任务向名为Queue的队列中发布了数据,那么B任务就可以从Queue这个队列中又把数据给取出来,并且,这个数据是复制式的,也就是说把数据复制一份送入队列,B任务取出后对原来A的数据完全不会造成影响(实际上是形象的描述,本质上是通过一系列指针实现的),好了知道一些概念就行了,重要的是知道怎么用

先上代码,然后里面的注释我都注释的非常清楚了,然后再给大家说说一些需要注意的点以及我查资料写这一段代码的一点思考,代码有一点点长但是不要被吓到,其实核心并不多
#include <soc/soc.h> 
#include <soc/rtc_cntl_reg.h>
#include <stdio.h>
#include <stdlib.h>

//这是队列数据结构体,数据是可以以结构体存在的
typedef struct{
   
   
  int sender;
  char *msg;
}Data;

//以下句柄名字以x开头,用作双核版本的队列测试
xQueueHandle xqueue0;  //创建的测试队列句柄,我们定义数据为int型
xQueueHandle xqueue1;  //创建的测试队列句柄,我们定义数据为字符串型
xQueueHandle xqueue2;  //创建的测试队列句柄,我们定义数据为结构体型,结构体里面包括一个int型以及一个字符串型
TaskHandle_t xTask0;   //任务0的句柄
TaskHandle_t xTask1;   //任务1的句柄

void Task1(void *pvParameters) {
   
   
  //在这里可以添加一些代码,这样的话这个任务执行时会先执行一次这里的内容(当然后面进入while循环之后不会再执行这部分了)
  Data data_send;  //创建一个数据结构体用于发送数据
  data_send.sender = 1314;  //这个数据结构体的整数直接赋值为1314
  BaseType_t xStatus;  //用于状态返回在下面会用到
  BaseType_t xStatus1;
  BaseType_t xStatus2;
  int send_int = 615;
  char send_str[10] = "cx??";
  const TickType_t xTicksToWait = pdMS_TO_TICKS(100);   // 阻止任务的时间,直到队列有空闲空间 ,应该是如果发送需要阻滞等待(比如队列满了)或者别的情况需要用到的
  while(1)
  {
   
   
    vTaskDelay(1200);
    Serial.print("PRO_CPU正在运行:");
    Serial.println(xPortGetCoreID());
    Serial.print("发送任务固定在: ")
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值