把稳: 您不一定须要运行双核才能实现多任务处理。

ESP32 配备 2 个 Xtensa 32 位 LX6 微处理器:

核心0核心1

识别代码在哪个核心中运行函数:

xPortGetCoreID()

/ Rui Santos Complete project details at https://randomnerdtutorials.com /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());}

以 115200 的波特率打开串行监视器

一文学会若安在ESP32上两个核上运行代码

创建任务

创建任务时,可以选择它将在哪个核心中运行以及其优先级。
优先级值从 0 开始,个中 0 是最低优先级。
处理器将首先运行优先级较高的任务。
要创建任务,须要实行以下步骤:

1.创建任务句柄。
任务 1 :

TaskHandle_t Task1;

2.在设置()利用以下命令创建分配给特定核心的任务xTaskCreatePinnedToCore功能。
该函数须要几个参数,包括优先级和任务应运行的核心(末了一个参数)。

xTaskCreatePinnedToCore( Task1code, / Function to implement the task / "Task1", / Name of the task / 10000, / Stack size in words / NULL, / Task input parameter / 0, / Priority of the task / &Task1, / Task handle. / 0); / Core where the task should run /

3.创建任务后,创建一个函数,个中包含所创建任务的代码。
任务函数如下所示:

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

如果在代码实行过程中想删除创建的任务,您以利用vTaskDelete()函数,接管任务句柄(任务1) 作为参数:

vTaskDelete(Task1);在不同内核中创建任务

Task1 运行在 core 0 上;任务2运行在核心1上;

//为 Task1 和 Task2 创建一个名为任务1和任务2。
TaskHandle_t Task1;TaskHandle_t Task2;// LED引脚const int led1 = 2;const int led2 = 4;void setup() { Serial.begin(115200); pinMode(led1, OUTPUT); pinMode(led2, OUTPUT); //利用xTaskCreatePinnedToCore()函数创建 Task1 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); //利用xTaskCreatePinnedToCore()函数创建 Task21 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 msvoid 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 msvoid 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() { }

以 115200 的波特率打开串行监视器。
该当收到以下: