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( ) 函数。

xTaskCreate(

TaskBlink1 // 这个任务运行的函数

, "Task Blink1" // 给人看的名字

, 2048 // 任务栈的大小,用于存储任务运行时的上下文信息。简单来说,就是最多存这么多信息

, (void*) &blink_delay1 // 任务参数。要么没有填NULL;要么必须为无类型指针

, 2 // 优先级

, NULL // 任务的句柄,用于管理和控制任务,NULL相当于0,意味着此处不需要任务句柄

);

最后,我有话说:

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

代码随想录算法训练营第22天|二叉树

二叉树part08 235. 二叉搜索树的最近公共祖先 前序&#xff0c;利用二叉搜索的特性 /*** Definition for a binary tree node.* function TreeNode(val) {* this.val val;* this.left this.right null;* }*//*** param {TreeNode} root* param {TreeNode} p* par…

TCP的核心属性

TCP的核心属性 一: TCP的核心属性1.1: 确认应答:1.2 : 超时重传1.3 : 连接管理1.3.1 三次握手1.3.2 四次挥手 1.4 滑动窗口1.5: 流量控制:1.6 拥塞控制1.7 延时应答1.8 :捎带应答1.9: 面向字节流1.10 : 异常情况 一: TCP的核心属性 1.1: 确认应答: 保证可靠性最核心的机制 1…

基于FPGA的数字信号处理:Signed的本质和作用

基于FPGA的数字信号处理中,signed的本质和作用主要体现在对整型变量正负性的定义和运算上。以下是关于signed的详细解释: signed的本质 定义有符号数变量:在FPGA的数字信号处理中,signed关键字用于定义有符号整型变量。这意味着变量可以存储正数和负数,而不仅仅是无符号整…

《web应用技术》第十次作业

将自己的项目改造为基于vue-cli脚手架的项目&#xff0c;页面有导航&#xff0c;学会使用router。 <el-aside width"200px" style"background-color: aliceblue;"> <el-menu :default-openeds"[1]" style"background-color:rgb(1…

邦芒简历:打造你的求职利器

简历&#xff0c;是求职的敲门砖。一份精心制作的简历&#xff0c;能为你赢得宝贵的面试机会。面对求职的激烈竞争&#xff0c;大学生们该如何制作一份出色的简历呢&#xff1f; 一、简洁明了&#xff0c;突出重点 招聘人员通常没有足够的时间去仔细阅读冗长的简历。因此&…

springboot 打成jar部署到Linux环境后读取resources下面的文件

方法代码&#xff1a; ClassLoader loader Thread.currentThread().getContextClassLoader();InputStream flagInputStream loader.getResourceAsStream("static/imagesLogo/imageaaa.png");BufferedImage read;read ImageIO.read(flagInputStream);System.out.pr…

智慧农业灌溉系统的主要工作原理

一、概述   智慧农业灌溉系统是一种基于传感器技术和智能控制技术的灌溉系统。它能够根据土壤湿度、气象条件、作物需水量等多种因素&#xff0c;自动控制灌溉水量和灌溉时间&#xff0c;实现精准灌溉。相比传统的手动灌溉和定时灌溉&#xff0c;智慧农业灌溉系统更加高效、准…

QT error: allocation of incomplete type ‘Ui::Server‘

目录 前言 报错内容&#xff1a; 过程解析&#xff1a; 原因分析&#xff1a; daisy.skye的博客 QT合集http://t.csdnimg.cn/wEVbu 前言 最近又开始需要做上位机了&#xff0c;要知道qt上位机对我来说已经3年没有接触了&#xff0c;最开始接触还是毕业时工作中的简单学习和…

pycharm专业版安装保姆级教程

一、官网下载 PyCharm下载地址&#xff1a;http://www.jetbrains.com/pycharm/download/#sectionwindows 选择专业版点击下载 二、进入安装向导 下载完成后&#xff0c;点击.exe文件 点击是 点击下一步 可修改安装目录为自己想安装的位置 或者不修改也可 点击下一步 选择所…

【设计模式】观察者模式(行为型)⭐⭐⭐

文章目录 1.概念1.1 什么是观察者模式1.2 优点与缺点 2.实现方式3. Java 哪些地方用到了观察者模式4. Spring 哪些地方用到了观察者模式 1.概念 1.1 什么是观察者模式 观察者模式&#xff08;Observer Pattern&#xff09;是一种行为型设计模式&#xff0c;它允许对象在状态改…

【k8s 控制器:ReplicaSet、Deployment、StatefulSet ...】

控制器 ReplicaSet、Deployment、StatefulSet 和 DaemonSet 都是 Kubernetes 中的控制器对象&#xff0c;用于管理 Pod 的创建、扩展、缩减和更新等操作。 一、Deployment 适用无状态服务应用部署&#xff1b;Deployment 是在 ReplicaSet 的基础上提供了更高级功能的控制器。它…

变量位置不同会死机?郭天祥老师视频的遗留问题分析答案

在郭天祥老师视频里有一个问题分享&#xff0c;是EXMC初始化里的一个变量定义和初始化位置不同会导致程序死机&#xff0c;最终定位到程序是进入hardfault死机&#xff0c;但暂时没有后续分析了&#xff0c;这里我们来继续分析一下。 死机的程序是这样的&#xff1a; 这段代码…

如何使用 Python 和 Selenium 解决 Cloudflare 验证码

你知道吗&#xff1f;大约 20% 你需要抓取的网站使用 Cloudflare&#xff0c;这是一个强大且不断崛起的反机器人保护系统&#xff0c;可以轻松击败你的努力。如果你正在为 Cloudflare 验证码失败而苦恼&#xff0c;你并不孤单。在每一秒都很重要的世界里&#xff0c;许多人因为…

Mysql的两种安装方式

文章目录 第一种安装方式国内镜像库下载解压安装配置环境变量初始化数据库安装mysql登录mysql设置root密码退出登录假如忘记了密码&#xff0c;重置密码的步骤1、步骤一&#xff1a;停止 MySQL 服务2、步骤二&#xff1a;使用安全模式启动 MySQL3、步骤三&#xff1a;重置密码4…

服务器端Openresty的Lua 脚本动态生成 HTML 页面

使用服务器端的 Lua 脚本来动态生成 HTML 页面&#xff0c;并在生成页面时传递重定向参数。这种方法不涉及客户端 JavaScript&#xff0c;而是在服务器端完成重定向参数的设置。 以下是修改后的示例&#xff1a; # 人机验证页面 location /captcha {default_type text/html;c…

js中的堆栈理解

栈内存空间 栈内存空间 : 就是用栈作为数据结构在内存中所申请的空间。 栈的特点&#xff1a; 后进先出&#xff0c;最后添加进栈的元素最先出。访问栈底元素&#xff0c;必须拿掉它上面的元素。会被提前开辟 堆内存空间 堆内存空间:就是用堆作为数据结构在内存中所申请的空…

Linux 内核优化:提升性能测试效率的关键步骤

大家好&#xff0c;本文介绍了如何通过优化 Linux 内核配置来提高系统性能&#xff0c;特别是在进行性能测试时。从调整文件系统、网络参数到内核参数优化&#xff0c;我们将深入探讨每个关键步骤&#xff0c;以帮助你在性能测试中取得更好的效果。 在进行性能测试时&#xff0…

JVM面试篇(下)

垃圾收集器 简述 Java 垃圾回收机制 在 java 中,程序员是不需要显示的去释放一个对象的内存的,而是由虚拟机自行执行。在 JVM中,有一个垃圾回收线程,它是低优先级的,在正常情况下是不会执行的,只有在虚拟机空闲或者当前堆内存不足时,才会触发执行,扫面那些没有被任何引…

Python | 判断集合成员(set作为哈希表)(集合)

set的概念和特点set的基本操作&#xff0c;比如创建、插入、删除、查找set的常用方法 集合&#xff1a; 也是一种数据结构&#xff0c;和数学中的集合类似&#xff0c;它用 于存储一组不重复的元素&#xff0c;并且不保证元素的顺序。查找通常是集合最重要的操作。 1.可以使用…

筛斗数据:数据治理在企业发展中的关键作用

随着信息技术的飞速发展&#xff0c;数据已成为企业最宝贵的资产之一。在这样的背景下&#xff0c;数据治理作为确保数据质量、可用性、一致性和安全性的过程&#xff0c;其重要性日益凸显。本文将探讨数据治理与企业之间的紧密联系&#xff0c;以及如何通过有效的数据治理策略…