如何使双核心的ESP32开启双核功能同时执行多任务

2023-10-20 11:31

本文主要是介绍如何使双核心的ESP32开启双核功能同时执行多任务,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

如何使双核心的ESP32开启双核功能同时执行多任务

    • 简介
    • 查看ESP32当前哪一个内核在执行任务
    • 双核同时执行任务
    • 总结

简介

在这里插入图片描述

ESP32-WROOM-32模组内置两个低功耗 Xtensa® 32-bit LX6 MCU,两个 CPU 核(core 0与core 1)可以被单独控制。可以在两个内核上同时运行多段代码,让ESP32实现多任务(执行某些事情的代码片段)处理。Arduino IDE默认情况下启用的是core 1。ESP32可以运行实时操作系统RTOS,并行的处理几个独立运行的任务。要将代码的特定部分分配给特定的内核,需要创建任务。当创建一个任务时,可以选择它将在哪个内核中运行,以及它的优先级。优先级值从0开始,其中0是最低优先级。处理器将首先运行优先级较高的任务。

在这里插入图片描述

查看ESP32当前哪一个内核在执行任务

打开Arduino IDE并给ESP32上传如下代码
调用xPortGetCoreID()函数,可以获取内核号

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

打开串口监视器即可查看ESP32当前内核1正在执行任务
在这里插入图片描述

双核同时执行任务

打开Arduino IDE并给ESP32上传如下代码

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 0xTaskCreatePinnedToCore(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 1xTaskCreatePinnedToCore(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 700 ms
void Task2code( void * pvParameters ){Serial.print("Task2 running on core ");Serial.println(xPortGetCoreID());for(;;){digitalWrite(led2, HIGH);delay(700);digitalWrite(led2, LOW);delay(700);}
}void loop() {}

本代码实现在内核0上执行让LED1每1000ms间隔闪烁,在内核1上执行让LED2每700ms间隔闪烁。两任务的优先级都为1,同时执行,并在串口监视器上打印出内核信息。若不开启双核执行,采用默认的单核顺序执行,就不能让LED1和LED2同时以不同的间隔闪烁。
若在任务执行期间,想删除任务,可以调用函数vTaskDelete(Task1)。
在这里插入图片描述

总结

带有双核功能的ESP32,使得我们在设计并行功能的应用时简化了程序,提高了效率。例如,使用一个内核获取传感器读数,使用另一个内核根据读数执行其他的任务功能。

这篇关于如何使双核心的ESP32开启双核功能同时执行多任务的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/246824

相关文章

Java实现远程执行Shell指令

《Java实现远程执行Shell指令》文章介绍使用JSch在SpringBoot项目中实现远程Shell操作,涵盖环境配置、依赖引入及工具类编写,详解分号和双与号执行多指令的区别... 目录软硬件环境说明编写执行Shell指令的工具类总结jsch(Java Secure Channel)是SSH2的一个纯J

Debian 13升级后网络转发等功能异常怎么办? 并非错误而是管理机制变更

《Debian13升级后网络转发等功能异常怎么办?并非错误而是管理机制变更》很多朋友反馈,更新到Debian13后网络转发等功能异常,这并非BUG而是Debian13Trixie调整... 日前 Debian 13 Trixie 发布后已经有众多网友升级到新版本,只不过升级后发现某些功能存在异常,例如网络转

python 线程池顺序执行的方法实现

《python线程池顺序执行的方法实现》在Python中,线程池默认是并发执行任务的,但若需要实现任务的顺序执行,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋... 目录方案一:强制单线程(伪顺序执行)方案二:按提交顺序获取结果方案三:任务间依赖控制方案四:队列顺序消

基于Java和FFmpeg实现视频压缩和剪辑功能

《基于Java和FFmpeg实现视频压缩和剪辑功能》在视频处理开发中,压缩和剪辑是常见的需求,本文将介绍如何使用Java结合FFmpeg实现视频压缩和剪辑功能,同时去除数据库操作,仅专注于视频处理,需... 目录引言1. 环境准备1.1 项目依赖1.2 安装 FFmpeg2. 视频压缩功能实现2.1 主要功

使用Python实现无损放大图片功能

《使用Python实现无损放大图片功能》本文介绍了如何使用Python的Pillow库进行无损图片放大,区分了JPEG和PNG格式在放大过程中的特点,并给出了示例代码,JPEG格式可能受压缩影响,需先... 目录一、什么是无损放大?二、实现方法步骤1:读取图片步骤2:无损放大图片步骤3:保存图片三、示php

Go语言连接MySQL数据库执行基本的增删改查

《Go语言连接MySQL数据库执行基本的增删改查》在后端开发中,MySQL是最常用的关系型数据库之一,本文主要为大家详细介绍了如何使用Go连接MySQL数据库并执行基本的增删改查吧... 目录Go语言连接mysql数据库准备工作安装 MySQL 驱动代码实现运行结果注意事项Go语言执行基本的增删改查准备工作

深度解析Python yfinance的核心功能和高级用法

《深度解析Pythonyfinance的核心功能和高级用法》yfinance是一个功能强大且易于使用的Python库,用于从YahooFinance获取金融数据,本教程将深入探讨yfinance的核... 目录yfinance 深度解析教程 (python)1. 简介与安装1.1 什么是 yfinance?

Python脚本轻松实现检测麦克风功能

《Python脚本轻松实现检测麦克风功能》在进行音频处理或开发需要使用麦克风的应用程序时,确保麦克风功能正常是非常重要的,本文将介绍一个简单的Python脚本,能够帮助我们检测本地麦克风的功能,需要的... 目录轻松检测麦克风功能脚本介绍一、python环境准备二、代码解析三、使用方法四、知识扩展轻松检测麦

Java实现TXT文件导入功能的详细步骤

《Java实现TXT文件导入功能的详细步骤》在实际开发中,很多应用场景需要将用户上传的TXT文件进行解析,并将文件中的数据导入到数据库或其他存储系统中,本文将演示如何用Java实现一个基本的TXT文件... 目录前言1. 项目需求分析2. 示例文件格式3. 实现步骤3.1. 准备数据库(假设使用 mysql

Springboot项目登录校验功能实现

《Springboot项目登录校验功能实现》本文介绍了Web登录校验的重要性,对比了Cookie、Session和JWT三种会话技术,分析其优缺点,并讲解了过滤器与拦截器的统一拦截方案,推荐使用JWT... 目录引言一、登录校验的基本概念二、HTTP协议的无状态性三、会话跟android踪技术1. Cook