ESP32S3——多线程

2024-06-05 20:52
文章标签 多线程 esp32s3

本文主要是介绍ESP32S3——多线程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、环境:

平台:arduino IDE 或 VS Code PlatformIO 皆可。

我的是后者,具体为:

        框架:VS + PlatformIO + Arduino

二、硬件准备:

一个esp32s3

本文用到的是U0RXD(GPIO44 )与U0TXD(GPIO43)引脚

一台电脑

一根数据线

三、代码功能:

        一个LED一秒亮一次:

        另一个LED两秒两一次。

注意:ESP32S3有两个type-C口,一个UART用来下载调试程序,一个USB用来供电。下载完程序后切换到USB,现象会更明显。

四、最简代码

#include <Arduino.h>#define LED_U0RXD 44
#define LED_U0TXD 43// 创建两个任务,
// TaskBlink1任务:一个LED 1s亮一次,
// TaskBlink2任务:另一个LED 2s亮一次。
void TaskBlink1( void *pvParameters );
void TaskBlink2( void *pvParameters );void setup() {Serial.begin(115200);uint32_t blink_delay1 = 1000; // Delay between changing state on LED pinuint32_t blink_delay2 = 2000; // Delay between changing state on LED pinxTaskCreate(TaskBlink1       // 这个任务运行的函数,  "Task Blink1" //  给人看的名字,  2048        // 任务栈的大小,用于存储任务运行时的上下文信息。简单来说,就是最多存这么多信息,  (void*) &blink_delay1 // 任务参数。要么没有填NULL;要么必须为无类型指针,  2  // 优先级,  NULL // 任务的句柄,用于管理和控制任务,NULL相当于0,意味着此处不需要任务句柄);xTaskCreate(TaskBlink2       // 这个任务运行的函数,  "Task Blink2" //  给人看的名字,  2048        // 任务栈的大小,用于存储任务运行时的上下文信息。简单来说,就是最多存这么多信息,  (void*) &blink_delay2 // 任务参数。要么没有填NULL;要么必须为无类型指针,  2  // 优先级,  NULL // 任务的句柄,用于管理和控制任务,NULL相当于0,意味着此处不需要任务句柄);Serial.printf("Basic Multi Threading Arduino Example\n");// Now the task scheduler, which takes over control of scheduling individual tasks, is automatically started.
}void loop(){
// 这里什么都不用写
}/*---------------------- Tasks ---------------------*/void TaskBlink1(void *pvParameters){  // This is a task.uint32_t blink_delay = *((uint32_t*)pvParameters);// 初始化LED_U0RXD为output模式pinMode(LED_U0RXD, OUTPUT);
// for死循环for (;;){ // 多线程,每个任务必须是死循环digitalWrite(LED_U0RXD, HIGH);   // turn the LED on (HIGH is the voltage level)delay(blink_delay);digitalWrite(LED_U0RXD, LOW);    // turn the LED off by making the voltage LOWdelay(blink_delay);}
}void TaskBlink2(void *pvParameters){  // This is a task.uint32_t blink_delay = *((uint32_t*)pvParameters);// 初始化LED_U0RXD为output模式pinMode(LED_U0TXD, OUTPUT);for (;;){ // A Task shall never return or exit.digitalWrite(LED_U0TXD, HIGH);   // turn the LED on (HIGH is the voltage level)delay(blink_delay);digitalWrite(LED_U0TXD, LOW);    // turn the LED off by making the voltage LOWdelay(blink_delay);}
}

主要代码解析

        我们可以看到,多线程其实很简单。        

        主要就是函数 xTaskCreate( ) :创建一个线程,然后在线程内运行 TaskBlink1( ) 函数。

  • TaskBlink1 :这个任务运行的函数
  •  "Task Blink1":给人看的名字
  • 2048 :任务栈的大小,用于存储任务运行时的上下文信息。简单来说,就是最多存这么多信息
  •  (void*) &blink_delay1 :任务参数。要么没有填NULL;要么必须为无类型指针
  • 2 :优先级
  • NULL : 任务的句柄,用于管理和控制任务,NULL相当于0,意味着此处不需要任务句柄

五、多核下的多线程

        有些板子有多个核,比如:ESP32S3有两个核,本身就可以就可以让两个核单独控制一个LED,实现上文双线程的效果。所以说,对于有两个核的ESP32S3,既可以指定某一个核运行俩线程,也可以指定俩核单独运行一个线程,而实现相同的效果。

        这里介绍俩核各自运行一个线程,各自控制一个LED的闪烁。

        话不多说,上代码:

#include <Arduino.h>// #if CONFIG_FREERTOS_UNICORE
// #define ARDUINO_RUNNING_CORE 0
// #else
// #define ARDUINO_RUNNING_CORE 1
// #endif#define LED_U0RXD 44
#define LED_U0TXD 43// 创建两个任务,
// TaskBlink1任务:一个LED 1s亮一次,
// TaskBlink2任务:另一个LED 2s亮一次。
void TaskBlink1(void *pvParameters);
void TaskBlink2(void *pvParameters);void setup() {Serial.begin(115200);xTaskCreatePinnedToCore(TaskBlink1,  "TaskBlink1"   // 任务名,  1024  // This stack size can be checked & adjusted by reading the Stack Highwater,  NULL,  2  // 任务优先级, with 3 (configMAX_PRIORITIES - 1) 是最高的,0是最低的.,  NULL ,  0); // 第一个核xTaskCreatePinnedToCore(TaskBlink2,  "TaskBlink2" //任务名,  1024  // 栈大小,  NULL,  1  // 任务优先级,  NULL ,  1); // 第二个核//现在,接管单个任务调度控制的任务调度程序将自动启动。
}void loop()
{// Empty. Things are done in Tasks.
}/*---------------------- Tasks ---------------------*/void TaskBlink1(void *pvParameters){  // This is a task.uint32_t blink_delay = 1000;// 初始化LED_U0RXD为output模式pinMode(LED_U0RXD, OUTPUT);
// for死循环for (;;){ // 多线程,每个任务必须是死循环digitalWrite(LED_U0RXD, HIGH);   // turn the LED on (HIGH is the voltage level)delay(blink_delay);digitalWrite(LED_U0RXD, LOW);    // turn the LED off by making the voltage LOWdelay(blink_delay);}
}void TaskBlink2(void *pvParameters){  // This is a task.uint32_t blink_delay = 2000;// 初始化LED_U0RXD为output模式pinMode(LED_U0TXD, OUTPUT);for (;;){ // A Task shall never return or exit.digitalWrite(LED_U0TXD, HIGH);   // turn the LED on (HIGH is the voltage level)delay(blink_delay);digitalWrite(LED_U0TXD, LOW);    // turn the LED off by making the voltage LOWdelay(blink_delay);}
}

主要代码解析

        我们可以看到,多核、多线程其实也很简单。        

        主要就是函数 xTaskCreatePinnedToCore ( ) :创建一个线程,并指定哪一个核运行线程,然后在线程内运行 TaskBlink1( ) 函数。与函数 xTaskCreate( ) 相比只多了指定运行的核,这一步。 

  • TaskBlink1 :这个任务运行的函数
  •  "Task Blink1":给人看的名字
  • 2048 :任务栈的大小,用于存储任务运行时的上下文信息。简单来说,就是最多存这么多信息
  •  (void*) &blink_delay1 :任务参数。要么没有填NULL;要么必须为无类型指针
  • 2 :优先级
  • NULL : 任务的句柄,用于管理和控制任务,NULL相当于0,意味着此处不需要任务句柄
  • 0 :第一个核。只有俩核,只能填0或1

最后,我有话说:

        如果文章对你有帮助,我很开心。有疑问,请留言,看到后,我会回复。

这篇关于ESP32S3——多线程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Python多线程实现大文件快速下载的代码实现

《Python多线程实现大文件快速下载的代码实现》在互联网时代,文件下载是日常操作之一,尤其是大文件,然而,网络条件不稳定或带宽有限时,下载速度会变得很慢,本文将介绍如何使用Python实现多线程下载... 目录引言一、多线程下载原理二、python实现多线程下载代码说明:三、实战案例四、注意事项五、总结引

Python多线程应用中的卡死问题优化方案指南

《Python多线程应用中的卡死问题优化方案指南》在利用Python语言开发某查询软件时,遇到了点击搜索按钮后软件卡死的问题,本文将简单分析一下出现的原因以及对应的优化方案,希望对大家有所帮助... 目录问题描述优化方案1. 网络请求优化2. 多线程架构优化3. 全局异常处理4. 配置管理优化优化效果1.

Qt中实现多线程导出数据功能的四种方式小结

《Qt中实现多线程导出数据功能的四种方式小结》在以往的项目开发中,在很多地方用到了多线程,本文将记录下在Qt开发中用到的多线程技术实现方法,以导出指定范围的数字到txt文件为例,展示多线程不同的实现方... 目录前言导出文件的示例工具类QThreadQObject的moveToThread方法实现多线程QC

RabbitMQ消费端单线程与多线程案例讲解

《RabbitMQ消费端单线程与多线程案例讲解》文章解析RabbitMQ消费端单线程与多线程处理机制,说明concurrency控制消费者数量,max-concurrency控制最大线程数,prefe... 目录 一、基础概念详细解释:举个例子:✅ 单消费者 + 单线程消费❌ 单消费者 + 多线程消费❌ 多

Javaee多线程之进程和线程之间的区别和联系(最新整理)

《Javaee多线程之进程和线程之间的区别和联系(最新整理)》进程是资源分配单位,线程是调度执行单位,共享资源更高效,创建线程五种方式:继承Thread、Runnable接口、匿名类、lambda,r... 目录进程和线程进程线程进程和线程的区别创建线程的五种写法继承Thread,重写run实现Runnab

使用Python实现可恢复式多线程下载器

《使用Python实现可恢复式多线程下载器》在数字时代,大文件下载已成为日常操作,本文将手把手教你用Python打造专业级下载器,实现断点续传,多线程加速,速度限制等功能,感兴趣的小伙伴可以了解下... 目录一、智能续传:从崩溃边缘抢救进度二、多线程加速:榨干网络带宽三、速度控制:做网络的好邻居四、终端交互

python多线程并发测试过程

《python多线程并发测试过程》:本文主要介绍python多线程并发测试过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、并发与并行?二、同步与异步的概念?三、线程与进程的区别?需求1:多线程执行不同任务需求2:多线程执行相同任务总结一、并发与并行?1、

Python多进程、多线程、协程典型示例解析(最新推荐)

《Python多进程、多线程、协程典型示例解析(最新推荐)》:本文主要介绍Python多进程、多线程、协程典型示例解析(最新推荐),本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定... 目录一、multiprocessing(多进程)1. 模块简介2. 案例详解:并行计算平方和3. 实现逻

Java使用多线程处理未知任务数的方案介绍

《Java使用多线程处理未知任务数的方案介绍》这篇文章主要为大家详细介绍了Java如何使用多线程实现处理未知任务数,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 知道任务个数,你可以定义好线程数规则,生成线程数去跑代码说明:1.虚拟线程池:使用 Executors.newVir

JAVA封装多线程实现的方式及原理

《JAVA封装多线程实现的方式及原理》:本文主要介绍Java中封装多线程的原理和常见方式,通过封装可以简化多线程的使用,提高安全性,并增强代码的可维护性和可扩展性,需要的朋友可以参考下... 目录前言一、封装的目标二、常见的封装方式及原理总结前言在 Java 中,封装多线程的原理主要围绕着将多线程相关的操