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