写在前面
ESP32集成了两个 Tensilica Xtensa LX6 微处理器(核心0和核心1)。
FreeRTOS作为ESP32的操作系统,提供了多任务支持,可以使得这两个核心同时工作。在不使用FreeRTOS的情况下,程序默认跑在核心1上,而核心0主要运行WIFI和bluetooth;如果我们的项目不频繁使用WIFI蓝牙,建议使用多核工作模式,提高我们单片机性能。
开发者可以在 ESP32 的两个核心上并行运行不同的任务,从而显著提高整体性能,尤其是在需要执行大量计算任务或者对实时性要求较高的场景下。
在 ESP32 的双核编程中,每个核心都可以独立运行自己的任务,这些任务可以共享内存或拥有独立的内存区域。开发者需要确保在多个核心之间共享数据时同步和互斥的正确实现,以避免数据竞争和不一致。
测试代码
//定义任务句柄
TaskHandle_t Task0_Handler;
TaskHandle_t Task1_Handler;
void setup()
{
//开启串口
Serial.begin(115200);
//创建并启动Core0的任务
xTaskCreatePinnedToCore(
Task0, /* 任务函数 */
"Task0", /* 任务名称 */
1024 * 1, /* 栈大小 */
NULL, /* 任务参数 */
1, /* 任务优先级 */
&Task0_Handler, /* 任务句柄 */
0); /* Core 0 */
//创建并启动Core1的任务
xTaskCreatePinnedToCore(
Task1, /* 任务函数 */
"Task1", /* 任务名称 */
1024 * 1, /* 栈大小 */
NULL, /* 任务参数 */
1, /* 任务优先级 */
&Task1_Handler, /* 任务句柄 */
1); /* Core 1 */
}
void loop()
{
// Empty. Things are done in Tasks.
}
//Task0的实现
void Task0(void *pvParameters)
{
while(1)
{
//核心0的任务逻辑
vTaskDelay(1000 / portTICK_PERIOD_MS);
Serial.print("Task0 running on core ");
Serial.println(xPortGetCoreID());
}
}
Task1的实现
void Task1(void *pvParameters)
{
while(1)
{
//核心1的任务逻辑
vTaskDelay(1000 / portTICK_PERIOD_MS);
Serial.print("Task1 running on core ");
Serial.println(xPortGetCoreID());
}
}
测试结果
参考
3.在ESP32上充分利用双核的FreeRTOS多核编程_esp32双核编程-CSDN博客
如何使双核心的ESP32开启双核功能同时执行多任务_esp32s3开双核-CSDN博客
标签:Task0,Task1,ESP32,编程,任务,void,双核 From: https://blog.csdn.net/ssismm/article/details/136843918