12、ESP32 双核

本文介绍了如何在ESP32的双核架构上使用ArduinoIDE和FreeRTOS创建并调度任务,包括设置任务优先级、代码示例以及在不同核心上控制LED灯的操作。
摘要由CSDN通过智能技术生成

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()
{
}
  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

无敌暴龙战士朵拉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值