嵌入式Linux--自旋鎖實驗

自旋鎖實驗核心:

一、實驗核心目標
用自旋鎖替代原子變量,實現(xiàn)同一時間僅允許一個應(yīng)用程序訪問LED設(shè)備的互斥機制,核心是通過狀態(tài)變量配合自旋鎖完成資源保護。

二、核心設(shè)計邏輯

自旋鎖的關(guān)鍵是短臨界區(qū)原則,不能直接用它保護整個open和release函數(shù)(會導(dǎo)致臨界區(qū)過長),因此實驗做了巧妙設(shè)計:

引入狀態(tài)變量dev_stats
dev_stats為0時,代表設(shè)備空閑;大于0時,代表設(shè)備已被占用。

真正實現(xiàn)設(shè)備互斥訪問的是這個狀態(tài)變量,自旋鎖僅用于保護對它的修改操作。

自旋鎖只守護dev_stats

在open函數(shù)里,先通過自旋鎖加鎖,讀取dev_stats判斷設(shè)備是否可用;如果不可用則解鎖返回占用失敗,可用則將dev_stats加1后解鎖,標記設(shè)備被占用。

在release函數(shù)里,同樣加鎖后將dev_stats減1,解鎖后標記設(shè)備已釋放,整個過程自旋鎖僅守護對dev_stats的加減操作,保證操作的原子性。

選對自旋鎖API實驗用spin_lock_irqsave()和spin_unlock_irqrestore()替代基礎(chǔ)的自旋鎖函數(shù),因為這組API不僅加鎖,還會臨時關(guān)閉本地CPU中斷,避免中斷上下文和進程上下文同時訪問變量,從根本上保障驅(qū)動的兼容性,防止死鎖。

三、代碼關(guān)鍵細節(jié)與修正

代碼存在的問題
拼寫和語法錯誤:部分代碼中存在函數(shù)名拼寫錯誤,比如spin_unlock_irgrestore()應(yīng)為spin_unlock_irqrestore(),還有使用了中文全角分號,這些細節(jié)會導(dǎo)致編譯失敗,需要修正。

初始化遺漏:驅(qū)動入口函數(shù)里最好顯式把dev_stats初始化為0,雖然全局變量默認為0,但顯式初始化能讓代碼更嚴謹,避免隱藏風(fēng)險。

狀態(tài)保護邏輯:release函數(shù)中對dev_stats做減1操作時,先判斷其大于0才執(zhí)行,已經(jīng)做了邊界檢查,避免狀態(tài)變量變成負數(shù),邏輯是合理的。

關(guān)鍵操作流程
驅(qū)動初始化時,要完成自旋鎖初始化,同時顯式把dev_stats置為0。

open函數(shù)先申請自旋鎖,判斷設(shè)備狀態(tài),決定是否能使用,操作完立即釋放鎖。

release函數(shù)同樣加鎖后修改設(shè)備狀態(tài),釋放設(shè)備資源,確保后續(xù)進程能申請到設(shè)備。

四、為什么選帶中斷保存的自旋鎖

實驗不使用基礎(chǔ)的自旋鎖函數(shù),而是選擇帶中斷保存功能的API,核心原因是考慮驅(qū)動的通用性。這組API會自動保存當前中斷狀態(tài),加鎖時禁用本地中斷,解鎖時恢復(fù)中斷,能避免中斷上下文和進程上下文同時操作臨界資源,防止競態(tài)條件和死鎖,是驅(qū)動開發(fā)的標準做法。

五、原子變量和自旋鎖的適用差異

兩種方式各有適用場景,本實驗雖用原子變量更合適(僅保護計數(shù)器,更簡潔高效),但核心目的是教學(xué)自旋鎖:

原子變量:適合保護簡單的整數(shù)操作,無需額外加鎖開銷,代碼簡潔高效,適合狀態(tài)標記、簡單計數(shù)場景。

自旋鎖:能保護包含多個操作的復(fù)雜臨界區(qū),但必須保證臨界區(qū)足夠短,因為忙等待機制會占用CPU,不能在臨界區(qū)中睡眠。

六、測試驗證要點

測試時先讓第一個應(yīng)用程序后臺占用LED設(shè)備25秒,再立即啟動第二個程序嘗試操作,正常結(jié)果是第二個程序會提示打開失敗,必須等待第一個程序運行結(jié)束、釋放設(shè)備后,才能再次操作。卸載驅(qū)動時只需執(zhí)行對應(yīng)的rmmod命令即可。

七、實驗總結(jié)
整個實驗的核心思路是通過自旋鎖保護狀態(tài)變量,用狀態(tài)變量實現(xiàn)互斥,既遵循了自旋鎖短臨界區(qū)的原則,又保障了設(shè)備的互斥訪問。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 一、自旋鎖:解決復(fù)雜臨界區(qū)的輕量級方案 原子操作僅能保護整型或位變量,但實際開發(fā)中,像設(shè)備結(jié)構(gòu)體這類復(fù)雜數(shù)據(jù),需要...
    水曉樸閱讀 26評論 0 1
  • 姓名:鄭煜爍 學(xué)號:19029100010 學(xué)院:電子工程學(xué)院 轉(zhuǎn)自:https://blog.csdn.net/...
    鄭煜爍閱讀 359評論 0 0
  • Linux并發(fā)與競爭實驗,原子操作實現(xiàn) LED 互斥訪問的核心邏輯,并給出完整、規(guī)范、可直接用于開發(fā)的代碼模板,同...
    水曉樸閱讀 33評論 0 1
  • 請問uboot啟動過程都做了些什么? 1、cpu剛開始初始化的時候,還未設(shè)置棧,所以先使用匯編代碼,構(gòu)建異常項鏈表...
    hades2013閱讀 2,203評論 0 4
  • 互斥體是什么? 互斥體是Linux內(nèi)核專門設(shè)計的同步機制,用于實現(xiàn)“一次僅一個線程訪問共享資源”的互斥控制。相比通...
    水曉樸閱讀 23評論 0 1

友情鏈接更多精彩內(nèi)容