0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

科技观察员 来源:circuitdigest 作者:Rishabh Jain 2022-08-18 17:20 次阅读

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

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

poYBAGL-BAGAFpCuAAKatiyngPU771.png

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 上运行,如下图所示。

pYYBAGL-A_yABBkPAAJ154y7KcI484.png

从以上观察可以得出结论,默认的 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。

poYBAGL-A_aATqrmAAIIzDXrRW0533.png

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

poYBAGL-A_KACR4cAANFKpPKSiE091.png

通过使用 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);

}

}

无效循环() {

}

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

    关注

    48

    文章

    6897

    浏览量

    148722
  • 编程
    +关注

    关注

    88

    文章

    3474

    浏览量

    92852
  • Arduino
    +关注

    关注

    186

    文章

    6439

    浏览量

    185449
  • ESP32
    +关注

    关注

    13

    文章

    906

    浏览量

    16265
收藏 人收藏

    评论

    相关推荐

    基于Arduino IDE进行ESP32编程方案

    称为ESP32。它具有蓝牙和Wi-Fi连接,并在许多物联网项目中使用了ESP32。但是很少有人知道ESP32是双核微控制器。 ESP32具有两个32位Tensilica Xtensa
    的头像 发表于 01-09 11:25 1.6w次阅读
    基于<b class='flag-5'>Arduino</b> <b class='flag-5'>IDE</b><b class='flag-5'>进行</b>的<b class='flag-5'>ESP32</b><b class='flag-5'>编程</b>方案

    使用Arduino IDE对NodeMCU进行编程实现led灯的闪烁

    在本教程中,我们将了解 ESP-12 Wi-Fi 模块以及如何使用 Arduino IDE 对其进行编程。然后我们将编写一个程序来使用
    的头像 发表于 11-15 17:03 3433次阅读

    【FireBeetle 2 ESP32-S3开发板测评】Arduino IDE快速开发体验

    【FireBeetle 2 ESP32-S3开发板测评】Arduino IDE快速开发体验
    的头像 发表于 07-23 09:03 1824次阅读
    【FireBeetle 2  <b class='flag-5'>ESP32</b>-S3开发板测评】<b class='flag-5'>Arduino</b> <b class='flag-5'>IDE</b>快速开发体验

    请问ESP32如何使用队列进行任务间通信?

    队列是什么?ESP32如何使用队列进行任务间通信?
    发表于 01-14 07:24

    如何用来实现ESP32的蓝牙打印机打印

    ,考虑到ESP32具有两个,实际上我们用Arduino进行编程时只使用到了第一个,第0
    发表于 01-25 08:05

    Arduino-IDE配置ESP32开发环境的正确方式

    Arduino-IDE配置ESP32-CAM开发环境踩过的那些坑Arduino-IDE配置ESP32开发环境踩过的那些坑坑一IDE下载开发版
    发表于 01-25 07:40

    如何使用Arduino IDEESP8266进行编程

    您好,我正在使用 Arduino IDEESP8266 进行编程。我现在需要开始使用 RTOS 为
    发表于 02-23 07:48

    arduino ide中安装esp32arduino框架时的问题求解

    arduino ide中安装esp32arduino框架时的问题在arduino ide中安
    发表于 03-06 08:22

    esp32arduino的区别,esp32能否替代arduino

    很多创客爱好者甚至有些技术工程师在理解esp32arduino的时候总是问一句这两块板子哪个更好用?他们可能潜意识中就觉得arduinoesp32是竞品的关系,但实际是这样吗?今天
    发表于 06-24 17:11 2.5w次阅读

    Arduino-IDE配置ESP32-CAM开发环境踩过的那些坑

    Arduino-IDE配置ESP32-CAM开发环境踩过的那些坑
    发表于 11-30 18:36 24次下载
    <b class='flag-5'>Arduino-IDE</b>配置<b class='flag-5'>ESP32</b>-CAM开发环境踩过的那些坑

    Arduino IDE环境下用ESP32控制多路LED调光

    ESP32带一个包含16通道LED PWM控制器,可配置以产生不同特性的PWM信号。项目开始之前需要先安装Arduino IDE,连接妥当后就可以把ESP32 DOIT DEVKIT
    发表于 03-17 11:04 4054次阅读

    如何使用Arduino IDEESP32进行无线编程

    在本教程中,我们将使用Arduino IDE 中的 OTA Web Updater对 ESP32 进行无线 (OTA) 编程
    发表于 08-11 15:42 4591次阅读
    如何使用<b class='flag-5'>Arduino</b> <b class='flag-5'>IDE</b>对<b class='flag-5'>ESP32</b><b class='flag-5'>进行</b>无线<b class='flag-5'>编程</b>

    使用Arduino通过USB串行对ESP32S3进行编程和调试

    电子发烧友网站提供《使用Arduino通过USB串行对ESP32S3进行编程和调试.zip》资料免费下载
    发表于 10-19 14:50 2次下载
    使用<b class='flag-5'>Arduino</b>通过USB串行对<b class='flag-5'>ESP32</b>S3<b class='flag-5'>进行</b><b class='flag-5'>编程</b>和调试

    使用Arduino IDE和Visuino对ESP32 M5Stack StickC进行编程

    电子发烧友网站提供《使用Arduino IDE和Visuino对ESP32 M5Stack StickC进行编程.zip》资料免费下载
    发表于 11-21 09:49 0次下载
    使用<b class='flag-5'>Arduino</b> <b class='flag-5'>IDE</b>和Visuino对<b class='flag-5'>ESP32</b> M5Stack StickC<b class='flag-5'>进行</b><b class='flag-5'>编程</b>

    如何在Arduino IDE中安装ESP32开发环境

    要在Arduino IDE中使用ESP32开发板,您需要先安装相应的开发环境。以下是在Arduino IDE中安装
    的头像 发表于 07-13 16:48 1.4w次阅读
    如何在<b class='flag-5'>Arduino</b> <b class='flag-5'>IDE</b>中安装<b class='flag-5'>ESP32</b>开发环境