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





