【ESP32--FreeRTOS 任务间的同步与通信】

news2025/4/8 0:51:35

本文主要记录【ESP32–FreeRTOS 任务间的同步与通信】的学习记录,邮件,信号量,事件组的使用和优缺点以及应用场景

📋 个人简介

  • 💖 作者简介:大家好,我是喜欢记录零碎知识点的小菜鸟。😎
  • 📝 个人主页:欢迎访问我的 Ethernet_Comm 博客主页🔥
  • 🎉 支持我:点赞👍+收藏⭐️+留言📝
  • 📣 系列专栏:esp32二次开发专栏🍁
  • 💬格言:写文档啊不是写文章,重要的还是直白!🔥

【ESP32--FreeRTOS 任务间的同步与通信】

  • 1. FreeRTOS 任务间的同步
    • 1.1 全局变量
    • 1.2 二值信号量
    • 1.3 计数信号量
    • 1.4 事件组
    • 1.5 邮箱(消息队列)
  • 2. FreeRTOS 任务间的通信

1. FreeRTOS 任务间的同步

参考:FreeRTOS 任务间通信与同步总结

1.1 全局变量

ESP32 RTOS 任务同步与消息通信篇概述

1.2 二值信号量

static **SemaphoreHandle_t **binary_sem;

使用二值信号量实现任务间单向同步

实现:任务A发送一个信号通知任务B,实现任务间的信号传递

【注意事项】

  • 适用于2个任务之间,不适合多任务之间
  • 接收信号量的任务的优先级>发送信号量的任务的优先级

【应用场景】

  • 中断发送通知,任务处理事务
  • 多次数据采集,通知集中处理数据

初始化信号量为0

task1task1_flag 计数,小于5时,在此期间,信号量的值一直为0,所以 task2 在 take 信号量时,会一直阻塞等待

task1task1_flag 计数到5,Give 信号量 +1 ,task2 takex信号量,值为1,继续执行 task2 ,取消阻塞并将 信号量 -1

一般的,数据生产者 give 信号量,数据消费者 take 信号量

1.3 计数信号量

使用计数信号量实现任务间单向同步

static **SemaphoreHandle_t **sync_count_sem;

这个没太看明白

1.4 事件组

二值信号量处理一个事情发生,事件组是可以处理一组事件发生的同步组件。

【应用场景】

  • 用于多个任务的同步
  • 任务1、任务2向任务3通过事件组发送事件,任务3接收事件,并打印是哪个任务在发送事件
  • 任务3的 xEventGroupWaitBits 如果是 逻辑“或”,则表示,任务1和任务2有一个发生,任务3就执行;若果是 逻辑“与”,则表示任务1和任务2都发生,任务3才会执行

1.5 邮箱(消息队列)

在这里插入图片描述

邮箱也称为“消息队列

用邮箱实现多事件的单向同步

【注意事项】

发送到队列的数据是通过 值copy 实现的,所以局部变量的值也可以发送到队列中,也伴随着比较耗内存,开销较大

2. FreeRTOS 任务间的通信

1)全局变量

2)实现等待-通知机制,通过缓存机制处理数据覆盖问题,允许多个数据发送方-接收方->队列

3)单个发送方-单个接收方场景下,发送变长数据,并指定触发唤醒等待任务的数据长度的机制->streambuf

4)单个发送方-单个接收方场景下,发送具备固定格式的变长数据->messagebuf

5)多个发送方-多个接收方场景下,发送变长数据,增加管理数据覆盖(溢出)机制->ringbuf

6)实现同时监控多个信号量、队列、ringbuf的机制-> queuesets(队列集)

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

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

相关文章

软件测试之随机测试

目录 一、作随机测试之前的一些前提条件 二、随机测试功能点的选取 三、功能点的随机测试 在软件测试中除了根据测试用例和测试说明书进行功能测试外,还需要进行随机测试(Ad-hoc testing),随机测试是没有书面测试用例、记录期望…

【算法】插入排序

插入排序 插入排序代码实现代码优化 排序: 排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。 稳定性: 假定在待排序的记录序列中,存在多个具有相同的关键字的记录&…

【算法】归并排序 详解

归并排序 详解 归并排序代码实现1. 递归版本2. 非递归版本 排序: 排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。 稳定性: 假定在待排序的记录序列中,存在多个具有相…

dpkt 处理linux cooked capture

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

CUDA小白 - NPP(4) 图像处理 Data Exchange and Initialization(1)

cuda小白 原始API链接 NPP GPU架构近些年也有不少的变化,具体的可以参考别的博主的介绍,都比较详细。还有一些cuda中的专有名词的含义,可以参考《详解CUDA的Context、Stream、Warp、SM、SP、Kernel、Block、Grid》 常见的NppStatus&#xf…

QT 初识多线程

1.QThread线程基础 QThread是Qt线程中有一个公共的抽象类,所有的线程类都是从QThread抽象类中派生的,需要实现QThread中的虚函数run(),通过start()函数来调用run函数。 void run()函数是线程体函数,用于定义线程的功能…

借助CIFAR10模型结构理解卷积神经网络及Sequential的使用

CIFAR10模型搭建 CIFAR10模型结构 0. input : 332x32,3通道32x32的图片 --> 特征图(Feature maps) : 3232x32即经过32个35x5的卷积层,输出尺寸没有变化(有x个特征图即有x个卷积核。卷积核的通道数与输入的通道数相等,即35x5&am…

01-从JDK源码级别剖析JVM类加载机制

1. 类加载运行全过程 当我们用java命令运行某个类的main函数启动程序时,首先需要通过类加载器把主类加载到JVM。 public class Math {public static final int initData 666;public static User user new User();public int compute() { //一个方法对应一块栈帧…

整理mongodb文档:事务(一)

个人博客 整理mongodb文档:事务(一) 原文链接,个人博客 求关注,本文主要讲下怎么在mongose下使用事务,建议电脑端看 文章概叙 本文的开发环境为Nodejs,在‘单机模式’讲解最基本的事务概念。并没有涉及分片以及集群&#xff0…

《向量数据库指南》——AI原生向量数据库Milvus Cloud 2.3新功能

New Feature Upsert 功能 支持用户通过 upsert 接口更新或插入数据。已知限制,自增 id 不支持 upsert;upsert 是内部实现是 delete + insert所以性能上会有一定损耗,如果明确知道是写入数据的场景请继续使用 insert。 Range Search 功能 支持用户通过输入参数指定 search 的…

TortoiseGit设置作者信息和用户名、密码存储

前言 Git 客户端每次与服务器交互,都需要输入密码,但是我们可以配置保存密码,只需要输入一次,就不再需要输入密码。 操作说明 在任意文件夹下,空白处,鼠标右键点击 在弹出菜单中按照下图点击 依次点击下…

LLVM 与代码混淆技术

项目源码 什么是 LLVM LLVM 计划启动于2000年,开始由美国 UIUC 大学的 Chris Lattner 博士主持开展,后来 Apple 也加入其中。最初的目的是开发一套提供中间代码和编译基础设施的虚拟系统。 LLVM 命名最早源自于底层虚拟机(Low Level Virtu…

LEARN GIT

概念 基础概念 本地电脑 代码区:工作区间,放代码的地方 暂存区:git所管理的暂存区域 本地仓库:git所管理的本机的硬盘区域 远程电脑 远程仓库:github、gitee 代码提交管理的过程 代码区------->暂存区-------&…

关于 RK3568的linux系统killed用户应用进程(用户现象为崩溃) 的解决方法

若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/132710642 红胖子网络科技博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬…

模拟Proactor模式实现 I/O 处理单元

编写main.cpp 1.socket通信 服务器应用程序可以通过读取和写入 Socket 对象 来监听来自客户端的请求并向客户端返回响应 #define MAX_FD 65536 // 最大的文件描述符个数 #define MAX_EVENT_NUMBER 10000 // 监听的最大的事件数量 // 添加信号捕捉 void addsig(int sig, …

【MySQL】索引 详解

索引 详解 一. 概念二. 作用三. 使用场景四. 操作五. 索引背后的数据结构B-树B树聚簇索引与非聚簇索引 一. 概念 索引是一种特殊的文件,包含着对数据表里所有记录的引用指针。可以对表中的一列或多列创建索引,并指定索引的类型,各类索引有各…

机器学习的特征工程

字典特征提取 def dict_demo():"""字典特征提取:return:"""data [{city: 北京, temperature: 100}, {city: 上海, temperature: 60}, {city: 深圳, temperature: 30}]# data [{city:[北京,上海,深圳]},{temperature:["100","6…

《机器人学一(Robotics(1))》_台大林沛群 第 5 周【机械手臂 轨迹规划】 Quiz 5

我又行了!🤣 求解的 位置 可能会有 变动,根据求得的A填写相应值即可。注意看题目。 coursera链接 文章目录 第1题 Cartesian space求解 题1-3 的 Python 代码 第2题第3题第4题 Joint space求解 题4-6 的 Python 代码 第5题第6题其它可参考代…

leetcode 88:合并两个有序数组 。 双指针解法

题目 算法 双指针 code var merge function(nums1, m, nums2, n) {// 其实就是一个nums1数组从后向前的降序重排,从最后开始,比较nums1有效位置和nums2当前位置数的大小,依次填入,nums2最后若有剩余,则再多一步从后…

9、补充视频

改进后的dijkstra算法 利用小根堆 将小根堆特定位置更改,再改成小根堆 nodeHeap.addOrUpdateOrIgnore(edge.to, edge.weight + distance);//改进后的dijkstra算法 //从head出发,所有head能到达的节点,生成到达每个节点的最小路径记录并返回 public static HashMap<No…