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 pin
  uint32_t blink_delay2 = 2000; // Delay between changing state on LED pin

  xTaskCreate(
    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 LOW
    delay(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 LOW
    delay(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 LOW
    delay(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 LOW
    delay(blink_delay);
  }
}

主要代码解析

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

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

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

最后,我有话说:

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/681886.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

运动会信息管理系统(Springboot+MySQL)

本课题旨在实现对运动会信息的全面管理&#xff0c;提供用户友好的界面和高效的操作体验。系统的基础功能包括运动员报名比赛、比赛成绩查询、资讯留言等。为了确保系统的高扩展性和稳定性&#xff0c;选用主流的开发技术&#xff0c;实现规范的项目结构和高效的性能。 技术选型…

RAR文件忘记密码怎么办?解密方法大盘点

随着信息技术的飞速发展&#xff0c;数据的安全性和保密性越来越受到重视。RAR作为一种常用的压缩文件格式&#xff0c;因其压缩效率高、支持文件加密等特点而广受欢迎。然而&#xff0c;当我们忘记了RAR压缩包的密码&#xff0c;或者需要解密他人分享的加密RAR文件时&#xff…

如何统一集成全域数据?三个点讲清楚多源异构数据融合

关于多源异构数据的融合问题&#xff0c;主要涉及以下三个关键点&#xff1a; 1、多源异构数据融合的必要性 2、多源异构数据融合的挑战 3、多源异构数据融合的解决方案 首先&#xff0c;我们来说多源异构数据融合的必要性。 随着以大数据为代表的信息技术快速发展&#xf…

HTTP相关面试题

1. HTPP基本概念 HTTP是超文本传输协议。本质上就是一个可以传输图片、视频、文字的计算机与计算机之间的协议 1.1. HTTP常见的状态码 2XX状态码: 主要用于表示已经服务器已经成功的处理了请求 [200 ok ]: 是最常见的状态码,表示我们请求成功且响应内容(响应头body)已经收到…

笔记 | 软件工程02:软件工程概述

1 软件工程产生背景 1.1 历史发展 1960s的个体作坊式软件开发带来的问题 1.2 软件开发需要解决的问题 代码规模增长带来的影响&#xff1a; 1.3 软件开发面临的挑战 指挥信息系统中的软件&#xff1a;规模大、质量要求高 装备中嵌入式软件系统&#xff1a;规模大、质量要求…

调用smc为什么就能直接切换到ATF?

快速链接: . &#x1f449;&#x1f449;&#x1f449;Trustzone/TEE/安全 面试100问-目录 &#x1f448;&#x1f448;&#x1f448; 付费专栏-付费课程 【购买须知】:联系方式-加入交流群 ----联系方式-加入交流群 个人博客笔记导读目录(全部) 背景 插播一个小插曲&#…

大数据在金融行业的深度应用与未来展望

一、引言 随着信息技术的迅猛发展,大数据已经成为推动金融行业创新的重要力量。从精准营销、个性化服务到风险管理和产品创新,大数据的应用正在不断重塑金融行业的格局。本文将深入探讨大数据在金融行业的深度应用,分析其特征特点、解决方案以及面临的挑战与机遇,并展望其…

深度学习 --- stanford cs231 编程作业(assignment1,Q2: SVM分类器)

stanford cs231 编程作业之SVM分类器 写在最前面&#xff1a; 深度学习&#xff0c;或者是广义上的任何学习&#xff0c;都是“行千里路”胜过“读万卷书”的学识。这两天光是学了斯坦福cs231n的一些基础理论&#xff0c;越往后学越觉得没什么。但听的云里雾里的地方也越来越多…

STM32——hal_SPI_(介绍)

SPI&#xff08;串行外围设备接口&#xff09;是一种高速的、全双工、同步的通信协议&#xff0c;通常用于短距离通信&#xff0c;尤其是在嵌入式系统中与各种外围设备进行通信。SPI接口由摩托罗拉公司推出&#xff0c;由于其简单和灵活的特性&#xff0c;它被广泛用于多种应用…

云计算百科:类型、服务与业务优势一网打尽

了解云计算的权威指南是至关重要的&#xff0c;掌握云计算的类型、服务、用途以及它们如何为组织带来好处尤为重要。 假设某公司的员工正在办公室工作&#xff0c;突然间火警响起&#xff0c;原来IT部门的主服务器机房着火了&#xff0c;所有服务器都受到了影响。这一消息引发…

【机器学习-09】 | Scikit-Learn工具包进阶指南:Scikit-Learn工具包之高斯混合sklearn.mixture模块研究

&#x1f3a9; 欢迎来到技术探索的奇幻世界&#x1f468;‍&#x1f4bb; &#x1f4dc; 个人主页&#xff1a;一伦明悦-CSDN博客 ✍&#x1f3fb; 作者简介&#xff1a; C软件开发、Python机器学习爱好者 &#x1f5e3;️ 互动与支持&#xff1a;&#x1f4ac;评论 &…

Nginx配置详细解释:(3)http模块及server模块,location模块

目录 环境概述&#xff1a; http模块中的全局模块 1. root配置主要是对主web页面的路径访问。 2.server虚拟主机 2.1基于IP&#xff1a; 2.2基于域名&#xff1a; 3.alias别名 4.location匹配 5.access模块&#xff1a; 6.验证模块 7.自定义错误页面 8.日志存放位置…

图片裁剪与上传处理方案 —— 基于阿里云 OSS 处理用户资料

目录 01: 通用组件&#xff1a;input 构建方案分析 02: 通用组件&#xff1a;input 构建方案 03: 构建用户资料基础样式 04: 用户基本资料修改方案 05: 处理不保存时的同步问题 06: 头像修改方案流程分析 07: 通用组件&#xff1a;Dialog 构建方案分析 08: 通用组件&…

Transformer学习(4)

上篇文章完成了Transformer剩下组件的编写&#xff0c;因此本文就可以开始训练。 本文主要介绍训练时要做的一些事情&#xff0c;包括定义损失函数、学习率调整、优化器等。 下篇文章会探讨如何在多GPU上进行并行训练&#xff0c;加速训练过程。 数据集简介 从网上找到一份中…

双向链表的讲解与实现

双向链表的讲解与实现 一、双向链表的结构二、顺序表和双向链表的优缺点分析三、双向链表的实现(使用VS2022)1.初始化、销毁、打印、判空2.尾插尾删、头插头删3.查找、指定插入、指定删除 四、代码优化五、完整 List.c 源代码 一、双向链表的结构 带头”跟前面我们说的“头节点…

家政预约小程序13我的订单

目录 1 我的订单页面布局2 全部订单页面3 完善订单状态4 查询订单信息总结 现在我们已经完成了家政预约小程序主体功能的开发&#xff0c;包含服务的查看&#xff0c;在线预约已经登录等功能。预约之后就需要家政公司的客服进行派单&#xff0c;由服务人员进行上门服务。在小程…

gitlabcicd-k8s部署gitlab

一.安装准备环境 存储使用nfs挂载持久化 k8s环境 helm安装 建议helm 3 二.部署gitlab-deploy.yaml nfs的ip是192.168.110.190 挂载目录是/data/data 注意所需要的目录需要创建&#xff1a;/data/data/gitlab/config &#xff0c;/data/data/gitlab/logs &#xff0c;/dat…

LeetCode刷题之HOT100之合并区间

雨下了一整天&#xff0c;中午早早就回去吃饭拿快递了&#xff0c;今天拿了很多快递。我的书回来啦哈哈&#xff0c;还有好多零食&#xff0c;爽歪歪啊&#xff0c;放在下面了&#xff0c;然后准备开始做题啦&#xff01; 图一&#xff1a;左一是xh送我的&#xff0c;非常精彩…

JAVA小案例-99乘法表

JAVA小案例-99乘法表 今天学的一个小案例&#xff0c;主要是为了复习一下嵌套循环。 代码如下&#xff1a; public class Cheng {public static void main(String[] args) {int i;int j;for (i 1; i < 10; i) { //i<10和<9一个意思for (j 1; j < i 1; j) {…

CDH服务红,查看日志发现host有问题

看host后&#xff0c;发现里面节点ip都是127.0.0.1然后全部改成对应的ip&#xff0c; 1.在/etc/hosts里面全部加上了 ip以及对应的角色名称 2然后注释了127.0.0.1 hostname 3.然后重启所有的机器agent和server&#xff0c;在重新登录&#xff0c;点击重新部署。 重启agent sy…