ESP32 Arduino双核编程示例

Posted perseverance52

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ESP32 Arduino双核编程示例相关的知识,希望对你有一定的参考价值。

ESP32 Arduino双核编程


  • 说明:
    xTaskCreate()xTaskCreatePinnedToCore() 的返回值:
    成功,返回 pdPASS
    失败,返回 errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY

实例代码

/* 保存数据的结构*/
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 );
}
  • 串口打印

实例二

void setup() {
  
  Serial.begin(112500);
  delay(1000);

  xTaskCreate(
                    taskOne,          /* Task function. */
                    "TaskOne",        /* String with name of task. */
                    10000,            /* Stack size in bytes. */
                    NULL,             /* Parameter passed as input of the task */
                    1,                /* Priority of the task. */
                    NULL);            /* Task handle. */



  xTaskCreate(
                    taskTwo,          /* Task function. */
                    "TaskTwo",        /* String with name of task. */
                    10000,            /* Stack size in bytes. */
                    NULL,             /* Parameter passed as input of the task */
                    1,                /* Priority of the task. */
                    NULL);            /* Task handle. */
}

void loop() {
  delay(1000);
}

void taskOne( void * parameter )

{
    for( int i = 0;i<10;i++ ){
        Serial.println("Hello from task 1");
        
        delay(1000);
    }
    Serial.println("Ending task 1");
    vTaskDelete( NULL );
}

void taskTwo( void * parameter)

{
    for( int i = 0;i<10;i++ ){
        Serial.println("Hello from task 2");

        delay(1000);
    }
    Serial.println("Ending task 2");
    vTaskDelete( NULL );
}


  • 串口打印

以上是关于ESP32 Arduino双核编程示例的主要内容,如果未能解决你的问题,请参考以下文章

Arduino框架下 ESP32看门狗使用示例

Arduino框架下ESP32重启原因串口信息输出示例

ESP-总体理解(arduino-esp32)

Arduino ESP32 读写查看SD信息示例

Arduino ESP32 读取Micro sd卡容量信息示例

ESP32C3基于Arduino框架下的 ESP32 RainMaker开发示例教程