如何使用Arduino IDE进行ESP32双核编程

描述

  ESP 模块因其 Wi-Fi 功能而广受欢迎,例如ESP8266、ESP-12E等。这些都是具有 Wi-Fi 功能的强大微控制器模块。还有一个 ESP 模块,它比以前的 ESP 模块更强大、更通用——它的名字是ESP32。它具有蓝牙和 Wi-Fi 连接,我们已经解释了 ESP32 的 BLE 功能,并在许多物联网项目中使用了 ESP32 。但很少有人知道ESP32 是双核微控制器。

  ESP32具有两个 32 位 Tensilica Xtensa LX6 微处理器,这使其成为功能强大的双核(core0 和 core1)微控制器。它有单核和双核两种变体。但双核版本更受欢迎,因为没有明显的价格差异。

编程

  ESP32 可以使用 Arduino IDE、Espressif IDF、Lua RTOS 等进行编程。使用 Arduino IDE 进行编程时,代码只能在 Core1 上运行,因为 Core0 已经针对射频通信进行了编程。但这是本教程,我们将展示如何使用 ESP32的两个内核同时执行两个操作。这里的第一个任务是闪烁板载 LED,第二个任务是从 DHT11 传感器获取温度数据。

  让我们首先看看多核处理器相对于单核的优势。

  多核处理器的优势

  当有两个以上的进程同时工作时,多核处理器很有用。

  由于工作分布在不同的内核之间,它的速度会提高,并且可以同时完成多个进程。

  可以降低功耗,因为当任何内核处于空闲模式时,它都可以用来关闭当时未使用的外围设备。

  双核处理器必须比单核处理器更少地在不同线程之间切换,因为它们可以一次处理两个而不是一次处理一个。

  ESP32 和 FreeRTOS

  ESP32 板上已经安装了 FreeRTOS 固件。FreeRTOS 是一个开源实时操作系统,在多任务处理中非常有用。RTOS 有助于管理资源和最大化系统性能。FreeRTOS 有许多用于不同目的的 API 函数,使用这些 API,我们可以创建任务并使它们在不同的内核上运行。

  可以在此处找到 FreeRTOS API 的完整文档。我们将尝试在代码中使用一些 API 来构建将在两个内核上运行的多任务应用程序。

  查找 ESP32 内核 ID

  在这里,我们将使用Arduino IDE 将代码上传到 ESP32中。要知道运行代码的Core ID,有一个API函数

 

xPortGetCoreID()

 

可以从void setup()和void loop()函数调用此函数,以了解运行这些函数的核心 ID。

您可以通过上传以下草图来测试此 API:

 

无效设置() { 
  Serial.begin(115200);
  Serial.print("setup() 函数在核心上运行:"); 
  Serial.println(xPortGetCoreID()); 
} 
void loop() { 
  Serial.print("loop() 函数在核心上运行:"); 
  Serial.println(xPortGetCoreID()); 
}

 

  上传上面的草图后,打开串口监视器,你会发现这两个功能都在 core1 上运行,如下图所示。

编程

  从以上观察可以得出结论,默认的 Arduino 草图始终在 core1 上运行。

ESP32 双核编程

Arduino IDE 支持 ESP32 的 FreeRTOS,FreeRTOS API 允许我们创建可以在两个内核上独立运行的任务。任务是在板上执行一些操作的代码,例如闪烁的 LED、发送温度等。

以下函数用于创建可以在两个内核上运行的任务。在这个函数中,我们必须给出一些参数,比如优先级、核心 ID 等。

现在,按照以下步骤创建任务和任务功能。

1.首先在void setup函数中创建任务。在这里,我们将创建两个任务,一个用于每 0.5 秒后闪烁 LED,另一个任务是每 2 秒后获取温度读数。

xTaskCreatePinnedToCore() 函数有 7 个参数:

实现任务的函数名(task1)

任务的任何名称(“task1”等)

以字为单位分配给任务的堆栈大小(1 个字=2 字节)

任务输入参数(可以为NULL)

任务的优先级(0为最低优先级)

任务句柄(可以为 NULL)

任务将运行的核心 ID(0 或 1)

现在,通过在 xTaskCreatePinnedToCore() 函数中提供所有参数来创建用于闪烁 LED 的 Task1 。

 

xTaskCreatePinnedToCore(Task1code, "Task1", 10000, NULL, 1, NULL, 0);

 

同样,为 Task2创建 Task2并在第 7个参数中设置 core id 1。

 

xTaskCreatePinnedToCore(Task2code, "Task2", 10000, NULL, 1, NULL, 1);

 

您可以根据任务的复杂性更改优先级和堆栈大小。

2. 现在,我们将实现Task1code和Task2code函数。这些函数包含所需任务的代码。在我们的例子中,第一个任务将闪烁 LED,另一个任务将获取温度。因此,在 void setup 函数之外为每个任务创建两个单独的函数。

Task1code 功能 实现了 0.5 秒后闪烁板载 LED,如下所示。

 

void Task1code( void * parameter) { 
Serial.print("Task1 在核心上运行"); 
Serial.println(xPortGetCoreID()); 
for(;;) {//无限循环
digitalWrite(led, HIGH); 
延迟(500);
digitalWrite(led, LOW);
延迟(500); 
} 
}

 

同样,实现获取温度的Task2code函数。

 

void Task2code( void * pvParameters ){ 
  Serial.print("Task2 在核心上运行"); 
  Serial.println(xPortGetCoreID()); 
  for(;;){
    浮动 t = dht.readTemperature(); 
     Serial.print("温度:"); 
     序列号.print(t); 
   延迟(2000);
  } 
}

 

  3. 这里的void 循环函数将保持为空。我们已经知道循环和设置函数在 core1 上运行,因此您也可以在void 循环函数中实现 core1 任务。

  现在编码部分已经结束,所以只需在工具菜单中选择 ESP32 板,使用 Arduino IDE 上传代码。确保您已将 DHT11 传感器连接到 ESP32 的引脚 D13。

编程

  现在可以在 Serial Monitor 或 Arduino IDE 上监控结果,如下所示:

编程

  通过使用 ESP32 的双核同时运行多个任务,可以构建像实时系统这样的复杂应用。

#include "DHT.h"

#define DHTPIN 13

#define DHTTYPE DHT11

const int led = 2;

DHT dht(DHTPIN, DHTTYPE);

无效设置() {

Serial.begin(115200);

pinMode(LED,输出);

dht.begin();

xTaskCreatePinnedToCore(Task1code, "Task1", 10000, NULL, 1, NULL, 1);

延迟(500);

xTaskCreatePinnedToCore(Task1code, "Task1", 10000, NULL, 1, NULL, 0);

延迟(500);

}

void Task1code( void * pvParameters ){

Serial.print("Task1 在核心上运行");

Serial.println(xPortGetCoreID());

for(;;){

digitalWrite(led, HIGH);

延迟(300);

数字写入(领导,低);

延迟(300);

}

}

void Task2code( void * pvParameters ){

Serial.print("Task2 在核心上运行");

Serial.println(xPortGetCoreID());

for(;;){

浮动 h = dht.readHumidity();

浮动 t = dht.readTemperature();

浮动 f = dht.readTemperature(true);

Serial.print("温度:");

序列号.print(t);

Serial.print(" *C \n ");

if (isnan(h) || isnan(t) || isnan(f)) {

Serial.println("读取 DHT 传感器失败!");

返回;

}

延迟(2000);

}

}

无效循环() {

}
 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分