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.pswp.cn/bicheng/76001.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/76001.shtml
英文地址,請注明出處:http://en.pswp.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;因此我們經常會碰到需要對圖片進行壓縮的需求。如何…