【操作系統】共享數據的競爭問題

共享數據的競爭問題

  • 問題:保護中斷與主程序共享的avg_data
    • 方法一:使用關中斷保護
      • 1. 添加關中斷宏
      • 2. 修改數據讀取代碼
      • 3. 修改中斷服務程序(ISR)
    • 方法二:使用原子操作(需平臺支持)
      • 1. 定義原子類型
      • 2. 修改數據訪問代碼
    • 方法三:使用RTOS同步機制(如信號量)
      • 1. 擴展通道結構體
      • 2. 初始化信號量
      • 3. 保護數據訪問
  • 方案對比與選型建議
  • 關鍵驗證點

問題:保護中斷與主程序共享的avg_data

在嵌入式系統中,中斷服務程序(ISR)和主程序(或任務)共享數據時,必須確保訪問的原子性可見性。以下是針對該問題的具體修改步驟:

方法一:使用關中斷保護

此方法通過臨時禁用中斷來確保對共享變量的原子訪問,適用于所有平臺。

1. 添加關中斷宏

在頭文件中定義關中斷宏:

2. 修改數據讀取代碼

hal_get_data 函數中保護 avg_data 的讀取:

int hal_get_data() {ENTER_CRITICAL();   // 進入臨界區(關中斷)*val = avg_data;   // 安全讀取共享數據EXIT_CRITICAL();    // 退出臨界區(開中斷)return 0;
}

3. 修改中斷服務程序(ISR)

module_isr 中保護 avg_data 的寫入:

irqreturn_t module_isr() {ENTER_CRITICAL();avg_data = 8888;// 安全更新 avg_dataEXIT_CRITICAL();sem_give(complete);}// ...
}

注意這個做法是有風險的,在中斷處理函數中關中斷需謹慎,可能破壞中斷上下文的狀態或影響實時性詳細分析見博客

方法二:使用原子操作(需平臺支持)

如果目標平臺支持對 u16 類型的原子訪問(如ARM Cortex-M),可使用原子操作。

1. 定義原子類型

在結構體中聲明 avg_data 為原子變量:

#include <stdatomic.h>struct siliumixi {// ..._Atomic u16 avg_data; // C11原子類型// ...
};

2. 修改數據訪問代碼

  • ISR中原子寫入

    atomic_store(&chan->avg_data, calculated_value);
    
  • 主程序原子讀取

        *val = atomic_load(&chan->avg_data); // 原子讀取
    

方法三:使用RTOS同步機制(如信號量)

在RTOS環境中,可通過信號量確保數據訪問的同步。

1. 擴展通道結構體

struct siliumixi {// ...sem_t data_sem; // 新增信號量// ...
};

2. 初始化信號量

在初始化時創建信號量:

    chan->data_sem = sem_create(1); // 初始值為1(二進制信號量)
}

3. 保護數據訪問

  • ISR中釋放信號量

    sem_take(chan->data_sem, 0);    // 獲取信號量(非阻塞)chan->avg_data = 8888;      // 更新數據aicos_sem_give(chan->data_sem);       // 釋放信號量}// ...
    }
    
  • 主程序獲取信號量

        if (sem_take(chan->data_sem, timeout) != 0)return -ETIMEDOUT;*val = chan->avg_data;}
    

方案對比與選型建議

方案優點缺點適用場景
關中斷簡單高效,無額外資源消耗影響中斷響應實時性低延遲、單核嵌入式系統
原子操作代碼簡潔,無鎖競爭依賴平臺原子操作支持支持C11原子類型的平臺
RTOS信號量兼容多任務環境,靈活增加RTOS開銷,需處理信號量超時基于RTOS的多任務系統

關鍵驗證點

  1. 原子性測試:在高低優先級任務/中斷同時訪問時,數據是否一致。
  2. 性能測試:關中斷時長是否影響其他中斷響應(使用示波器測量最壞關中斷時間)。
  3. 資源占用:信號量或原子操作是否增加內存/CPU開銷。

通過上述任一方法,可有效解決共享數據 chan->avg_data 的競爭問題

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/898570.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/898570.shtml
英文地址,請注明出處:http://en.pswp.cn/news/898570.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

VS010生成可由MATLAB2016調用的DLL文件方法

親測實用&#xff0c;不用配置雜七雜八的依賴項 1&#xff1a;新建Win32的DLL輸出項目 2&#xff1a;修改為release模式 3&#xff1a;添加calc.cpp文件&#xff0c;即要導出的函數myadd&#xff1a; #include "calc.h" __declspec(dllexport) int myadd(int a,in…

機器學習Pandas_learn4

import pandas as pddef calculate_goods_covariance():# 定義商品銷售數據字典goods_sales_data {"時期": ["一期", "二期", "三期", "四期"],"蘋果": [15, 16, 3, 2],"橘子": [12, 14, 16, 18],&quo…

優選算法系列(3.二分查找 )

目錄 一.二分查找&#xff08;easy&#xff09; 題目鏈接&#xff1a;704. 二分查找 - 力扣&#xff08;LeetCode&#xff09; 解法&#xff1a; 代碼&#xff1a; 二.在排序數組中查找元素的第?個和最后?個位置&#xff08;medium&#xff09; 題目鏈接&#xff1a;34.…

DAY36貪心算法Ⅴ

56. 合并區間 - 力扣&#xff08;LeetCode&#xff09; class Solution { static bool cmp(vector<int>&a,vector<int>&b){return a[0] < b[0]; } public:vector<vector<int>> merge(vector<vector<int>>& intervals) {so…

阿里云服務器部署 五 Nginx + springboot

Nginx的部分配置 1. 基礎容災配置&#xff08;被動健康檢查&#xff09; 在 upstream 塊中&#xff0c;通過 max_fails 和 fail_timeout 參數定義故障轉移規則&#xff1a; 在 upstream 塊中&#xff0c;通過 max_fails 和 fail_timeout 參數定義故障轉移規則&#xff1a;…

基于大模型的下頜前突畸形預測及治療方案研究報告

目錄 一、引言 1.1 研究背景 1.2 研究目的 1.3 研究意義 二、大模型技術原理與應用現狀 2.1 大模型的基本原理 2.2 在醫療領域的應用案例 2.3 在下頜前突畸形研究中的可行性分析 三、下頜前突畸形概述 3.1 定義與分類 3.2 流行病學特征 3.3 病因與發病機制 3.4 對…

接口自動化測試框架詳解

&#x1f345; 點擊文末小卡片&#xff0c;免費獲取軟件測試全套資料&#xff0c;資料在手&#xff0c;漲薪更快 接口自動化測試是指通過編寫程序來模擬用戶的行為&#xff0c;對接口進行自動化測試。Python是一種流行的編程語言&#xff0c;它在接口自動化測試中得到了廣泛…

Day11 動態規劃入門

動態規劃 就是 : 給定一個問題&#xff0c;我們把它拆成一個個子問題&#xff0c;直到子問題可以直接解決。然后把子問題的答案保存起來&#xff0c;以減少重復計算。再根據子問題答案反推&#xff0c;得出原問題解的一種方法. 記憶化搜索 暴力dfs 記錄答案 動態規劃入門思…

[AI速讀]用持續集成(CI)優化芯片驗證環境:Jenkins與EDA工具的實戰指南

在芯片驗證中,回歸測試(Regression Test)是確保設計穩定性的關鍵步驟。但隨著設計復雜度增加,手動管理海量測試用例、分析日志和覆蓋率數據變得異常耗時。本文將介紹如何利用持續集成(CI)工具Jenkins,結合EDA驗證環境(如Cadence vManager),實現自動化測試與結果分析,…

深度解析:JavaScript變量聲明的演變與核心差異(var/let/隱式聲明)

深度解析&#xff1a;JavaScript變量聲明的演變與核心差異&#xff08;var/let/隱式聲明&#xff09; 一、JavaScript變量聲明的演進史 JavaScript的變量聲明機制經歷了三個階段演進&#xff1a; 原始階段&#xff08;ES5及之前&#xff09;&#xff1a;僅 var 聲明 隱式全局…

第2.1節:AWK腳本結構

1 第2.1節&#xff1a;AWK腳本結構 1.1 第1個awk腳本 假設有如下的數據待處理&#xff0c;需要將第2列提取出來&#xff1a; #, 名稱, 大小, 類型, 修改, 屬性 1, COMMIT_EDITMSG, 331 bytes, 文件, 24/09/16 08:42:19, -a----- 2, config, …

Win NAS 分享功能:精準、安全的內容共享

WinNAS 不僅是一款強大的 NAS服務&#xff0c;還通過耘想存儲 APP 提供了便捷的內容分享功能。無論是與個人、群聊、朋友圈還是公眾分享文件&#xff0c;WinNAS 都配備了嚴格的權限管理機制&#xff0c;確保您的數據安全且精準地傳遞給目標對象。以下是 WinNAS 分享功能的詳細介…

C# 項目06-計算程序運行時間

實現需求 記錄程序運行時間&#xff0c;當程序退出后&#xff0c;保存程序運行時間&#xff0c;等下次程序再次啟動時&#xff0c;繼續記錄運行時間 運行環境 Visual Studio 2022 知識點 TimeSpan 表示時間間隔。兩個日期之間的差異的 TimeSpan 對象 TimeSpan P_TimeSpa…

網絡華為HCIA+HCIP NFV

目錄 NFV關鍵技術&#xff1a;虛擬化 NFV關鍵技術&#xff1a;云化 NFV架構 NFV標準架構 ?編輯 NFV架構功能模塊 NFV架構接口 NFV關鍵技術&#xff1a;虛擬化 在NFV的道路上&#xff0c;虛擬化是基礎&#xff0c;云化是關鍵。傳統電信網絡中&#xff0c;各個網元都是…

SpringBoot實現異步調用的方法

在Java中使用Spring Boot實現異步請求和異步調用是一個常見的需求&#xff0c;可以提高應用程序的性能和響應能力。以下是實現這兩種異步操作的基本方法&#xff1a; 一、異步請求&#xff08;Asynchronous Request&#xff09; 異步請求允許客戶端發送請求后立即返回&#x…

xwiki自定義認證實現單點登錄

xwiki支持自定義認證 繼承XWikiAuthServiceImpl類后將類配置到WEB-INFO下xwiki.cfg的xwiki.authentication.authclass屬性上開啟自定義認證。 官方文檔&#xff1a;https://www.xwiki.org/xwiki/bin/view/Documentation/AdminGuide/Authentication/ 官方自定義認證的示例&#…

使用vite新建vue3項目 以及elementui的使用 vite組件問題

項目創建 在創建項目之前我們應該在終端中輸入 node -v 和 npm -v 只有它們都能正常查看版本號才說明我們之前是已經安裝完成的。 接下來我們在合適的目錄下輸入npm create vitelatest 它會要求你輸入項目的名稱&#xff0c;這個名稱和我們之前通過cil創建的命名規則一樣。…

音頻錄制小妙招-自制工具-借助瀏覽器錄一段單聲道16000采樣率wav格式音頻

先看效果 1、打開頁面 2、點擊開始錄音&#xff0c;彈出權限提示&#xff0c;點擊“僅這次訪問時允許” 3、錄完后&#xff0c;點擊停止 4、文件自動下載到默認目錄 上代碼 js 部分 document.addEventListener(DOMContentLoaded, () > {const startBtn document.getEleme…

Mysql-經典實戰案例(10):如何用PT-Archiver完成大表的自動歸檔

真實痛點&#xff1a;電商訂單表存儲優化場景 現狀分析 某電商平臺訂單表&#xff08;order_info&#xff09;每月新增500萬條記錄 主庫&#xff1a;高頻讀寫&#xff0c;SSD存儲&#xff08;空間告急&#xff09;歷史庫&#xff1a;HDD存儲&#xff0c;只讀查詢 優化目標 …

CUDA編程面試高頻30題

1. 什么是CUDA&#xff1f;它與GPU的關系是什么&#xff1f; 答: CUDA&#xff08;Compute Unified Device Architecture&#xff09;是由NVIDIA開發的一種并行計算平臺和應用程序接口模型。它允許開發者利用NVIDIA GPU進行通用計算任務&#xff0c;而不僅僅是圖形渲染。CUDA提…