FreeRTOS中互斥量实现数据共享优化

在 FreeRTOS 中,当读操作远多于写操作时,使用**互斥量(Mutex)会导致读任务频繁阻塞,降低系统性能。此时,可以通过实现读者-写者锁(Reader-Writer Lock)**优化,允许多个读任务并发访问共享数据,而写任务独占访问。以下是具体分析和实现方案:

方案分析与选择

为什么需要读者-写者锁?
  • 读多写少场景:允许多个读任务同时访问,提升吞吐量。

  • 写操作原子性:写任务需独占资源,避免数据不一致。

  • 避免优先级反转:通过 FreeRTOS 的任务通知机制优化唤醒逻辑。

    实现原理
  • 二元信号量(readersSem:控制新读任务的进入,写任务执行时阻塞新读任务。

  • 互斥量(rwMutex:保护共享的读者计数(readerCount)。

  • 任务通知(Task Notification):唤醒等待的写任务,避免忙等待。

    代码实现

    全局变量与初始化
  • #include "FreeRTOS.h"
    #include "task.h"
    #include "semphr.h"int sharedData = 0;                // 共享数据
    SemaphoreHandle_t readersSem;      // 控制新读任务的进入
    SemaphoreHandle_t rwMutex;         // 保护读者计数
    int readerCount = 0;               // 当前活跃的读者数量
    TaskHandle_t writerTaskHandle = NULL; // 等待中的写任务句柄void init() {readersSem = xSemaphoreCreateBinary();xSemaphoreGive(readersSem);     // 初始化为可用rwMutex = xSemaphoreCreateMutex();
    }
    读任务实现
  • void readTask(void *pvParameters) {while (1) {// 1. 允许其他读任务进入,但阻止新读任务在写任务等待时进入xSemaphoreTake(readersSem, portMAX_DELAY);xSemaphoreGive(readersSem);// 2. 增加读者计数xSemaphoreTake(rwMutex, portMAX_DELAY);readerCount++;xSemaphoreGive(rwMutex);// 3. 执行读操作(无需加锁)int localData = sharedData;// 4. 减少读者计数,唤醒等待的写任务xSemaphoreTake(rwMutex, portMAX_DELAY);readerCount--;if (readerCount == 0 && writerTaskHandle != NULL) {xTaskNotifyGive(writerTaskHandle); // 通知写任务继续}xSemaphoreGive(rwMutex);vTaskDelay(pdMS_TO_TICKS(100)); // 模拟其他操作}
    }
    写任务实现
  • void writeTask(void *pvParameters) {while (1) {// 1. 获取 readersSem,阻止新读任务进入xSemaphoreTake(readersSem, portMAX_DELAY);// 2. 检查是否有活跃读者,若无则直接写;若有则等待xSemaphoreTake(rwMutex, portMAX_DELAY);if (readerCount > 0) {writerTaskHandle = xTaskGetCurrentTaskHandle();xSemaphoreGive(rwMutex);ulTaskNotifyTake(pdTRUE, portMAX_DELAY); // 挂起等待读者退出xSemaphoreTake(rwMutex, portMAX_DELAY);}// 3. 执行写操作(此时无活跃读者)sharedData++;// 4. 清理状态并释放信号量writerTaskHandle = NULL;xSemaphoreGive(rwMutex);xSemaphoreGive(readersSem); // 允许新读任务进入vTaskDelay(pdMS_TO_TICKS(1000)); // 模拟其他操作}
    }

    关键机制说明

  • 读任务并发

    • 新读任务通过readersSem快速进入,仅短暂阻塞。

    • 已进入的读任务通过readerCount统计,不影响彼此。

  • 写任务独占

    • 写任务通过readersSem阻止新读任务进入。

    • 通过ulTaskNotifyTake挂起等待,直到最后一个读任务退出并发送通知。

  • 优先级继承优化

    • FreeRTOS 的互斥量(rwMutex)自动启用优先级继承,避免低优先级任务阻塞高优先级任务。

    • 注意事项

    • 写任务饥饿

      • 如果读任务持续不断,写任务可能长期等待。需在设计中平衡读写优先级。

    • 多写任务场景

      • 当前实现假设单写任务。如需支持多写任务,需引入队列管理等待的写任务。

    • 错误处理

      • 检查信号量创建是否成功(如xSemaphoreCreateMutex返回非NULL)。

      • 使用超时机制(如portMAX_DELAY)避免死锁。

    • 性能测试

      • 在高负载场景下验证读写吞吐量,确保设计符合预期。


    • 总结

      通过读者-写者锁的实现,读任务可以高效并发,而写任务保证数据一致性。此方案在 FreeRTOS 中充分利用任务通知和互斥量,兼顾性能与可靠性,适用于读多写少的场景。

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

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

相关文章

国内虚拟电厂(VPP)管控平台供应商

以下是几家专注于虚拟电厂业务的供应商及其官网地址: 1. 华茂能联科技有限公司 官网地址:https://huamod.com/简介:华茂能联是分布式资源管理与虚拟电厂产品与服务提供商,团队汇聚了来自美国、欧洲和国内多个行业知名研究机构或…

协方差相关问题

为什么无偏估计用 ( n − 1 ) (n-1) (n−1) 而不是 n n n,区别是什么? 在统计学中,无偏估计是指估计量的期望值等于总体参数的真实值。当我们用样本数据估计总体方差或协方差时,分母使用 ( n − 1 ) (n-1) (n−1) 而不是 n n…

算法设计学习6

实验目的及要求: 目标是使学生学会分析数据对象的特点,掌握数据组织的方法和在计算机中的存储方式,能够对具体问题中所涉及的数据选择合适的逻辑结构、存储结构,进而在此基础上,对各种具体操作设计高效的算法&#xff…

Java 三大特性—多态

目录 1、多态的概念2、多态的条件3、向上转型3.1 概念3.2 使用场景 4、向下转型5、多态的优缺点 1、多态的概念 多态,通俗来讲就是多种形态,即对于同样的行为,不同的对象去完成会产生不同的状态。比如动物都会吃东西,小狗和小猫都…

Ubuntu 24.04 LTS系统安装RTX 4090显卡驱动和cuda并部署ollama下载DeepSeek模型【自用详细版】

自己捣鼓玩玩哈,正好有机子 1. 安装驱动前的系统配置工作 卸载原有驱动并禁用nouveau sudo apt remove --purge nvidia*sudo cp /etc/modprobe.d/blacklist.conf /etc/modprobe.d/blacklist.conf.backup //备份文件sudo vim /etc/modprobe.d/blacklist.conf //修…

【一篇搞定配置】一篇带你从配置到使用(PyCharm远程)完成服务器运行项目(配置、使用一条龙)【全网最详细版】

🌈 个人主页:十二月的猫-CSDN博客 🔥 系列专栏: 🏀各种软件安装与配置_十二月的猫的博客-CSDN博客 💪🏻 十二月的寒冬阻挡不了春天的脚步,十二点的黑夜遮蔽不住黎明的曙光 目录 1.…

Mamba模型

为什么要提出mamba模型? transformer特点:训练快,推理慢,计算成本O(n*n) Rnn的特点:训练慢,推理快,容易遗忘 其实很容易理解,因为RNN的输入只包含前一个隐…

如何在 Windows 11 上查找计算机的 IP 地址?

原文:如何在 Windows 11 上查找计算机的 IP 地址? | w3cschool笔记 在开始之前,我们先来了解一下什么是 IP 地址: 假设你住在一栋公寓楼里,快递员需要把包裹送到你家。为了确保快递能准确送到,你需要提供…

2.Spring-注解开发定义bean/纯注解开发/Spring整合MyBatis(p21-p30)

(一)注解开发定义bean (二)纯注解开发 (三)bean的作用范围 (三)xml配置和注解配置 (四)Spring整合MyBatis 要在pom.xml定义一下坐标。org.spr…

解决:Fontconfig head is null, check your fonts or fonts configurat

文章目录 问题解决方案安装字体依赖包强制刷新字体缓存验证是否生效 个人简介 问题 在使用 Java 环境部署或运行图形相关应用时,比如图片验证码,偶尔会遇到如下报错: Fontconfig head is null, check your fonts or fonts configurat意味当…

『不废话』之Llama 4实测小报

2025年4月5日Llama 4一开源,随后OpenRouter等平台就提供免费调用。对于中文社区来,官方的测评结果其实意义不大(原因先按下不表),就看知乎、微博、B站、twitter上的真实感受,最重要的是自己的真实案例测评。…

【NLP 56、实践 ⑬ LoRA完成NER任务】

目录 一、数据文件 二、模型配置文件 config.py 三、数据加载文件 loader.py 1.导入文件和类的定义 2.初始化 3.数据加载方法 代码运行流程 4.文本编码 / 解码方法    ① encode_sentence(): ② decode(): 代码运行流程 ③ padding(): 代码…

八大排序——c++版

本次排序都是按照升序排的 冒泡排序 void bubbleSort(vector<int>& nums) {int nnums.size();for(int i0;i<n-1;i){bool swappedfalse;for(int j0;j<n-1-i;j){if(nums[j]>nums[j1]){swap(nums[j],nums[j1]);swappedtrue;}}if(!swapped)break;} } //算法原…

mlir-tblgen 的应用渐进式示例

示例01 -gen-dialect-decls toy_dia.1.toy include "mlir/IR/OpBase.td" //include "mlir/IR/FunctionInterfaces.td" //include "mlir/IR/SymbolInterfaces.td" //include "mlir/Interfaces/SideEffectInterfaces.td"def Toy_Diale…

Go语言从零构建SQL数据库(5)-Pratt解析算法:SQL表达式解析的核心引擎

Pratt解析算法&#xff1a;SQL表达式解析的核心引擎 1. 算法概述与工作原理 Pratt解析算法&#xff08;自顶向下运算符优先级解析&#xff09;是一种优雅的表达式解析方法&#xff0c;特别适合处理具有不同优先级运算符的复杂表达式。在我们的SQL解析器中&#xff0c;它负责解…

spring-ai-openai调用Xinference1.4.1报错

1、Xinference 报错logs 此处是调用 /v1/chat/completions 接口 2025-04-06 15:48:51 xinference | return await dependant.call(**values) 2025-04-06 15:48:51 xinference | File "/usr/local/lib/python3.10/dist-packages/xinference/api/restful_api.py", …

刻意练习:如何从新手到大师

1. 练习方式 练习主要有两类&#xff1a;天真的练习和刻意练习。 所谓“天真的练习”&#xff0c;基本上只是反复地做某些事情&#xff0c;并指望只靠那种反复&#xff0c;就能提高表现和水平。一旦某个人的表现达到了“可接受”的水平&#xff0c;并且可以做到自动化&#x…

基于Java的人脸识别在线考试系统(jsp+springboot+mysql8.x)

基于Java的人脸识别在线考试系统(jspspringbootmysql8.x) 在线考试系统提供全面的考试管理和用户管理功能。登录界面支持管理员、教师和学生三种身份验证&#xff0c;确保不同用户访问相应的功能模块。系统自动组卷功能允许管理员根据不同科目和题型&#xff0c;如单选题、多选…

预测分析(二):基于机器学习的数值预测

文章目录 基于机器学习的数值预测机器学习简介监督学习的任务创建第一个机器学习模型机器学习的目标——泛化过拟合现象评价函数与最优化 建模前的数据处理进一步特征变换 多元线性回归模型LASSO回归kNN算法原理算法步骤k值的选择 基于机器学习的数值预测 机器学习是人工智能的…

批量压缩 jpg/png 等格式照片|批量调整图片的宽高尺寸

图片格式种类非常的多&#xff0c;并且不同的图片由于像素、尺寸不一样&#xff0c;可能占用的空间也会不一样。文件太大会占用较多的磁盘空间&#xff0c;传输及上传系统都非常不方便&#xff0c;可能会收到限制&#xff0c;因此我们经常会碰到需要对图片进行压缩的需求。如何…