如何通過互斥鎖來安全地保護共享的 ADC 數(shù)據(jù),同時多個任務(wù)能夠?qū)崟r讀取、打印并控制 LED
該項目展示了在基于 FreeRTOS 的系統(tǒng)(運行于 Arduino Uno 上)中實現(xiàn)安全的數(shù)據(jù)共享訪問的實現(xiàn)方式。
多個任務(wù)同時讀取、顯示并處理一個 ADC 值,通過互斥鎖確保數(shù)據(jù)的一致性,并防止出現(xiàn)競爭條件。
一個電位器模擬傳感器的輸入信號,而發(fā)光二極管則能清晰地顯示系統(tǒng)狀態(tài)。
項目概述
在多任務(wù)嵌入式系統(tǒng)中,若不進行數(shù)據(jù)保護就隨意共享數(shù)據(jù),可能會導(dǎo)致數(shù)據(jù)出現(xiàn)損壞或不一致的情況。
該項目使用 FreeRTOS 互斥鎖來保護由三個獨立任務(wù)共同訪問的共享 ADC 變量。
啟用 Core FreeRTOS 支持的方式為:
硬件設(shè)置
這個電位器能夠生成從 0 到 1023 的模擬數(shù)值,以此來模擬真實的傳感器信號。
系統(tǒng)架構(gòu)
共享資源
?“adcValue”值由所有任務(wù)均可訪問。
?該互斥鎖確保在讀寫操作期間實現(xiàn)獨占訪問。
關(guān)鍵見解:
即使是一個單一的整數(shù),在被多個搶占式任務(wù)訪問時也必須得到保護。
任務(wù)職責
ADC 讀數(shù)任務(wù)
每 50 毫秒讀取一次模擬輸入,并更新共享值
ADC 打印任務(wù)
安全地讀取 ADC 值,并將其打印到串行監(jiān)視器中。
LED 控制任務(wù)
在互斥保護下復(fù)制共享的 ADC 值,并根據(jù)閾值控制 LED 的狀態(tài)。
LED 邏輯映射
這種映射能夠即時提供傳感器狀態(tài)的直觀反饋。
互斥鎖設(shè)計
?類型:FreeRTOS 互斥鎖(二進制模式,優(yōu)先級繼承功能已啟用)
?受保護資源:adcValue
?目的:防止并發(fā)訪問和數(shù)據(jù)競爭
為何選用互斥鎖(而非信號量)?
互斥鎖支持優(yōu)先級繼承功能,能夠避免實時系統(tǒng)中的優(yōu)先級倒置現(xiàn)象。
時間安排與日程規(guī)劃
預(yù)期的序列輸出
關(guān)鍵學(xué)習(xí)要點
?互斥鎖如何防止競爭條件
?任務(wù)間傳感器數(shù)據(jù)的安全共享
?協(xié)調(diào)具有不同優(yōu)先級的多項任務(wù)
?由模擬輸入驅(qū)動的實時 LED 控制
學(xué)習(xí)成果
該項目提供了一個清晰且實用的案例,說明了在實時嵌入式系統(tǒng)中互斥鎖為何至關(guān)重要,以及在任務(wù)共享數(shù)據(jù)的情況下如何正確使用它們。
它與在基于專業(yè)實時操作系統(tǒng)的設(shè)計中所使用的實際傳感器處理流程極為相似。
本文編譯自hackster.io





