首页 > 编程语言 >使用Arduino IDE对ESP32双核进行编程

使用Arduino IDE对ESP32双核进行编程

时间:2023-05-27 20:33:38浏览次数:54  
标签:函数 Arduino ESP32 任务 内核 Serial IDE void

使用Arduino IDE对ESP32双核进行编程 [复制链接]

qrcode

ESP32 FreeRTOS

查看: 22988 | 回复: 0

风筝   发表于: 2020-1-17 22:23:45|只看该作者|只看大图|倒序浏览 楼主

 

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


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

 


可以使用Arduino IDE、Espressif IDF、Lua RTOS等对ESP32进行编程。使用Arduino IDE进行编程时,由于Core0已编程用于RF通信,因此代码仅在Core1上运行。但是在本篇文章中,我们将展示如何使用ESP32的两个内核同时执行两项操作。在这里,第一个任务是使板载LED闪烁,第二个任务是从DHT11传感器获取温度数据。


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


多核处理器的优势

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

2.  由于工作分布在不同的内核之间,因此速度提高了,并且可以同时完成多个过程。

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

4.  与单核处理器相比,双核处理器在不同线程之间切换的频率更低,因为它们可以一次处理两个,而不是一次处理一个线程。


ESP32和FreeRTOS

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


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


查找ESP32内核ID

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

  1. xPortGetCoreID()
复制代码

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


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

  1. void setup() {
  2.   Serial.begin(115200);
  3.   Serial.print("setup() function running on core: ");
  4.   Serial.println(xPortGetCoreID());
  5. }
  6. void loop() {
  7.   Serial.print("loop() function running on core: ");
  8.   Serial.println(xPortGetCoreID());
  9. }
复制代码

上传完上述草图后,打开串口监视器,您会发现这两个函数都在core1上运行,如下所示。

 


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


ESP32双核编程

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


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


现在,按照以下步骤创建任务和任务函数。


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


xTaskCreatePinnedToCore()函数使用7个参数:

●    实现任务的函数名称(task1)

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

●    分配给任务的堆栈大小,以字为单位

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

●    任务的优先级(0是最低优先级)

●    任务句柄(可以为NULL)

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


现在,通过在xTaskCreatePinnedToCore()函数中提供所有参数来创建Task1,以使指示灯闪烁。

  1. xTaskCreatePinnedToCore(Task1code, "Task1", 10000, NULL, 1, NULL,  0);
复制代码

同样,为任务2创建Task2,并在第7个参数中将内核ID设置为1。

  1. xTaskCreatePinnedToCore(Task2code, "Task2", 10000, NULL, 1, NULL,  1);
复制代码

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


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

Task1code函数实现了0.5秒后板上LED闪烁,如下所示:

  1. Void Task1code( void * parameter) {
  2. Serial.print("Task1 running on core ");
  3. Serial.println(xPortGetCoreID());
  4. for(;;) {//infinite loop
  5. digitalWrite(led, HIGH);
  6. delay(500);
  7. digitalWrite(led, LOW);
  8. ​​delay(500);
  9. }
  10. }
复制代码

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

  1. void Task2code( void * pvParameters ){
  2.   Serial.print("Task2 running on core ");
  3.   Serial.println(xPortGetCoreID());
  4.   for(;;){
  5.     float t = dht.readTemperature();
  6.      Serial.print("Temperature: ");
  7.      Serial.print(t);
  8.    delay(2000);
  9.   }
  10. }
复制代码

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


现在代码部分已经结束,因此只需在“Tool”菜单中选择ESP32板,即可使用Arduino IDE上传代码。 确保已将DHT11传感器连接到ESP32的D13引脚。

标签:函数,Arduino,ESP32,任务,内核,Serial,IDE,void
From: https://www.cnblogs.com/aker-whale/p/17437288.html

相关文章

  • Idea 的下载安装和使用
    1.下载https://www.jetbrains.com.cn/idea/download/#section=windows可以先下载社区版本,最终版需要付费。如果想下载之前版本,可以选择其他本版,这里我选择的是2021.3.3的版本;2.导入已经存在的maven项目已经进入的情况:file-->new-->projectfromexistingsource.... ......
  • IDEA 中 Maven 自动构建错误
    「构建」页签是正常的,但是「自动构建」页签报错:英文:Error:MavenResourcesCompiler:Mavenprojectconfigurationrequiredformodule'module-name'isn'tavailable.CompilationofMavenprojectsissupportedonlyifexternalbuildisstartedfromanIDE.中文:......
  • 29. Divide Two Integers刷题笔记
    参考的题解classSolution:defdivide(self,dividend:int,divisor:int)->int:positive=(dividend<0)is(divisor<0)dividend,divisor=abs(dividend),abs(divisor)res=0whiledividend>=divisor:......
  • Spider理论系列--Scrapy框架介绍
    Scrapy框架一、前言无论什么技术,都是有框架的,而框架我的理解就是程序员为了简化开发而封装好的一个集合。而本次的Scrapy框架就是封装好的爬虫框架。1、介绍前面我们学习了基础的爬虫实现方法和selenium以及mongodb数据库,那么接下来会我们学习一个上场率非常高的爬虫框架:scrapy2、......
  • 解决:idea执行main方法都要build的情况
    开发代码中,很多时候我们为了验证一小段代码逻辑会直接写个main方法去执行,看看运行结果,最近发现idea跑个main方法都要执行compileJava和build,连最普通的打印hellworld都需要下载maven虽然最终打印出来了,但是也经历了一次build过程。。。 解决方案:请移步:http://124.222.12......
  • IntelliJ IDEA 中如何查看一个类的所有继承关系,包括父类与子类
    一、查看当前类所有的父类1、找到当前类所在的位置,右键选择Diagrams,然后选择ShowDiagrams……,以spring的ClassPathXmlApplicationContext类为例: 2、在弹出的框中选择JavaClassDiagrams:3、可以看到如下的结果,所有的父类继承关系: 二、查看当前所有的子类请移步我的博......
  • 解决:idea打开项目后白屏的问题
    网上查了各种资料,试了试一些大佬的方法如:重启idea,重启电脑,删除.idea文件,修改idea64.exe.vmoptions的配置参数等,还是不行,不适合我的情况,浪费了我很长时间,到最后甚至想要重装idea,最后再机缘巧合之下才恢复过来。是一个非常奇葩的问题。解决:http://124.222.123.110:8080/20230517000......
  • arduino esp32 ds18b20 实例代码
    #include<OneWire.h>#include<DallasTemperature.h>//引脚定义#defineONE_WIRE_BUS15//库引用实例OneWireoneWire(ONE_WIRE_BUS);DallasTemperaturesensors(&oneWire);voidsetup(void){Serial.begin(9600);sensors.begin();}voidloop(vo......
  • How to fix CMake error Could not find a package configuration file provided by
    CMakeErrorat/usr/lib/x86_64-linux-gnu/cmake/Boost-1.71.0/BoostConfig.cmake:117(find_package):Couldnotfindapackageconfigurationfileprovidedby"boost_filesystem"(requestedversion1.71.0)withanyofthefollowingnames:boos......
  • idea显示springboot多服务启动界面service
    如果是多模块的微服务,idea提供了一个可以多服务启动的界面services,如果你的项目里没看到这个界面:那么你需要在顶级的maven工程中找到这个配置,然后找到componentname="RunDashboard"这个节点整个替换掉:<componentname="RunDashboard"><optionname="configurationTypes">......