把稳: 您不一定须要运行双核才能实现多任务处理。
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 的波特率打开串行监视器
创建任务
创建任务时,可以选择它将在哪个核心中运行以及其优先级。优先级值从 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 的波特率打开串行监视器。该当收到以下: