无敌暴龙战士朵拉

无敌暴龙战士朵拉

1、双核介绍

        ESP32 配备 2 个 Xtensa 32 位 LX6 微处理器:核心 0 和核心 1。当我们在Arduino IDE上运行代码时,默认情况下,它运行在内核1上。

        有一个函数可用于标识代码在哪个核心中运行:xPortGetCoreID();

        运行下面代码就可以发现 setup 和 loop 在核心 1 上运行。

#include <Arduino.h>

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());
}

12、ESP32 双核-LMLPHP


2、创建任务

        Arduino IDE 支持 ESP32 的 FreeRTOS,ESP32 是一个实时操作系统,使我们能够并行处理多个独立运行的任务。

        任务优先级值从 0 开始,其中 0 是最低优先级。

创建任务:

        1、创建任务句柄。

                TaskHandle_t Task1;

        2、 在 setup 创建一个分配给特定核心的任务,使用 xTaskCreatePinnedToCore 功能。该函数采用多个参数,包括优先级和任务应运行的核心(最后一个参数)。

                xTaskCreatePinnedToCore(

                        Task1code, /* 函数来实现任务 */

                        "Task1", /* 任务名称 */

                        10000, /* 堆栈大小(以字表示) */

                        NULL, /* 任务输入参数 */

                        0, /* 任务的优先级 */

                        &Task1, /* 任务处理 */

                        0 /* 核心任务运行的位置 */ );

        3、 创建任务后,创建一个包含所创建任务代码的无限循环函数。

Void Task1code( void * parameter)
{
    for(;;)
    {
        Code for task 1 - infinite loop
        (...)
    }
}

         4、如果在代码执行期间要删除创建的任务,则可以使用 vTaskDelete(&Task) 函数。

                vTaskDelete(Task1);


3、Code

        示例:在不同内核中创建任务

  • Task1 在核心 0 上运行,点亮 led;
  • Task2 在核心 1 上运行,点亮 led;
#include <Arduino.h>

TaskHandle_t Task1;
TaskHandle_t Task2;

const int led1 = 2;     // LED pins
const int led2 = 4;     // LED pins


void Task1code(void * pvParameters )
{
    Serial.print("Task1 running on core ");
    Serial.println(xPortGetCoreID());

    for(;;)
    {
        digitalWrite(led1, HIGH);
        delay(1000);
        digitalWrite(led1, LOW);
        delay(1000);
    } 
}

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 setup()
{
    Serial.begin(115200); 

    pinMode(led1, OUTPUT);
    pinMode(led2, OUTPUT);

    // Task1code
    xTaskCreatePinnedToCore(
                    Task1code,   /* 函数名 */
                    "Task1",     /* 任务名 */
                    10000,       /* 堆栈大小 */
                    NULL,        /* 任务参数 */
                    1,           /* 优先级 */
                    &Task1,      /* 任务处理 */
                    0);          /* 运行位置 */                  
    delay(500); 

    // Task2code
    xTaskCreatePinnedToCore(Task2code, "Task2", 1024, NULL, 1, NULL, 1);
    delay(500); 
}


void loop()
{
}
04-18 19:26