FreeRTOS中的互斥和同步怎么理解(通俗易懂版)-利用银行取钱和存钱两个任务举例

目录

1. 互斥(Mutex)

2. 同步(Synchronization)

通俗易懂的例子加代码

1. 互斥(Mutex):

2. 同步(Synchronization):


1. 互斥(Mutex)

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

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

2. 同步(Synchronization)

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

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

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

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

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

上述同步机制都可以使用相应的FreeRTOS API函数来创建、等待和释放。

所以,互斥用于保护共享资源的独占访问,同步用于任务之间的协调和数据交换。通过适当的使用互斥和同步机制,可以确保任务之间的安全访问和正确的执行顺序。

通俗易懂的例子加代码

考虑一个模拟银行账户的场景,有两个任务:`Task_A`和`Task_B`,它们同时访问共享的银行账户`balance`

volatile int balance = 0;

假设`Task_A`是一个存款任务,`Task_B`是一个取款任务。现在我们来看看如何使用互斥和同步机制来保护共享资源。

1. 互斥(Mutex):

我们可以使用一个互斥锁来确保在任何给定时间只有一个任务能够修改账户余额。当一个任务在存款或取款前获得互斥锁时,其他任务将无法获得同一个互斥锁,从而保证了操作的原子性。

SemaphoreHandle_t mutex = NULL;  // 互斥锁// 在任务初始化中创建互斥锁void init_tasks(void) {mutex = xSemaphoreCreateMutex();}// Task_A 存款任务void Task_A(void *pvParameters) {while(1) {// 获取互斥锁xSemaphoreTake(mutex, portMAX_DELAY);// 存款操作balance += 100;// 释放互斥锁xSemaphoreGive(mutex);}}// Task_B 取款任务void Task_B(void *pvParameters) {while(1) {// 获取互斥锁xSemaphoreTake(mutex, portMAX_DELAY);// 取款操作balance -= 50;// 释放互斥锁xSemaphoreGive(mutex);}}

在上述示例中,当一个任务执行存款或取款操作时,它将获取互斥锁并在完成操作后释放互斥锁,这样在同一时间只有一个任务能够修改账户余额。

2. 同步(Synchronization):

我们可以使用一个信号量来实现任务之间的同步,确保取款任务在账户余额不足时等待存款任务补充余额。

 SemaphoreHandle_t semaphore = NULL;  // 信号量// 在任务初始化中创建信号量void init_tasks(void) {semaphore = xSemaphoreCreateBinary();}// Task_A 存款任务void Task_A(void *pvParameters) {while(1) {// 存款操作balance += 100;// 发送信号,通知取款任务可以继续执行xSemaphoreGive(semaphore);}}// Task_B 取款任务void Task_B(void *pvParameters) {while(1) {// 等待信号,如果账户余额不足就阻塞等待xSemaphoreTake(semaphore, portMAX_DELAY);// 取款操作balance -= 50;}}

在上述示例中,取款任务等待信号量变为可用(即存款任务将金额存入账户),这样可以确保取款任务在有足够余额时才能执行。

通过在存款和取款任务中使用互斥锁和信号量,我们实现了对共享资源的互斥访问和任务之间的同步,确保操作的正确性和数据的一致性。

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

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

相关文章

vscode远程连接提示:过程试图写入的管道不存在(删除C:\Users\<用户名>\.ssh\known_hosts然后重新连接)

文章目录 复现过程原因解决方法总结 复现过程 我是在windows上用vscode远程连接到我的ubuntu虚拟机上,后来我的虚拟机出了点问题,我把它回退了,然后再连接就出现了这个问题 原因 本地的known_hosts文件记录服务器信息与现服务器的信息冲突了…

虚拟机挂载USB设备/USB serial 连接开发板

虚拟机挂载USB设备 1、添加USB设备 2、终端输入:sudo fdisk -l 查看Device设备: 3、创建挂载目录:mkdir /mnt/usb 4、执行挂载命令:sudo mount /dev/sdb1 /mnt/usb ,查看/mnt/usb目录下是否存在U盘中的数据: 5、用…

html实现时钟

1、html代码 <div id"clock"><div><span id"hours"></span><span class"text"> 时 : </span></div><div><span id"minutes"></span><span class"text">…

设计模式——桥梁模式

桥梁模式 定义 桥梁模式&#xff08;Bridge Pattern&#xff09;也叫做桥接模式。 将抽象和显示解耦&#xff0c;使得两者可以独立地变化。 优缺点、应用场景 优点 抽象和实现的解耦。 这是桥梁模式的主要特点&#xff0c;它完全是为了解决继承的缺点而提出的设计模式。优…

流体力学中的湍流强度(turbulence intensity)

流体力学中的湍流强度&#xff08;turbulence intensity&#xff09; 一、定义 湍流强度&#xff08;turbulence intensity&#xff09;也被称为湍流级&#xff08;turbulence level&#xff09;&#xff0c;被定义为&#xff1a; I ≡ u ′ U I \equiv \frac{u}{U} I≡Uu′…

成为一个年薪30W+的DFT工程师是一种什么体验?

一直以来&#xff0c;DFT都是数字IC设计行业中相对神秘的一个岗位。 你说他重要吧&#xff0c;并不是所有芯片设计公司都有这个岗位&#xff0c;你说他不重要吧&#xff0c;但凡芯片产品达到一定规模后&#xff0c;就必须设置DFT部门。 一、什么是DFT&#xff1f; DFT&#x…

原生信息流广告APP应用内增收及计费模式

比起传统的广告宣传&#xff0c;信息流最大的优势就在于流量的庞大。与此同时&#xff0c;多样化的信息流广告形式和精准的定向&#xff0c;还可以帮助广告主准确获取意向流量。此外&#xff0c;它的广告形式不强迫推送&#xff0c;因此也受到了广泛用户的支持和青睐。 原生信…

音视频开发实战03-FFmpeg命令行工具移植

一&#xff0c;背景 作为一个音视频开发者&#xff0c;在日常工作中经常会使用ffmpeg 命令来做很多事比如转码ffmpeg -y -i test.mov -g 150 -s 1280x720 -codec libx265 -r 25 test_h265.mp4 &#xff0c;水平翻转视频&#xff1a;ffmpeg -i src.mp4 -vf hflip -acodec copy …

26.JavaWeb-SpringSecurity安全框架

1.SpringSecurity安全框架 Spring Security是一个功能强大且灵活的安全框架&#xff0c;它专注于为Java应用程序提供身份验证&#xff08;Authentication&#xff09;、授权&#xff08;Authorization&#xff09;和其他安全功能。Spring Security可以轻松地集成到Spring框架中…

zsh: command not found: mulate

MacOS 执行 poetry shell后报错如下&#xff1a; *[main][~/coding/ensure_import]$ poetry shell Spawning shell within /Users/mac10.12/Library/Caches/pypoetry/virtualenvs/ensure-import-3q-JXftD-py3.11 [oh-my-zsh] Would you like to update? [Y/n] [oh-my-zsh] Yo…

MySQL数据库(五)

目录 一、数据库的约束 1.1 约束类型 1.1.1 null约束 1.1.2unique约束 1.1.3default默认值约束 1.1.4primary key主键约束 1.1.5foreign key外键约束 二、内容重点总结 一、数据库的约束 1.1 约束类型 not null - 指示某列不能存储 null值。unique - 保证某列的每行必须有唯一…

简单机器学习工程化过程

1、确认需求&#xff08;构建问题&#xff09; 我们需要做什么&#xff1f; 比如根据一些输入数据&#xff0c;预测某个值&#xff1f; 比如输入一些特征&#xff0c;判断这个是个什么动物&#xff1f; 这里我们要可以尝试分析一下&#xff0c;我们要处理的是个什么问题&…

上市公司Git分支管理规范

Git分支管理策略 主分支Master 首先&#xff0c;代码库应该有一个、且仅有一个主分支。所有提供给用户使用的正式版本&#xff0c;都在这个主分支上发布。 Git主分支的名字&#xff0c;默认叫做Master。它是自动建立的&#xff0c;版本库初始化以后&#xff0c;默认就是在主…

python编程语言之函数基础

函数基础 设计一个程序输出一下图案效果&#xff1a; ************************* ************************************************************* ************************************根据已经学过的内容&#xff0c;我们的实现方式如下&#xff1a; rows6#第1个菱形的上…

采集传感器的物联网网关怎么采集数据?

随着工业4.0和智能制造的快速发展&#xff0c;物联网&#xff08;IoT&#xff09;技术的应用越来越广泛&#xff0c;传感器在整个物联网系统中使用非常普遍&#xff0c;如温度传感器、湿度传感器、光照传感器等&#xff0c;对于大部分物联网应用来说&#xff0c;采集传感器都非…

Ubuntu学习笔记(二)——文件属性与权限

文章目录 前言一、用户与用户组1.用户&#xff08;文件拥有者&#xff09;2.用户组3.其他人 二、Linux用户身份与用户组记录文件1. /etc/passwd2. /etc/shadow3. /etc/group 三、文件属性与权限1. 查看文件属性的方法&#xff08;ls&#xff09;2.文件属性详细介绍2.1 权限2.2 …

将composer的bin目录放到PATH环境变量中

使用composer global config bin-dir --absolute查看composer的bin目录 输出类似 Changed current directory to /home/lijun/.config/composer /home/lijun/.config/composer/vendor/bin/home/lijun/.config/composer/vendor/bin就是composer的bin目录 将/home/lijun/.confi…

使用python里的神经网络进行数据分类预测

在Python中使用神经网络进行数据分类预测&#xff0c;可以使用深度学习库如TensorFlow、Keras或PyTorch来实现。以下是使用Keras库的示例代码&#xff1a; Step 1: 准备数据 首先&#xff0c;准备用于训练和测试神经网络的数据集。将数据集分为输入特征和相应的目标类别。确保…

MacOS触控板缩放暂时失灵问题解决

我的系统版本为Monterey 12.5.1&#xff0c;亲测有效 直接创建脚本xxx.sh&#xff0c;并在终端执行脚本bash xxx.sh即可解决此问题&#xff0c;脚本内容如下&#xff1a; #!/bin/bashkillall Finder #kill Finder如不需要可以删除 killall Dock #kill Dock 如不需要可以删…

【wxWidgets】使用布局控件进行窗口布局

使用布局控件进行窗口布局 窗口布局基础 为了在各种环境中都能使窗口拥有合适的位置和大小&#xff0c;可能需要在OnSize事件中计算每一个窗口的大小并设置新位置&#xff0c;当然使用窗口布局控件可以更方便地实现 如果选择使用布局控件&#xff0c;可以通过自己编写或者使用…