三十,如何配置ESP32双核

1,介绍

ESP32是ESP8266 的一个升级、改进的版本(花时间玩ESP32 后,发现比ESP8266更快,功能更加丰富)。ESP32 的一个特点是其他单片机不能比的是它支持双核。以下的演示将为您展示如何在arduino中配置ESP32 多核。

2.硬件

  • ESP32开发板

3.代码设计

 我们将重用Queue教程,在本演示中,我们创建了2个任务,1个任务称为“sendTask”,1个任务称为“receiveTask”。“sendTask”固定在核心0上。“receiveTask”固定在核心1上。“sendTask”将每秒通过Queue将数据发送到“receiveTask” 

API xTaskCreatePinnedToCore的最后一个参数是该任务固定的核心。除此之外,我们可以使用API​​函数xTaskGetAffinity来了解任务固定到哪个核心。这个函数有一个参数。这是使用xTaskCreatePinnedToCore创建的任务处理程序。

/* 保存数据的结构*/
typedef struct{int sender;
  char *msg;
}Data;
 
/* 这个变量保持队列句柄 */
xQueueHandle xQueue;
TaskHandle_t xTask1;
TaskHandle_t xTask2;
void setup() {
 
  Serial.begin(112500);
  /* 创建队列,其大小可包含5个元素Data */
  xQueue = xQueueCreate(5, sizeof(Data));
 
  xTaskCreatePinnedToCore(
      sendTask,           
      "sendTask",        /* 任务名称. */10000,                    /* 任务的堆栈大小 */NULL,                     /* 任务的参数 */1,                        /* 任务的优先级 */
      &xTask1,                /* 跟踪创建的任务的任务句柄 */0);                    /* pin任务到核心0 */
  xTaskCreatePinnedToCore(
      receiveTask,           
      "receiveTask",        
      10000,                    
      NULL,                    
      1,                        
      &xTask2,            
      1);                
}
 
void loop() {
 
}
 
void sendTask( void * parameter )
{
  /*保持发送数据的状态 */
  BaseType_t xStatus;
  /* 阻止任务的时间,直到队列有空闲空间 */const TickType_t xTicksToWait = pdMS_TO_TICKS(100);
  /* 创建要发送的数据 */
  Data data;
  /* sender 1的id为1 */
  data.sender = 1;
  for(;;){
    Serial.print("sendTask run on core ");
    /* 获取任务被固定到 */
    Serial.print(xTaskGetAffinity(xTask1));
    Serial.println(" is sending data");
    data.msg = (char *)malloc(20);
    memset(data.msg, 0, 20);
    memcpy(data.msg, "hello world", strlen("hello world"));
    /* 将数据发送到队列前面*/
    xStatus = xQueueSendToFront( xQueue, &data, xTicksToWait );
    /* 检查发送是否正常 */if( xStatus == pdPASS ) {
      /* 增加发送方1 */
      Serial.println("sendTask sent data");
    }
    /* 我们在这里延迟,以便receiveTask有机会接收数据 */
    delay(1000);
  }
  vTaskDelete( NULL );
}
 
void receiveTask( void * parameter )
{
  /*保持接收数据的状态 */
  BaseType_t xStatus;
  /* 阻止任务的时间,直到数据可用 */const TickType_t xTicksToWait = pdMS_TO_TICKS(100);
  Data data;
  for(;;){
    /*从队列接收数据 */
    xStatus = xQueueReceive( xQueue, &data, xTicksToWait );
    /* 检查接收是否正常 */if(xStatus == pdPASS){
      Serial.print("receiveTask run on core ");
      /*获取任务固定的核心 */
      Serial.print(xTaskGetAffinity(xTask2));
      /* 将数据打印到终端*/
      Serial.print(" got data: ");
      Serial.print("sender = ");
      Serial.print(data.sender);
      Serial.print(" msg = ");
      Serial.println(data.msg);
      free(data.msg);
    }
  }
  vTaskDelete( NULL );
}

4,结果

三十,如何配置ESP32双核

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

给TA打赏
共{{data.count}}人
人已打赏
ESP-32

二十九,ESP32FreeRTOS:如何使用Messages Queue

2025-4-16 15:17:28

ESP-32

如何使用ESP32控制继电器模块

2025-4-16 17:51:23

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索