• 如何使双核心的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,使得我们在设计并行功能的应用时简化了程序,提高了效率。例如,使用一个内核获取传感器读数,使用另一个内核根据读数执行其他的任务功能。

  • 相关阅读:
    Tronapi-波场接口-源码无加密-可二开--附接口文档-基于ThinkPHP5封装-作者详细指导-2022年7月1日08:43:06
    Linux 安装python 3.8(Linux 的版本为 Centos 7)
    Ubuntu 无法定位软件包 yum (添加镜像后还出现)
    NC61 两数之和
    iptables(11)target(SNAT、DNAT、MASQUERADE、REDIRECT)
    数据结构(高阶)—— 二叉搜索树
    《动手学深度学习 Pytorch版》 7.6 残差网络(ResNet)
    最近面试 Java 开发的感受:就以平时项目经验面试,通过估计很难
    如何进行Java项目的构建和部署?
    轻量级 Java 日志组件
  • 原文地址:https://blog.csdn.net/qq_42250136/article/details/133929303