《物联ROS智能车前传》ESP32多线程编程

2024-06-12 20:52

本文主要是介绍《物联ROS智能车前传》ESP32多线程编程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

观前提醒:本期内容为ESP32的FreeRTOS、ESP32多核任务编程。

项目预告:一个无需计算机板卡,可以多机互动的,百元左右的物联ROS底盘车

ESP32多线程编程深入解析

在物联网(IoT)的项目中,多任务处理是一个常见的需求。ESP32,作为一款性能强大的微控制器,它内置了双核处理器以及支持多线程的FreeRTOS操作系统,使得同时处理多个任务成为可能。本文将从浅入深地解析ESP32的多线程编程方法和其特点。

一、ESP32S3多核功能简介

ESP32-S3 是 Espressif Systems 开发的一款低功耗微控制器,它是 ESP32 系列的一部分,专为通用低功耗设备、物联网 (IoT) 应用和智能家居等领域设计。

ESP32-S3 采用了双核 Xtensa® 32-bit LX7 微处理器,这意味着它有两个处理核心可以同时运行任务,提高了处理能力和多任务处理的效率。这两个核心可以独立运行,也可以协同工作,处理复杂的计算任务或多个并发操作。

在使用 ESP32-S3 进行编程时,可以指定特定的任务运行在哪个核心上。这可以通过使用 FreeRTOS(实时操作系统)来实现,FreeRTOS 是 ESP32-S3 常用的操作系统。

二、FreeRTOS简介

FreeRTOS是一个迷你的实时操作系统内核,为多任务处理提供了丰富的API。在ESP32上,FreeRTOS已经被高度集成和优化,可以充分利用ESP32的双核处理器。FreeRTOS的主要特点包括:

  • 任务管理:可以创建、删除、挂起和恢复多个任务。
  • 同步原语:包括互斥量、信号量、事件标志等,用于任务间的同步。
  • 内存管理:提供动态内存分配和释放。
  • 定时器:提供软件定时器,用于定时任务的执行。

简要介绍一下FreeRTOS在ESP32上的底层实现:

FreeRTOS在ESP32上的底层实现涉及到硬件抽象、中断管理、多核调度等方面

  • 硬件抽象层(HAL)

FreeRTOS为不同的硬件平台提供了硬件抽象层,这样FreeRTOS的核心代码可以在不同的硬件上运行而无需修改。在ESP32上,HAL包括对CPU、定时器、中断控制器等硬件资源的抽象。这些抽象使得FreeRTOS能够利用ESP32的硬件特性,如定时器用于调度器的时基,中断控制器用于管理中断。

  • 中断管理

ESP32的中断管理是通过它的中断控制器来实现的。FreeRTOS定义了一套中断服务例程(ISR)的编写规则,这些规则确保了ISR可以安全地与FreeRTOS的任务和内核对象交互。例如,FreeRTOS提供了portENTER_CRITICAL和portEXIT_CRITICAL宏来在ISR中保护临界区,防止任务切换时数据不一致。

  • 多核调度

ESP32的FreeRTOS利用了双核心的特性来实现多核调度。FreeRTOS的调度器被设计为可以在多核环境下运行,每个核可以运行自己的任务。FreeRTOS在ESP32上的实现使用了特殊的同步机制,如“spinlock”锁,来同步两个核上的任务状态。

  • 任务切换和上下文保存

任务切换是多任务操作系统的核心,它允许CPU在不同的任务之间切换执行。在ESP32上,FreeRTOS的任务切换涉及到保存和恢复任务的上下文,包括CPU寄存器等状态信息。FreeRTOS使用汇编语言编写的上下文切换函数portSAVE_CONTEXT和portRESTORE_CONTEXT来处理这些操作,确保任务切换时能够正确保存和恢复每个任务的状态。

三、ESP32多线程编程基础

基础多线程例程:

#include <Arduino.h>// 定义任务句柄TaskHandle_t Task1;TaskHandle_t Task2;// 定义任务函数void Task1code( void * pvParameters ){  Serial.print("Task1 running on core ");  Serial.println(xPortGetCoreID());  for(;;){    Serial.println("This is Task1");    vTaskDelay(1000 / portTICK_PERIOD_MS); // 延迟1秒  }}void Task2code( void * pvParameters ){  Serial.print("Task2 running on core ");  Serial.println(xPortGetCoreID());  for(;;){    Serial.println("This is Task2");    vTaskDelay(2000 / portTICK_PERIOD_MS); // 延迟2秒  }}void setup() {  Serial.begin(115200);    // 创建任务  xTaskCreatePinnedToCore(    Task1code, /* 任务函数 */    "Task1",   /* 任务名字 */    10000,     /* 栈大小 */    NULL,      /* 传递给任务函数的参数 */    1,         /* 优先级 */    &Task1,    /* 任务句柄 */    0);        /* 核心编号 */  xTaskCreatePinnedToCore(    Task2code,    "Task2",    10000,    NULL,    1,    &Task2,    1);}void loop() {  // 在这里不需要做任何事情,因为所有的工作都在任务中完成}

 在这个例程中,我们创建了两个任务(Task1和Task2)。每个任务都在不同的核心上运行(ESP32S3有两个核心)。每个任务都会打印一条消息,然后延迟一段时间。Task1每秒打印一次消息,而Task2每两秒打印一次消息。

可以看到Task1运行在core 0,Task2运行在core 1

简单分析一下以上的程序,我们可以看到,实现多线程的主要函数只有两个:

Task1code与xTaskCreatePinnedToCore

Task1code函数:

Task1code是任务函数,用于在FreeRTOS任务中执行。在这个例程中,它被用作任务1的主体。下面是对这个函数的详细分析:

点击《物联ROS智能车前传》ESP32多线程编程 - 古月居可查看全文

 

这篇关于《物联ROS智能车前传》ESP32多线程编程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

ESP32 esp-idf esp-adf环境安装及.a库创建与编译

简介 ESP32 功能丰富的 Wi-Fi & 蓝牙 MCU, 适用于多样的物联网应用。使用freertos操作系统。 ESP-IDF 官方物联网开发框架。 ESP-ADF 官方音频开发框架。 文档参照 https://espressif-docs.readthedocs-hosted.com/projects/esp-adf/zh-cn/latest/get-started/index

零基础STM32单片机编程入门(一)初识STM32单片机

文章目录 一.概要二.单片机型号命名规则三.STM32F103系统架构四.STM32F103C8T6单片机启动流程五.STM32F103C8T6单片机主要外设资源六.编程过程中芯片数据手册的作用1.单片机外设资源情况2.STM32单片机内部框图3.STM32单片机管脚图4.STM32单片机每个管脚可配功能5.单片机功耗数据6.FALSH编程时间,擦写次数7.I/O高低电平电压表格8.外设接口

16.Spring前世今生与Spring编程思想

1.1.课程目标 1、通过对本章内容的学习,可以掌握Spring的基本架构及各子模块之间的依赖关系。 2、 了解Spring的发展历史,启发思维。 3、 对 Spring形成一个整体的认识,为之后的深入学习做铺垫。 4、 通过对本章内容的学习,可以了解Spring版本升级的规律,从而应用到自己的系统升级版本命名。 5、Spring编程思想总结。 1.2.内容定位 Spring使用经验

ROS话题通信流程自定义数据格式

ROS话题通信流程自定义数据格式 需求流程实现步骤定义msg文件编辑配置文件编译 在 ROS 通信协议中,数据载体是一个较为重要组成部分,ROS 中通过 std_msgs 封装了一些原生的数据类型,比如:String、Int32、Int64、Char、Bool、Empty… 但是,这些数据一般只包含一个 data 字段,结构的单一意味着功能上的局限性,当传输一些复杂的数据,比如:

Android多线程下载见解

通过for循环开启N个线程,这是多线程,但每次循环都new一个线程肯定很耗内存的。那可以改用线程池来。 就以我个人对多线程下载的理解是开启一个线程后: 1.通过HttpUrlConnection对象获取要下载文件的总长度 2.通过RandomAccessFile流对象在本地创建一个跟远程文件长度一样大小的空文件。 3.通过文件总长度/线程个数=得到每个线程大概要下载的量(线程块大小)。

探索蓝牙协议的奥秘:用ESP32实现高质量蓝牙音频传输

蓝牙(Bluetooth)是一种短距离无线通信技术,广泛应用于各种电子设备之间的数据传输。自1994年由爱立信公司首次提出以来,蓝牙技术已经经历了多个版本的更新和改进。本文将详细介绍蓝牙协议,并通过一个具体的项目——使用ESP32实现蓝牙音频传输,来展示蓝牙协议的实际应用及其优点。 蓝牙协议概述 蓝牙协议栈 蓝牙协议栈是蓝牙技术的核心,定义了蓝牙设备之间如何进行通信。蓝牙协议

智能客服到个人助理,国内AI大模型如何改变我们的生活?

引言 随着人工智能(AI)技术的高速发展,AI大模型越来越多地出现在我们的日常生活和工作中。国内的AI大模型在过去几年里取得了显著的进展,不少独创的技术点和实际应用令人瞩目。 那么,国内的AI大模型有哪些独创的技术点?它们在实际应用中又有哪些出色表现呢?此外,普通人又该如何利用这些大模型提升工作和生活的质量和效率呢?本文将为你一一解析。 一、国内AI大模型的独创技术点 多模态学习 多

基于 Java 实现的智能客服聊天工具模拟场景

服务端代码 import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.PrintWriter;import java.net.ServerSocket;import java.net.Socket;public class Serv

IPython小白教程:提升你的Python交互式编程技巧,通俗易懂!

IPython是一个增强的Python交互式shell,它提供了丰富的功能和便捷的交互方式,使得Python开发和数据分析工作更加高效。本文将详细介绍IPython的基本概念、使用方法、主要作用以及注意事项。 一、IPython简介 1. IPython的起源 IPython由Fernando Pérez于2001年创建,旨在提供一个更高效的Python交互式编程环境。 2. IPyt