• 如何使双核心的ESP32开启双核功能同时执行多任务


    如何使双核心的ESP32开启双核功能同时执行多任务

    简介

    在这里插入图片描述

    ESP32-WROOM-32模组内置两个低功耗 Xtensa® 32-bit LX6 MCU,两个 CPU 核(core 0与core 1)可以被单独控制。可以在两个内核上同时运行多段代码,让ESP32实现多任务(执行某些事情的代码片段)处理。Arduino IDE默认情况下启用的是core 1。ESP32可以运行实时操作系统RTOS,并行的处理几个独立运行的任务。要将代码的特定部分分配给特定的内核,需要创建任务。当创建一个任务时,可以选择它将在哪个内核中运行,以及它的优先级。优先级值从0开始,其中0是最低优先级。处理器将首先运行优先级较高的任务。

    在这里插入图片描述

    查看ESP32当前哪一个内核在执行任务

    打开Arduino IDE并给ESP32上传如下代码
    调用xPortGetCoreID()函数,可以获取内核号

    void setup() {
      Serial.begin(115200);
      Serial.print("setup() running on core ");
      Serial.println(xPortGetCoreID());
    }
    
    void loop() {
      Serial.print("loop() running on core ");
      Serial.println(xPortGetCoreID());
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    打开串口监视器即可查看ESP32当前内核1正在执行任务
    在这里插入图片描述

    双核同时执行任务

    打开Arduino IDE并给ESP32上传如下代码

    TaskHandle_t Task1;
    TaskHandle_t Task2;
    
    // LED pins
    const int led1 = 2;
    const int led2 = 4;
    void setup() {
    Serial.begin(115200); 
    pinMode(led1, OUTPUT);
    pinMode(led2, OUTPUT);
    
      //create a task that will be executed in the Task1code() function, with priority 1 and executed on core 0
      xTaskCreatePinnedToCore(
                        Task1code,   /* Task function. */
                        "Task1",     /* name of task. */
                        10000,       /* Stack size of task */
                        NULL,        /* parameter of the task */
                        1,           /* priority of the task */
                        &Task1,      /* Task handle to keep track of created task */
                        0);          /* pin task to core 0 */                  
      delay(500); 
    
      //create a task that will be executed in the Task2code() function, with priority 1 and executed on core 1
      xTaskCreatePinnedToCore(
                        Task2code,   /* Task function. */
                        "Task2",     /* name of task. */
                        10000,       /* Stack size of task */
                        NULL,        /* parameter of the task */
                        1,           /* priority of the task */
                        &Task2,      /* Task handle to keep track of created task */
                        1);          /* pin task to core 1 */
        delay(500); 
    }
    
    //Task1code: blinks an LED every 1000 ms
    void Task1code( void * pvParameters ){
      Serial.print("Task1 running on core ");
      Serial.println(xPortGetCoreID());
    
      for(;;){
        digitalWrite(led1, HIGH);
        delay(1000);
        digitalWrite(led1, LOW);
        delay(1000);
      } 
    }
    
    //Task2code: blinks an LED every 700 ms
    void Task2code( void * pvParameters ){
      Serial.print("Task2 running on core ");
      Serial.println(xPortGetCoreID());
    
      for(;;){
        digitalWrite(led2, HIGH);
        delay(700);
        digitalWrite(led2, LOW);
        delay(700);
      }
    }
    
    void loop() {
      
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63

    本代码实现在内核0上执行让LED1每1000ms间隔闪烁,在内核1上执行让LED2每700ms间隔闪烁。两任务的优先级都为1,同时执行,并在串口监视器上打印出内核信息。若不开启双核执行,采用默认的单核顺序执行,就不能让LED1和LED2同时以不同的间隔闪烁。
    若在任务执行期间,想删除任务,可以调用函数vTaskDelete(Task1)。
    在这里插入图片描述

    总结

    带有双核功能的ESP32,使得我们在设计并行功能的应用时简化了程序,提高了效率。例如,使用一个内核获取传感器读数,使用另一个内核根据读数执行其他的任务功能。

  • 相关阅读:
    React(6)-类组件的setState异步问题
    ES分页查询方式脚本操作
    Java枚举类 (详细解析java中的枚举类深入浅出)
    Java控制结构案例
    CNN经典模型之ALexNet、ResNet、DenseNet总结和比较
    257. 二叉树的所有路径
    浅谈基于云计算的环境智能监控系统
    AUTOSAR知识点 之 SWC (一):基于ETAS工具ISOLAR-AB新建一个SWC并实现与其它SWC通信(动态与静态详细步骤介绍)
    《我在美国学游戏设计》笔记
    d3dx9_43.dll文件缺失的修复方法有哪些?4个方法快速修复d3dx9_43.dll
  • 原文地址:https://blog.csdn.net/qq_42250136/article/details/133929303