【FreeRTOS】互斥量的使用与逐步实现
在FreeRTOS中,互斥量是一种用于保护共享资源的同步机制。它通过二进制信号量的方式,确保在任意时刻只有一个任务可以获取互斥量并访问共享资源,其他任务将被阻塞。使用互斥量的基本步骤包括创建互斥量、获取互斥量、访问共享资源和释放互斥量。互斥量在FreeRTOS中起到了重要的作用,保护共享资源的访问,提供了一种有效的同步机制,确保任务之间的协作和数据的一致性。
文章目录
- 互斥量的理解
- 互斥量使用的相关函数
- 使用互斥量的步骤
- 示例代码
互斥量的理解
在FreeRTOS中,互斥量是一种用于保护共享资源的同步机制。它是一种二进制信号量,只有两种状态:可用和不可用。当互斥量可用时,一个任务可以获取互斥量并访问共享资源,而其他任务将被阻塞。当互斥量不可用时,任务将等待直到互斥量可用。
互斥量使用的相关函数
-
xSemaphoreCreateMutex()
- 作用:创建一个互斥量。
- 原型:
SemaphoreHandle_t xSemaphoreCreateMutex(void)
- 参数:无。
- 返回值:返回一个指向互斥量的句柄(
SemaphoreHandle_t
)。
-
xSemaphoreTake()
- 作用:获取(锁定)互斥量。
- 原型:
BaseType_t xSemaphoreTake(SemaphoreHandle_t xMutex, TickType_t xTicksToWait)
- 参数:
xMutex
:互斥量的句柄。xTicksToWait
:可选参数,指定等待互斥量的时间,单位为时钟周期(Tick)。
- 返回值:
- 如果成功获取互斥量,则返回
pdPASS
。 - 如果等待超时或其他原因导致获取失败,则返回
errQUEUE_EMPTY
。
- 如果成功获取互斥量,则返回
-
xSemaphoreGive()
- 作用:释放(解锁)互斥量。
- 原型:
BaseType_t xSemaphoreGive(SemaphoreHandle_t xMutex)
- 参数:
xMutex
:互斥量的句柄。 - 返回值:返回
pdPASS
。
使用互斥量的步骤
-
创建互斥量:使用
xSemaphoreCreateMutex()
函数创建一个互斥量。该函数返回一个指向互斥量的句柄。 -
获取互斥量:在需要访问共享资源的任务中,使用
xSemaphoreTake()
函数获取互斥量。如果互斥量当前可用,则任务将继续执行。如果互斥量不可用,则任务将被阻塞,直到互斥量可用。 -
访问共享资源:在获得互斥量后,可以安全地访问共享资源。
-
释放互斥量:使用
xSemaphoreGive()
函数释放互斥量。这将使得其他任务可以获取互斥量并访问共享资源。
需要注意的是,获取互斥量后,任务应该在访问共享资源后尽快释放互斥量,以便其他任务能够获取互斥量。否则,如果任务长时间持有互斥量,可能会导致其他任务被阻塞,影响系统的响应性能。
互斥量还有一些其他的使用方式和函数,比如可超时获取互斥量的函数xSemaphoreTake()
,以及获取互斥量时阻塞的最长时间等。这些功能可以根据具体需求进行使用。
示例代码
#include "FreeRTOS.h"
#include "task.h"
#include "semphr.h"// 共享资源
int sharedResource = 0;// 互斥量
SemaphoreHandle_t mutex;void task1(void *pvParameters)
{while (1) {// 获取互斥量xSemaphoreTake(mutex, portMAX_DELAY);// 访问共享资源sharedResource++;// 释放互斥量xSemaphoreGive(mutex);vTaskDelay(pdMS_TO_TICKS(1000));}
}void task2(void *pvParameters)
{while (1) {// 获取互斥量xSemaphoreTake(mutex, portMAX_DELAY);// 访问共享资源sharedResource--;// 释放互斥量xSemaphoreGive(mutex);vTaskDelay(pdMS_TO_TICKS(1000));}
}int main(void)
{// 创建互斥量mutex = xSemaphoreCreateMutex();// 创建任务xTaskCreate(task1, "Task 1", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY + 1, NULL);xTaskCreate(task2, "Task 2", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY + 1, NULL);// 启动调度器vTaskStartScheduler();return 0;
}
在示例中,两个任务分别获取互斥量mutex
,然后对共享资源sharedResource
进行操作,并在操作完成后释放互斥量。这样可以确保同时只有一个任务能够访问共享资源,避免了数据竞争的问题。
相关文章:

【FreeRTOS】互斥量的使用与逐步实现
在FreeRTOS中,互斥量是一种用于保护共享资源的同步机制。它通过二进制信号量的方式,确保在任意时刻只有一个任务可以获取互斥量并访问共享资源,其他任务将被阻塞。使用互斥量的基本步骤包括创建互斥量、获取互斥量、访问共享资源和释放互斥量…...

Spring-Cloud-Openfeign如何传递用户信息?
用户信息传递 微服务系统中,前端会携带登录生成的token访问后端接口,请求会首先到达网关,网关一般会做token解析,然后把解析出来的用户ID放到http的请求头中继续传递给后端的微服务,微服务中会有拦截器来做用户信息的…...

OpenCV(十一):图像仿射变换
目录 1.图像仿射变换介绍 仿射变换: 仿射变换矩阵: 仿射变换公式: 2.仿射变换函数 仿射变换函数:warpAffine() 图像旋转:getRotationMatrix2D() 计算仿射变换矩阵:getAffineTransform() 3.demo 1.…...

多路波形发生器的控制
本次波形发生器,主要使用运算放大器、NE555以及一些其他的电阻电容器件来实现。整体电路图如下所示: 产生的三角波如下: 正弦波如下 方波如下: 运算放大器(Operational Amplifier,简称OP-AMP)是…...

[C/C++]天天酷跑超详细教程-中篇
个人主页:北海 🎐CSDN新晋作者 🎉欢迎 👍点赞✍评论⭐收藏✨收录专栏:C/C🤝希望作者的文章能对你有所帮助,有不足的地方请在评论区留言指正,大家一起学习交流!ǹ…...

面试被打脸,数据结构底层都不知道么--回去等通知吧
数据结构之常见的8种数据结构: -数组Array -链表 Linked List -堆 heap -栈 stack -队列 Queue -树 Tree -散列表 Hash -图 Graph 数据结构-链表篇 Linklist定义: -是一种线性表,并不会按线性的顺序存储数据,即逻辑上相邻…...
微服务面试问题小结( 微服务、分布式、MQ、网关、zookeeper、nginx)
什么是微服务,单体架构的优点和缺点,微服务架构的优点和缺点? 单体架构 优点:架构简单,维护成本低缺点:各个模块耦合度太高,当对一个模块进行更新修改时,会影响到其他模块ÿ…...
Vue3全局变量使用
全局变量(函数等)可以在任意组件内访问,可以当组件间的传值使用。 main.js import ./assets/main.cssimport { createApp } from vue import App from ./App.vueconst app createApp(App); app.config.globalProperties.$global_id10; app.…...
拼多多海量商品数据接口API 商品详情接口 商品价格主图接口
拼多多,作为中国最大的社交电商之一,提供了丰富的商品信息和海量的用户数据。对于广大开发者而言,如何快速、准确地获取这些数据,进而开发出各种创新应用,是他们关心的问题。本文将详细介绍拼多多海量商品数据接口API的…...

结构化日志记录增强网络安全性
日志是一种宝贵的资产,在监视和分析应用程序或组织的 IT 基础结构的整体安全状况和性能方面发挥着至关重要的作用。它们提供系统事件、用户活动、网络流量和应用程序行为的详细记录,从而深入了解潜在威胁或未经授权的访问尝试。虽然组织历来依赖于传统的…...

企业架构LNMP学习笔记5
Nginx: 常见用法: 1)web服务器软件 httpd http协议 同类的web服务器软件:apache Nginx(俄罗斯)IIS(微软)lighttpd(德国) 2)代理服务器 反向代…...

Idea安装免注册版ChatGPT
文章目录 一、前期准备二、开始使用 一、前期准备 1.准备Idea开发软件并打开(VS Code同理)! 2.【CtrlAltS】快捷键调出Settings窗口,如图 3.找到NexChatGPT 此插件不需要注册,可以直接使用(高级一些的需要会员收费限…...
git操作
一、查看远程分支 使用如下git命令查看所有远程分支: git branch -r 查看远程和本地所有分支: git branch -a 查看本地分支: git branch 在输出结果中,前面带* 的是当前分支。 二、拉取远程分支并创建本地分支 方法一 使用如下…...
9 | 求出不同性别和不同科目的学生平均分数
需求描述:学生成绩分析 背景: 我们有一组学生的成绩数据,其中包括学生的姓名、性别和科目,我们需要分析不同性别和不同科目的学生平均分数。 功能要求: 从数据源中获取学生的成绩数据,包括学生姓名、性别和科目。使用Spark进行数据处理,将学生数据按性别和科目分组。计…...
Java如何发起http的get请求的实现
加哥最近做第三方接口开发,对方提供的是get方式的http请求,下面加哥给大家进行了总结如何用java代码去发送http请求并获取结果。 下面是发送get请求的工具类 1.不要求携带token的方式 public static String getUrl(String tempurl,String bm) {String…...
webRtc 示例
1、使用socket.io进行会话 2、为了方便,参数写死在前端了,前端界面1代码如下(由界面1发起视频): <!DOCTYPE html> <html><head><title>Socket.IO chat</title><meta charset"…...

【RabbitMQ】服务启动成功,无法访问localhost:15672(RabbitMQ Management)
问题描述 RabbitMQ 服务已经启动成功,已经安装rabbitmq_management插件,无法访问RabbitMQ Management(http://localhost:15672/)。 原因分析 15672端口被Microsoft Edge占用。 解决方案 打开cmd终端,输入指令&#…...

【操作记录】pytorch_geometric安装方法
pytorch_geometric安装方法 github地址 主要不要直接pip install安装,会由于依赖无法安装而失败 点击here手动安装依赖 选择对应的pytorch版本,我的是Win10 Python3.8.3Pytorch1.8.1CUDA10.2 手动下载四个依赖包本地安装: 主要不要直接&am…...
EventSystem 事件系统
EventSystem 事件系统 事件系统在开发中必不可少事件系统使用观察者模式可以极大程度降低程序的耦合,之前的文章也讲过事件系统但是不够高效简洁,如何轻便高效优雅的实现一个事件呢?依然基于之前的AssemblyManager 程序集管理器和SingletonS…...

2.2 Vector<T> 动态数组(模板语法)
C数据结构与算法 目录 本文前驱课程 1 C自学精简教程 目录(必读) 2 动态数组 Vector(难度1) 其中,2 是 1 中的一个作业。2 中详细讲解了动态数组实现的基本原理。 本文目标 1 学会写基本的C类模板语法; 2 为以后熟练使用 S…...

【kafka】Golang实现分布式Masscan任务调度系统
要求: 输出两个程序,一个命令行程序(命令行参数用flag)和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽,然后将消息推送到kafka里面。 服务端程序: 从kafka消费者接收…...

【Oracle APEX开发小技巧12】
有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...
解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错
出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...
C++八股 —— 单例模式
文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全(Thread Safety) 线程安全是指在多线程环境下,某个函数、类或代码片段能够被多个线程同时调用时,仍能保证数据的一致性和逻辑的正确性…...

AI,如何重构理解、匹配与决策?
AI 时代,我们如何理解消费? 作者|王彬 封面|Unplash 人们通过信息理解世界。 曾几何时,PC 与移动互联网重塑了人们的购物路径:信息变得唾手可得,商品决策变得高度依赖内容。 但 AI 时代的来…...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)
在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马(服务器方面的)的原理,连接,以及各种木马及连接工具的分享 文件木马:https://w…...
在Ubuntu24上采用Wine打开SourceInsight
1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...

基于SpringBoot在线拍卖系统的设计和实现
摘 要 随着社会的发展,社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统,主要的模块包括管理员;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...

深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用
文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么?1.1.2 感知机的工作原理 1.2 感知机的简单应用:基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...