FreeRTOS操作系统学习——同步互斥与通信

同步(Synchronization)

同步是一种机制,用于确保多个任务能够按照特定的顺序协调执行或共享数据。当一个任务需要等待其他任务完成某个操作或满足某个条件时,同步机制可以帮助任务进行协调和等待。

在FreeRTOS中,常见的同步机制包括任务通知(Task Notification)、信号量(Semaphore)、事件标志组(Event Group)等。这些机制可以通过任务等待和任务唤醒来实现任务之间的协调和数据交换。

  • 任务通知:任务通知允许任务之间通信和同步状态。任务可以等待特定的通知事件,并在事件发生时被唤醒。任务之间可以通过任务通知来传递数据和信息。

  • 信号量:信号量是一种计数器,用于控制对资源的访问。当一个任务需要访问共享资源时,它可以尝试获取一个信号量。如果信号量计数器为正(表示有可用资源),则任务可以继续执行。如果计数器为零,则任务进入阻塞状态,等待信号量计数器变为正。

  • 事件标志组:事件标志组是一种用于任务通信和同步的机制,可以通过设置、清除和等待事件标志来实现任务间的同步和数据传递。任务可以等待多个特定的事件标志同时发生,以及循环等待、超时等。

互斥(Mutex)

互斥是一种机制,用于确保在任何给定时间只有一个任务能够访问共享资源。当一个任务获得了互斥锁时,在它释放互斥锁之前,其他任务将无法获得同一个互斥锁。这样可以有效地避免多个任务同时访问和修改共享资源导致的竞态条件或数据不一致问题。

  • 在FreeRTOS中,使用xSemaphoreCreateMutex()函数创建一个互斥锁(Mutex
    Semaphore)。通过调用xSemaphoreTake()获取互斥锁,调用xSemaphoreGive()释放互斥锁。

原文链接:https://blog.csdn.net/Goforyouqp/article/details/131811382

同步机制都可以使用相应的FreeRTOS API函数来创建、等待和释放。所以,互斥用于保护共享资源的独占访问,同步用于任务之间的协调和数据交换。通过适当的使用互斥和同步机制,可以确保任务之间的安全访问和正确的执行顺序。

传统同步与互斥的缺陷

在裸机程序里,可以使用一个全局变量或静态变量实现互斥操作,比如要互斥地使用LCD,可以使用如下代码:
在这里插入图片描述
假设如下场景: 有两个任务 A、 B 都想调用 LCD_PrintString, 任务 A 执行到第 4 行代码时发现 bCanUse 为 1,可以进入 if 语句块,它还没执行第 6 句指令就被切换出去了;然后任务 B 也调用 LCD_PrintString,任务 B 执行到第 4 行代码时也发现 bCanUse 为 1,也可以进入 if 语句块使用 LCD。 在这种情况下,使用静态变量并不能实现互斥操作!!!
上述方法不能保证万无一失的原因在于:在判断过程中,被打断了。如果能保证这个过程不被打断,就可以了:通过关闭中断来实现。
在这里插入图片描述

实现同步与互斥的方法

能实现同步、互斥的内核方法有:任务通知(task notification)、队列(queue)、事件组(event group)、信号量(semaphoe)、互斥量(mutex)。

在这里插入图片描述

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

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

相关文章

深入了解 Java 方法和参数的使用方法

Java 方法 简介 方法是一块仅在调用时运行的代码。您可以将数据(称为参数)传递到方法中。方法用于执行特定的操作,它们也被称为函数。 使用方法的原因 重用代码:定义一次代码,多次使用。提高代码的结构化和可读性。…

Spring官网中查看MongoDB的API文档的详细步骤

目录 Spring官网中查看MongoDB的API文档的详细步骤1、进入 Spring 官网2、选择 Mongodb的文档介绍3、点击API文档4、进入文档查询页面 Spring官网中查看MongoDB的API文档的详细步骤 1、进入 Spring 官网 首先进入Spring的官网,然后点击【Spring Data】 2、选择 Mon…

Java二叉树 (2)

🐵本篇文章将对二叉树的一些基础操作进行梳理和讲解 一、操作简述 int size(Node root); // 获取树中节点的个数int getLeafNodeCount(Node root); // 获取叶子节点的个数int getKLevelNodeCount(Node root,int k); // 获取第K层节点的个数int getHeight(Node r…

hadoop 总结

1.hadoop 配置文件 core-site hdfs-site yarn-site.xml worker hdfs-site.xml <?xml version"1.0" encoding"UTF-8"?> <?xml-stylesheet type"text/xsl" href"configuration.xsl"?> <configuration><pr…

P1958 上学路线

难度&#xff1a;普及- 题目描述 你所在城市的街道好像一个棋盘&#xff0c;有 a 条南北方向的街道和 b 条东西方向的街道。南北方向的 a 条街道从西到东依次编号为 1 到 a&#xff0c;而东西方向的 b 条街道从南到北依次编号为 1 到 b&#xff0c;南北方向的街道 i 和东西方…

Java中常用的函数式接口

Java中常用的函数式接口 在Java中&#xff0c;函数式接口&#xff08;Functional Interface&#xff09;是一种只有一个抽象方法的接口。Java 8引入了函数式接口和Lambda表达式&#xff0c;使得编写简洁、易读的代码成为可能。Java中常用的函数式接口包括&#xff1a; Runnab…

单数码管(arduino)

1.连接方法 挨个点亮每个灯 #include <Arduino.h>int pin_list[] {4, 5, 19, 21, 22, 2, 15, 18}; int num_pins sizeof(pin_list) / sizeof(pin_list[0]); // 计算数组中的元素数量void setup() {// 设置每个引脚为输出for(int i 0; i < num_pins; i) {pinMode(p…

C语言:ctype和string库中的部分常用函数的应用和实现

在编程过程中&#xff0c;我们经常要处理字符和字符串&#xff0c;C语言标准库中就提供了一系列的库函数&#xff0c;便于我们操作库函数。 字符分类函数 C语⾔中有⼀系列的函数是专⻔做字符分类的&#xff0c;也就是⼀个字符是属于什么类型的字符的。这些函数的使⽤都需要包含…

Springboot 集成kafka 消费者实现ssl方式连接监听消息实现消费

证书准备&#xff1a;springboot集成kafka 消费者实现 如何配置是ssl方式连接的时候需要进行证书的转换。原始的证书是pem, 或者csr方式 和key方式的时候需要转换&#xff0c;因为kafka里面是jks 需要通过openssl进行转换。 证书处理&#xff1a; KeyStore 用于存储客户端的证…

分类预测 | Matlab基于TTAO-CNN-LSTM-Attention三角拓扑聚合优化算法优化卷积神经网络-长短期记忆网络-注意力机制的数据分类预测

分类预测 | Matlab基于TTAO-CNN-LSTM-Attention三角拓扑聚合优化算法优化卷积神经网络-长短期记忆网络-注意力机制的数据分类预测 目录 分类预测 | Matlab基于TTAO-CNN-LSTM-Attention三角拓扑聚合优化算法优化卷积神经网络-长短期记忆网络-注意力机制的数据分类预测分类效果基…

ABC344 A-E题解

文章目录 A题目AC Code&#xff1a; B题目AC Code&#xff1a; C题目AC Code&#xff1a; D题目AC Code&#xff1a; E题目AC Code&#xff1a; 不易不难&#xff0c;写到5题很简单&#xff0c;但是要有足够的思维能力。 A 题目 我们用一个 flag 变量记录我们是不是在两个竖…

python根据文件路径获取文件名

如果你想要获取文件路径中的文件名但不包括后缀名&#xff0c;你可以使用os.path.splitext()函数来分割文件名和后缀名&#xff0c;然后只取第一个部分。下面是一个例子&#xff1a; import os# 假设你有一个文件路径 file_path "/path/to/your/file.txt"# 使用os.…

人工智能、深度学习、机器学习书目推荐

AI入门书籍 人工智能基础 《Python神经网络编程》[英]塔里克拉希德(TariqRashid)中国工信部出版社入门强推&#xff0c;非常清晰的描述基于神经网络的人工智能基本原理&#xff0c;入门必看书目《统计学习方法》李航清华大学出版社人工智能必备数学基础&#xff0c;需要一定的…

【MacOS 上安装 Homebrew 】讲解

macOS 安装 Homebrew macOS 上安装 Homebrew 是一个相对简单的过程&#xff0c;Homebrew 是一款开源的软件包管理工具&#xff0c;它可以让你在 Mac 上轻松安装、更新和管理软件包。以下是安装 Homebrew 的步骤&#xff1a; 1. 打开终端&#xff1a; 你可以通过在 Finder 中…

CCF-CSP真题201403-2《窗口》(结构体+数组)

问题描述 在某图形操作系统中,有 N 个窗口,每个窗口都是一个两边与坐标轴分别平行的矩形区域。窗口的边界上的点也属于该窗口。窗口之间有层次的区别,在多于一个窗口重叠的区域里,只会显示位于顶层的窗口里的内容。   当你点击屏幕上一个点的时候,你就选择了处于被点击位置的…

前端发展史与优秀编程语言

前端开发是互联网技术领域中的一个重要分支&#xff0c;负责构建用户直接交互的网页和应用程序界面。随着互联网的发展&#xff0c;前端技术经历了多个阶段的演变&#xff0c;从最初的简单静态页面到如今的复杂交互式应用&#xff0c;不断推动着用户体验的提升和网页功能的丰富…

Vue3 重置覆盖 reactive 数组数据的方法

核心要点&#xff1a; 通过splice删除原数组内的所有数据&#xff0c;并添加新的数据进去。潜在影响&#xff1a;大数据量下&#xff0c;splice重置数组和 ref 的.value重新赋值重置数组&#xff0c;哪个耗时短还需自行测试。 通过 splice 传入0 和 Infinity 来删除原数组从头…

【Python】进阶学习:OpenCV--一文详解cv2.namedWindow()

【Python】进阶学习&#xff1a;OpenCV–一文详解cv2.namedWindow() &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&#x1f448; 希望…

C++椭圆检测论文复现 Ubuntu 22.04+Vscode+opencv3.4

复现的代码 本博客旨在复现论文《An Efficient High-quality Ellipse Detection》&#xff0c;该文章本来只有Matlab的代码实现&#xff0c;后来被islands翻译成了c 库&#xff0c;大家可以参考islands发在知乎上的文章高质量椭圆检测库&#xff0c;C的代码链接。 使用环境 U…

整合生成型AI战略:从宏观思维到小步实践

“整合生成型AI战略&#xff1a;从宏观思维到小步实践” 在这篇文章中&#xff0c;我们探讨了将生成型AI和大型语言模型融入企业核心业务的战略开发方法。我们的方法基于敏捷开发原则&#xff0c;技术专家和数据科学家需要采纳商业思维&#xff0c;而执行官则需理解生成型AI和…