二十八,如何配置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双核
「点点赞赏,手留余香」

    还没有人赞赏,快来当第一个赞赏的人吧!
Lua
0 条回复 A 作者 M 管理员
    所有的伟大,都源于一个勇敢的开始!
欢迎您,新朋友,感谢参与互动!欢迎您 {{author}},您在本站有{{commentsCount}}条评论