ESP32 的 Arduino 框架内部集成了 FreeRTOS,允许开发者利用其多任务处理功能。在代码中,xTaskCreatePinnedToCore
函数是 FreeRTOS 提供的 API,用于创建任务并指定任务在哪个核心上运行。
FreeRTOS 是一个流行的实时操作系统内核,广泛用于嵌入式系统中,以实现任务调度、任务间通信和同步等功能。通过使用 FreeRTOS,开发者可以更高效地管理多个并发任务,从而提高系统的性能和响应能力。在 ESP32 的 Arduino 框架中,FreeRTOS 的集成使得开发者可以轻松地创建和管理多任务,而无需深入了解 FreeRTOS 的底层细节。
下面我将编写一个示例,探索ESP32的多任务处理能力。在示例中,我们将创建两个任务——Task1和Task2,分别在ESP32的两个核心上运行。每个任务在其循环中打印当前运行的核心编号,并通过延迟函数模拟任务执行时间。
- 任务函数声明:
Task1
和Task2
是两个任务函数,它们将在不同的核心上运行。 - setup() 函数:初始化串口通信,并使用
xTaskCreatePinnedToCore
函数创建两个任务,分别在核心0和核心1上运行。 - loop() 函数:主循环可以保持空闲,或者执行其他任务。在这个示例中,主循环只是简单地延迟1秒钟。
- Task1 和 Task2 函数:这两个函数分别在不同的核心上无限循环,每秒钟打印一次当前运行的核心编号。
- 堆栈大小:
10000
是任务的堆栈大小,可以根据实际需求进行调整。 - 任务优先级:
1
是任务的优先级,可以根据实际需求进行调整。 - 核心编号:
0
和1
分别表示核心0和核心1。
详细代码如下:
#include "Arduino.h"
// 任务函数声明
void Task1(void *pvParameters);
void Task2(void *pvParameters);
void setup() {
Serial.begin(115200);
delay(1000); // 等待串口监视器启动
// 创建任务1,在核心0上运行
xTaskCreatePinnedToCore(
Task1, // 任务函数
"Task1", // 任务名称
10000, // 堆栈大小
NULL, // 任务参数
1, // 任务优先级
NULL, // 任务句柄
0); // 核心编号
// 创建任务2,在核心1上运行
xTaskCreatePinnedToCore(
Task2, // 任务函数
"Task2", // 任务名称
10000, // 堆栈大小
NULL, // 任务参数
1, // 任务优先级
NULL, // 任务句柄
1); // 核心编号
}
void loop()
{
delay(1000);
}
// 任务1函数
void Task1(void *pvParameters) {
for (;;) {
Serial.println("Task1 running on Core: " + String(xPortGetCoreID()));
delay(1000); // 模拟任务执行时间
}
}
// 任务2函数
void Task2(void *pvParameters) {
for (;;) {
Serial.println("Task2 running on Core: " + String(xPortGetCoreID()));
delay(1000); // 模拟任务执行时间
}
}
打开串口调试助手,可以看到结果如下: