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!

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

    关注

    447

    文章

    47802

    浏览量

    409169
  • 微处理器
    +关注

    关注

    11

    文章

    2133

    浏览量

    81421
  • 双核
    +关注

    关注

    0

    文章

    37

    浏览量

    15066
  • Arduino
    +关注

    关注

    184

    文章

    6428

    浏览量

    184845
  • ESP32
    +关注

    关注

    13

    文章

    896

    浏览量

    15815
收藏 人收藏

    评论

    相关推荐

    TFT 屏幕的使用——ESP32学习笔记(番外)

    零、前言最近在搞tft屏幕,遇到了非常多的困难,这个笔记主要帮助的是和我一样比较小白的单片机初学者,在这里我用到的板子是ESP32,用的屏幕是单工SPI通信协议的一块屏幕。一、准备工作在这里我们准备
    发表于 11-30 17:21 89次下载
    TFT 屏幕的使用——<b class='flag-5'>ESP32</b><b class='flag-5'>学习</b><b class='flag-5'>笔记</b>(番外)

    [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 17次下载
    SPI主线协议——<b class='flag-5'>ESP32</b><b class='flag-5'>学习</b><b class='flag-5'>笔记</b>

    启明智显分享丨ESP32学习笔记参考

    LED PWM控制器与MCPWM的配置
    的头像 发表于 03-22 17:52 3223次阅读
    启明智显分享丨<b class='flag-5'>ESP32</b><b class='flag-5'>学习</b><b class='flag-5'>笔记</b>参考

    ESP32学习笔记:GPIO数字输入与数字输出

    ESP32芯片有34个物理 GPIO Pad,每个Pad可以当作通用IO,也可以当作外设的引脚,GPIO 引脚通过非常复杂的 GPIO 矩阵互连,这基本上就是是一个多路复用器,我们可以非常灵活的选择哪些GPIO引脚在内部路由到哪个外设的信号。
    的头像 发表于 07-13 17:09 1162次阅读
    <b class='flag-5'>ESP32</b><b class='flag-5'>学习</b><b class='flag-5'>笔记</b>:GPIO数字输入与数字输出

    ESP32学习笔记:串口

    ESP32 芯片有3 个UART 接口,UART0,UART1,UART2,支持异步通信和 IrDA,通信速度最高可达 5Mbps,3 个接口可以被 DMA 或 CPU 直接访问,3 个串口带发送
    的头像 发表于 07-13 17:09 2194次阅读
    <b class='flag-5'>ESP32</b><b class='flag-5'>学习</b><b class='flag-5'>笔记</b>:串口

    ESP32学习笔记:ADC

    ESP32 芯片有2 个 12位的SAR(逐次逼近)ADC,最多可以读取18个不同的模拟通道输入,由5个专用转换控制器管理,2个支持高性能多通道扫描,2个支持Deep-sleep低功耗模式下运行,还有一个专门用于功率检测和峰值监测。
    的头像 发表于 07-13 17:11 3197次阅读
    <b class='flag-5'>ESP32</b><b class='flag-5'>学习</b><b class='flag-5'>笔记</b>:ADC

    ESP32学习笔记:PWM

    今天我们来玩儿PWM。
    的头像 发表于 07-14 14:56 1559次阅读
    <b class='flag-5'>ESP32</b><b class='flag-5'>学习</b><b class='flag-5'>笔记</b>:PWM

    ESP32学习笔记:I2C

    今天我们来玩儿I2C。
    的头像 发表于 07-14 14:56 833次阅读
    <b class='flag-5'>ESP32</b><b class='flag-5'>学习</b><b class='flag-5'>笔记</b>:I2C

    ESP32学习笔记:硬件定时器

    今天我们来玩儿硬件定时器。
    的头像 发表于 07-14 15:00 896次阅读
    <b class='flag-5'>ESP32</b><b class='flag-5'>学习</b><b class='flag-5'>笔记</b>:硬件定时器

    ESP32学习笔记:EEPROM

    今天我们来玩儿EEPROM。
    的头像 发表于 07-14 15:03 1737次阅读
    <b class='flag-5'>ESP32</b><b class='flag-5'>学习</b><b class='flag-5'>笔记</b>:EEPROM

    ESP32学习笔记:存储分布和启动过程

    今天我们来说说ESP32 for Arduino存储分布以及启动过程。
    的头像 发表于 07-14 15:10 1611次阅读
    <b class='flag-5'>ESP32</b><b class='flag-5'>学习</b><b class='flag-5'>笔记</b>:存储分布和启动过程

    ESP32学习笔记:NVS分区永久保存数据

    今天我们来说说ESP32 for Arduino NVS分区永久保存数据。
    的头像 发表于 07-15 16:14 6598次阅读
    <b class='flag-5'>ESP32</b><b class='flag-5'>学习</b><b class='flag-5'>笔记</b>:NVS分区永久保存数据

    ESP32学习笔记:WiFi

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