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

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

3天内不再提示

ESP32学习笔记:双核

CHANBAEK 来源:跳动的字节 作者:晓宇 2023-07-15 16:16 次阅读

今天我们来说说ESP32 for Arduino 的双核。

ESP32的双核

ESP32上是有两个核心的,配备了2个 Xtensa 32 位 LX6 微处理器:核心0和核心1,默认是运行在核心1的,我们可以在代码中创建一个任务在核心0上面运行,进行并行的多任务处理。

我们看一下官方的芯片资源框图,这里是有两个Core的:

图片

我们可以通过一个函数来识别代码在哪个内核中运行

xPortGetCoreID()

这个函数会返回运行的Core ID号。

我们通过以下代码测试一下

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());
}

我们看一下打印的情况

70458680f79e054fe3fbba6ce0323ae8.png

Arduino for ESP32是运行在FreeRTOS实时操作系统上的,我们的loop()函数就是内核1的一个任务,我们在创建任务的时候,可以指定运行在哪个核心。下面的需要一点FreeRTOS的基础,如果没接触的可以先自行了解一下,这里推荐野火的《FreeRTOS内核实现与应用开发实战指南》这本书,讲的非常棒!

新建任务

创建任务句柄

我们这里创建一个Task1

TaskHandle_t Task1;

创建任务

设置任务的执行函数,优先级,堆栈大小,运行在哪个内核等参数

xTaskCreatePinnedToCore(
      Task1code, /* Function to implement the task */
      "Task1", /* Name of the task */
      10000,  /* Stack size in words */
      NULL,  /* Task input parameter */
      0,  /* Priority of the task */
      &Task1,  /* Task handle. */
      0); /* Core where the task should run */

具体的任务函数

这里是一个无限循环,任务1的代码在这里实现,然后每隔一段时间片,就去执行当前更高优先级的任务。

Void Task1code( void * parameter) {
  for(;;) {
    Code for task 1 
    (...)
  }
}

任务删除

vTaskDelete(Task1);

多任务案例

下面的代码,我们以不同的时间让LED灯闪烁,然后Task1运行在core0,Task运行在core1。

/*
 *      Created on: 20220316      
 *      Author:     公众号:跳动的字节
 *      Function    12 ESP32的双核
 *      Version:    V1.0
 *
 *                        ,%%%%%%%%,
 *                      ,%%/%%%%/%%
 *                     ,%%%c''''J/%%%
 *           %.        %%%%/ o  o %%%
 *           `%%.      %%%%       |%%%
 *            `%%      `%%%%(__Y__)%%'
 *            //        ;%%%%`-/%%%'
 *            ((      /   `%%%%%%%'
 *                  .'           |
 *                 /          | |
 *               /          ) | |
 *                          /_ | |__
 *                (____________))))))) 攻城狮
 *
 */
 
TaskHandle_t Task1;
TaskHandle_t Task2;

// LED pins
const int led1 = 2;
const int led2 = 4;

void setup() {
  Serial.begin(115200); 
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);

  //create a task that will be executed in the Task1code() function, with priority 1 and executed on core 0
  xTaskCreatePinnedToCore(
                    Task1code,   /* Task function. */
                    "Task1",     /* name of task. */
                    10000,       /* Stack size of task */
                    NULL,        /* parameter of the task */
                    1,           /* priority of the task */
                    &Task1,      /* Task handle to keep track of created task */
                    0);          /* pin task to core 0 */                  
  delay(500); 

  //create a task that will be executed in the Task2code() function, with priority 1 and executed on core 1
  xTaskCreatePinnedToCore(
                    Task2code,   /* Task function. */
                    "Task2",     /* name of task. */
                    10000,       /* Stack size of task */
                    NULL,        /* parameter of the task */
                    1,           /* priority of the task */
                    &Task2,      /* Task handle to keep track of created task */
                    1);          /* pin task to core 1 */
    delay(500); 
}

//Task1code: blinks an LED every 1000 ms
void Task1code( void * pvParameters ){
  Serial.print("Task1 running on core ");
  Serial.println(xPortGetCoreID());

  for(;;){
    digitalWrite(led1, HIGH);
    delay(1000);
    digitalWrite(led1, LOW);
    delay(1000);
  } 
}

//Task2code: blinks an LED every 500 ms
void Task2code( void * pvParameters ){
  Serial.print("Task2 running on core ");
  Serial.println(xPortGetCoreID());

  for(;;){
    digitalWrite(led2, HIGH);
    delay(500);
    digitalWrite(led2, LOW);
    delay(500);
  }
}

void loop() {
  
}

实际效果

串口打印:

图片

硬件连接非常简单,IO2与IO4各接一个LED灯即可,我们看看效果:

图片

led1每1秒闪烁一次,led2每500ms闪烁一次,这样就是真正的两个内核同时运行两个不同的任务。

到这里,12篇基础教程已经讲完了,大家对ESP32也有所了解了,接下来我们讲进阶教程,开始玩起WiFi和蓝牙以及各种传感器以及屏幕等,有了WiFi,我们就可以与外界进行通信,能做一些超级好玩的项目。

感谢大家,关于ESP32的学习,希望大家Enjoy!

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

    关注

    453

    文章

    50360

    浏览量

    421646
  • 微处理器
    +关注

    关注

    11

    文章

    2247

    浏览量

    82307
  • 双核
    +关注

    关注

    0

    文章

    37

    浏览量

    15179
  • Arduino
    +关注

    关注

    187

    文章

    6463

    浏览量

    186615
  • ESP32
    +关注

    关注

    17

    文章

    955

    浏览量

    17069
收藏 人收藏

    评论

    相关推荐

    基于Arduino IDE进行的ESP32编程方案

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

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

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

    ESP32ESP-IDF学习笔记

    ESP32ESP-IDF 学习笔记(六)【I2C数据总线(I²C)】文章目录ESP32ESP
    发表于 02-22 07:30

    请问ESP32-DevKitM-1开发板是单核还是

    ESP32-MINI-1 模块,根据文档 ( https://www.espressif.com/sites/default ... eet_en.pdf ),它是一个微处理器:1.1 特点CPU 和片上
    发表于 03-01 07:05

    ESP32-WROOM-32E和ESP32-WROOM-32UE模组的区别

    ESP32-WROOM系列模组基于 ESP32-D0WD 芯片设计,适用于基于 Wi-Fi 和蓝牙连接的应用场景,具备强大的
    发表于 06-01 16:41 1.9w次阅读
    <b class='flag-5'>ESP32</b>-WROOM-32E和<b class='flag-5'>ESP32</b>-WROOM-32UE模组的区别

    ESP32 开发笔记(四)LVGL控件学习 Window 窗口控件 X

    ESP32 开发笔记(四)LVGL控件学习 Window 窗口控件 X
    发表于 11-14 09:06 6次下载
    <b class='flag-5'>ESP32</b> 开发<b class='flag-5'>笔记</b>(四)LVGL控件<b class='flag-5'>学习</b> Window 窗口控件 X

    ESP32CPU,利用0实现蓝牙打印机打印,1完成常规控制

    来实现ESP32的蓝牙打印机打印目的程序编制总结目的开发一个仪表,在使用过程中发现用ESP32控制打印机和主控制有冲突,会造成数据采集流程慢。而控制蓝牙打印的过程需要回调函数,速
    发表于 11-30 17:51 14次下载
    <b class='flag-5'>ESP32</b><b class='flag-5'>双</b><b class='flag-5'>核</b>CPU,利用<b class='flag-5'>核</b>0实现蓝牙打印机打印,<b class='flag-5'>核</b>1完成常规控制

    [ESP32]学习笔记02

    [ESP32学习笔记02]使用ViusalStudio2017开发ESP32、按键输入检测前言一、安装Visual Studio 2017二、配置开发环境1.安装ViusalGDB2.
    发表于 12-03 17:36 23次下载
    [<b class='flag-5'>ESP32</b>]<b class='flag-5'>学习</b><b class='flag-5'>笔记</b>02

    [ESP32]学习笔记04

    Analog-to-Digital Converter(模数转换器)的使用今天我们学习ESP32提供的ADC外设的使用,ESP32的每个ADC单元都支持两种模式,单次读取和连续读取(DMA),本次
    发表于 12-22 19:02 9次下载
    [<b class='flag-5'>ESP32</b>]<b class='flag-5'>学习</b><b class='flag-5'>笔记</b>04

    SPI主线协议——ESP32学习笔记

    目录SPI主线协议——ESP32学习笔记零、前言一、什么是SPI?二、通信过程​三、极性和相位四、总结SPI主线协议——ESP32学习
    发表于 12-22 19:23 18次下载
    SPI主线协议——<b class='flag-5'>ESP32</b><b class='flag-5'>学习</b><b class='flag-5'>笔记</b>

    ESP32 单片机学习笔记 - 04 - ADC和定时器

    ESP32 单片机学习笔记 - 04 - ADC和定时器一、模拟数字转换器 ADC编程指南:Analog to Digital Converter。数据手册: ESP32 技术参考手册
    发表于 01-17 13:18 11次下载
    <b class='flag-5'>ESP32</b> 单片机<b class='flag-5'>学习</b><b class='flag-5'>笔记</b> - 04 - ADC和定时器

    如何使用Arduino IDE进行ESP32编程

    ——它的名字是ESP32。它具有蓝牙和 Wi-Fi 连接,我们已经解释了 ESP32 的 BLE 功能,并在许多物联网项目中使用了 ESP32 。但很少有人知道ESP32
    的头像 发表于 08-18 17:20 2.6w次阅读
    如何使用Arduino IDE进行<b class='flag-5'>ESP32</b><b class='flag-5'>双</b><b class='flag-5'>核</b>编程

    基于ESP-WROOM-32E专为IoT设计的FireBeetle ESP32-E主控板介绍

    它就是来自DFRobot的基于ESP-WROOM-32E芯片、专为IoT设计FireBeetle ESP32-E主控板。
    的头像 发表于 10-09 11:46 4840次阅读

    ESP32上的深度强化学习

    电子发烧友网站提供《ESP32上的深度强化学习.zip》资料免费下载
    发表于 12-27 10:31 0次下载
    <b class='flag-5'>ESP32</b>上的深度强化<b class='flag-5'>学习</b>

    ESP32学习笔记:WiFi

    今天我们来说说ESP32 的WiFi。
    的头像 发表于 07-15 16:20 3722次阅读
    <b class='flag-5'>ESP32</b><b class='flag-5'>学习</b><b class='flag-5'>笔记</b>:WiFi