【ESP32+freeRTOS学习笔记之“ESP32环境下使用freeRTOS的特性分析(2-多核环境中的任务)”】

目录

  • 1、ESP32的双核对称多处理SMP概念
  • 2、涉及任务task的特殊性
    • 2.1 创建任务的特殊函数
    • 2.2 xTaskCreatePinnedToCore()函数的解释
  • 3、任务的删除
  • 4、总结

1、ESP32的双核对称多处理SMP概念

最初的FreeRTOS(以下简称Vanilla FreeRTOS)是一种小型高效的实时操作系统,支持许多单核MCU和SoC。然而,ESP32和ESP32-S3等,能够进行双核对称多处理(SMP)。因此,ESP-IDF中使用的FreeRTOS版本(以下简称为ESP-IDF FreeRTOS)是Vanilla FreeRTOS v10.4.3的修改版本。这些修改使ESP-IDF FreeRTOS能够利用ESP SoC的双核SMP功能。

==SMP(对称多处理器)==是一种计算体系结构,其中两个或多个相同的CPU(核)连接到单个共享主存储器,并由单个操作系统控制。一般来说,SMP系统的特点如下:
>具有多个独立运行的内核。每个核心都有自己的寄存器文件、中断和中断处理。
>为每个核心提供相同的内存视图。因此,一段访问特定内存地址的代码将具有相同的效果,无论它在哪个内核上运行。

ESP目标上的SMP
ESP目标(例如ESP32、ESP32-S3)是双核SMP SoC。这些目标具有以下硬件功能,使其具有SMP功能:

1、两个相同的核心,称为CPU0(即协议CPU或PRO_CPU)和CPU1(即应用CPU或APP_CPU)。这意味着一段代码的执行是相同的,无论它在哪个核心上运行。
2、对称内存(除了一些小的例外)。

2.1 如果多个内核访问相同的内存地址,那么它们的访问将在内存总线级别串行化。
2.2 对同一存储器地址的真正原子访问是通过ISA提供的原子比较和交换指令实现的。

3、允许一个CPU在另一个CPU上触发和跨核中断。这允许内核相互发送信号。

CPU0和CPU1的“PRO_CPU”和“APP_CPU”别名存在于ESP-IDF中,因为它们反映了典型的IDF应用程序将如何利用这两个CPU。通常,负责处理无线网络(例如,WiFi或蓝牙)的任务将被固定到CPU0(因此名称为PRO_CPU),而处理应用程序的其余部分的任务将固定到CPU1(因此名称APP_CPU)。

因为ESP32的具有对称多处理的双核,因此在esp-idf中对FreeRTOS的适配需要相应的做出改变。

2、涉及任务task的特殊性

2.1 创建任务的特殊函数

Vanilla FreeRTOS提供以下功能来创建任务:
xTaskCreate()创建一个任务。任务的内存是动态分配的
xTaskCreateStatic()创建一个任务。任务的内存是静态分配的(即由用户提供)

然而,在SMP系统中,需要为任务的创建做适配。
因此,ESP-IDF提供了Vanilla FreeRTOS任务创建功能的PinnedToCore版本:
xTaskCreatePinnedToCore()创建一个具有特定核心关联的任务。任务的内存是动态分配的。
xTaskCreateStaticPinnedToCore()创建一个具有特定核心关联的任务。任务的内存是静态分配的(即由用户提供)

任务创建函数API的PinnedToCore版本不同于它们的普通计数器部分,因为它有一个额外的xCoreID参数,用于指定创建的任务的核心相关性。核心的有效值为:
0,将创建的任务固定到CPU0
1,将创建的任务固定到CPU1
tskNO_AFFINITY,它允许任务在两个CPU上运行
请注意,ESP-IDF FreeRTOS仍然支持普通版本的任务创建功能。然而,它们已经被修改为简单地用tskNO_AFINITY来调用PinnedToCore对应对象。

2.2 xTaskCreatePinnedToCore()函数的解释

在这里插入图片描述

创建具有指定相关性的新任务。此函数类似于xTaskCreate,但允许在SMP系统中设置任务相关性。
参数

参数说明
pvTaskCode指向任务入口函数的指针。任务必须实现为永不返回(即连续循环),或者应使用vTaskDelete函数终止。
pcName任务的描述性名称。这主要是为了方便调试。configMAX_TASK_NAME_LEN定义的最大长度-默认值为16。
usStackDepth指定为字节数的任务堆栈的大小。请注意,这与普通的FreeRTOS不同。
pvParameters将用作正在创建的任务的参数的指针。
uxPriority任务应该运行的优先级。包括MPU支持的系统可以通过设置优先级参数的位portPRIVILEGE_bit,选择性地以特权(系统)模式创建任务。例如,要创建优先级为2的特权任务,uxPriority参数应设置为(2
pvCreatedTask用于传递回一个句柄,通过该句柄可以引用创建的任务。
xCoreID如果值为tskNO_AFFINITY,则创建的任务不会固定到任何CPU,并且调度程序可以在任何可用的内核上运行它。值0或1表示任务应固定到的CPU的索引号。指定大于(portNUM_PROCESSORS-1)的值将导致函数失败。

返回

如果任务已成功创建并添加到就绪列表,则为pdPASS,否则为文件projdefs.h中定义的错误代码

备注:
ESP-IDF FreeRTOS还在任务创建功能中更改ulStackDepth的单位。Vanilla FreeRTOS中的任务堆栈大小是以字数指定的,而在ESP-IDF FreeRTO中,任务堆栈大小以字节指定。

3、任务的删除

Vanilla FreeRTOS中的任务删除是通过vTaskDelete()调用的。该函数允许删除另一个任务或当前正在运行的任务(如果提供的任务句柄为NULL)。任务内存的实际释放有时会委托给空闲任务(如果要删除的任务是当前正在运行的任务)。

ESP-IDF FreeRTOS提供了相同的vTaskDelete()函数。然而,由于双核的性质,在ESP-IDF FreeRTOS中调用vTaskDelete()时存在一些行为差异。

  > 当删除固定到另一个核心的任务时,该任务的内存总是被另一个内核的空闲任务释放(由于需要清除FPU寄存器)。
  > 当删除当前在另一个内核上运行的任务时,会在另一内核上触发yield,并且该任务的内存会被其中一个空闲任务释放(取决于该任务的内核相关性)
  > 当以下情况,已删除任务的内存将立即释放…
        >> 任务当前正在该核心上运行,并且也固定到此核心
        >> 该任务当前未运行,也未固定到任何核心

用户应避免对当前正在另一个核心上运行的任务调用vTaskDelete()。这是因为很难知道当前在另一个核心上运行的任务正在执行什么,从而可能导致不可预测的行为,例如:

  > 删除持有互斥的任务
  > 删除尚未释放先前分配的内存的任务

在可能的情况下,用户应该设计他们的应用程序,使vTaskDelete()只在已知状态的任务上调用。例如:

  > 任务在执行完成时自行删除(通过vTaskDelete(NULL)),并且还清理了任务中使用的所有资源。
  > 在被另一个任务删除之前,将自己置于挂起状态的任务(通过vTaskSuspend())。

4、总结

在多核环境下,Vanilla FreeRTOS 在任务的创建与删除的行为会在为双核的选择原因而有行为上的改变。这个改变不是很大,但需要考虑到双核环境的特殊性。

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

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

相关文章

线性表——顺序表

文章目录一:线性表二:顺序表1:概念与结构1:静态顺序表2:动态顺序表2:动态顺序表的代码实现1:结构2:接口实现1:初始化2:释放内存3:检查容量4&#…

Linux下最小化安装CentOS-7.6(保姆级)

文章目录安装包开始安装一、 新建一个虚拟机二、配置安装CentOS7.6二、开始安装CentOS三、配置CentOS并下载基本信息安装包 链接:https://pan.baidu.com/s/1DodB-kDy1yiNQ7B5IxwYyg 提取码:p19i 开始安装 一、 新建一个虚拟机 1、 打开VMWare&#x…

刷题笔记【5】| 快速刷完67道剑指offer(Java版)

本文已收录于专栏🌻《刷题笔记》文章目录前言🎨 1、合并两个有序链表题目描述思路一(递归)思路二(双指针)🎨 2、树的子结构题目描述思路一(递归)🎨 3、二叉树…

Redis分布式锁系列

1.压力测试出的内存泄漏及解决(可跳过) 使用jmeter对查询产品分类列表接口进行压力测试,出现了堆外内存溢出异常。 我们设置的虚拟机堆内存100m,并不是堆外内存100m 产生堆外内存溢出:OutOfDirectMemoryError 原因是…

某大厂面试题:说一说Java、Spring、Dubbo三者SPI机制的原理和区别

大家好,我是三友~~ 今天来跟大家聊一聊Java、Spring、Dubbo三者SPI机制的原理和区别。 其实我之前写过一篇类似的文章,但是这篇文章主要是剖析dubbo的SPI机制的源码,中间只是简单地介绍了一下Java、Spring的SPI机制,并没有进行深…

SQL——数据查询DQL

基本语句、时间查询(当天、本周,本月,上一个月,近半年的数据)。 目录 1 查询语句基本结构 2 where 子句 3 条件关系运算符 4 条件逻辑运算符 5 like 子句 6 计算列 7 as 字段取别名 8 distinct 清除重复行 9 …

linux mysql

安装 下载包 wget https://cdn.mysql.com/archives/mysql-8.0/mysql-8.0.31-1.el8.x86_64.rpm-bundle.tar解压 tar -zxvf mysql-8.0.31-1.el8.x86_64.rpm-bundle.tar -C /usr/local/mysql安装openssl-devel插件 yum install openssl-devel安装rpm包 使用rpm -ivh安装图中r…

【Unity项目实战】从零手戳一个背包系统

首先我们下载我们的人物和背景资源,因为主要是背包系统,所以人物的移动和场景的搭建这里我们就不多讲了,我这里直接提供基础项目源码给大家去使用就行 基础项目下载地址: 链接: https://pan.baidu.com/s/1o7_RW_QQ1rrAbDzT69ApRw 提取码: 8s95 顺带说一下,这里用到了uni…

AttributeError: module transformers has no attribute LLaMATokenizer解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

AES加密

来源:链接: b站up主可厉害的土豆 (据评论区说图片中有计算错误,但是过程是对的。只是了解过程问题不大,专门研究这一块的话自己可以看视频算一下) 准备 首先,明文是固定长度 16字节 128位。 密钥长度可以…

TCP协议一

TCP数据报格式 TCP通信时序 下图是一次TCP通讯的时序图。TCP连接建立断开。包含大家熟知的三次握手和四次握手。 在这个例子中,首先客户端主动发起连接、发送请求,然后服务器端响应请求,然后客户端主动关闭连接。两条竖线表示通讯的两端&…

houjie-cpp面向对象

houjie 面向对象 面向对象(上) const 在一个函数后面放const,这个只能修饰成员函数,告诉编译器这个成员函数不会改数据 const还是属于函数签名的一部分。 引用计数:涉及到共享的东东,然后当某个修改的时候&…

Mysql的学习与巩固:一条SQL查询语句是如何执行的?

前提 我们经常说,看一个事儿千万不要直接陷入细节里,你应该先鸟瞰其全貌,这样能够帮助你从高维度理解问题。同样,对于MySQL的学习也是这样。平时我们使用数据库,看到的通常都是一个整体。比如,你有个最简单…

【Paper】2019_Resilient Consensus Through Asynchronous Event-based Communication

Wang Y, Ishii H. Resilient consensus through asynchronous event-based communication[C]//2019 American Control Conference (ACC). IEEE, 2019: 1842-1847. 文章目录I. INTRODUCTIONII. EVENT-BASED RESILIENT CONSENSUS PROBLEMA. Preliminaries on graphsB. Event-base…

基于Java+ SpringBoot+Vue 的网上图书商城管理系统(毕业设计,附源码,教程)

您好,我是程序员徐师兄,今天为大家带来的是 基于Java SpringBootVue 的网上图书商城管理系统(毕业设计,附源码,教程)。 😁 1.Java 毕业设计专栏,毕业季咱们不慌忙,几百款…

电脑桌面图标间距突然变大怎么恢复

1. WindowsR打开 > 输入regedit 按住WindowsR打开运行,输入regedit并点击确定。 2. 双击Control Panel 双击展开HKEY_CURRENT_USER,双击展开Control Panel,双击展开Desktop。 3. 更改间距 点击打开WindowMetrics, 双击打开…

两年外包生涯,给我后面入职字节跳动奠定了基础.....

我是一位软件测试工程师。从大学毕业后,我进入了一家外包公司,在那里工作了两年时间。虽然我在公司中得到了不少锻炼和经验,但是我一直渴望能够进入一家更加专业的公司,接触更高端、更有挑战性的项目。 于是,我开始主…

Keil 4 安装教程及简单使用【嵌入式系统】

Keil 4 安装教程及简单使用【嵌入式系统】前言推荐说明Keil 4 for Arm安装教程1.安装MDK2.激活mdkkeil 4 for arm 的简单使用1建立新工程2在工程下创建新文件3.设置工程属性4.中文注释5.编辑代码6.build7.debug8. 调试窗口简介keil 4 for C51安装教程1.前期准备2.开始keil4 for…

记录-VueJs中如何使用Teleport组件

这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 在DOM结构相对比较复杂,层级嵌套比较深的组件内,需要根据相对应的模块业务处理一些逻辑,该逻辑属于当前组件 但是从整个页面应用的视图上看,它在DOM中应该被渲染在整个vue应用外部的其他地方,不能影响…

[架构之路-159]-《软考-系统分析师》-10-系统分析-6-现有业务流程分析, 系统分析最核心的任务

目录 第 10章 现有系统 分 析 1 0 . 6 现有业务流程分析 10.6.1 业务流程分析槪述 1 . 业务流程分析的步骤 2 . 业务流程分析的方法 10.6.2 业务-流程图TFD 1. T F D 的基本符号 2. TFD的绘制 10.6.3 业务 - 活动图 10.6.4 业务流程建模BPM 1. B P M 概述 2 . 标杆…