基于PXA310平臺的溫濕度傳感器設(shè)計
本文引用地址:http://www.ex-cimer.com/article/201612/324471.htm
▲圖2 驅(qū)動程序流程圖
上述函數(shù)中start_trans; write_byte; read_data; read_byte 分別利用PXA310 引腳模擬時序完成啟動傳輸、寫字節(jié),讀一位數(shù)據(jù)和讀字節(jié)的操作。
內(nèi)核tasklet_schedule() 調(diào)度執(zhí)行指定的tasklet,在獲得運行機會之前只會調(diào)度一次,如果在運行時被調(diào)度, 則完成后會被再次運行。
wait_for_completion()這個函數(shù)進(jìn)行一個不可打斷的等待,如果有代碼調(diào)用它,并且沒有完成這個任務(wù),結(jié)果會是一個不可殺死的進(jìn)程。copy_to_user()將內(nèi)核空間數(shù)據(jù)傳向上層用戶空間,并讓上層測試程序做進(jìn)一步處理。
3.3 Linux 溫濕度傳感器設(shè)備阻塞操作
由于溫濕度傳感器測量需要一定時間,為提高系統(tǒng)運行效率和實時性,在驅(qū)動程序中阻塞線程,交出內(nèi)核控制權(quán),等待操作完成后喚醒線程,提高系統(tǒng)利用率。complete()在函數(shù)中就是喚醒一個等待的讀取線程。任務(wù)隊列實現(xiàn)函數(shù)如下所示。
Tasklet可以使測量操作在系統(tǒng)負(fù)荷不重時被調(diào)用,或是被立即執(zhí)行,但始終不會晚于下一個CPU clock.
Tasklet 始終在中斷期間運行,并且在調(diào)度他的同一CPU 上運行。對比單片機系統(tǒng),在單線程情況下,一般在sht10_read()中調(diào)用2 次measure_ sht10()來等待測量完成,測量效率依賴2 次測量消耗的時間;但在Linux 驅(qū)動程序中,使用Tasklet 方式操作,2 次測量過程不會對其他線程產(chǎn)生影響,在有其他實時事件需要及時處理時(如網(wǎng)絡(luò),視頻),可以更有效提高驅(qū)動運行效率,降低對其他實時處理產(chǎn)生的影響。
4 溫濕度傳感器測試與驗證
驅(qū)動程序完成以后,需要相應(yīng)測試程序驗證驅(qū)動程序編寫的正確性。由于驅(qū)動程序中不能對數(shù)據(jù)進(jìn)行浮點數(shù)運算,所以測試程序必須將驅(qū)動程序傳遞來的數(shù)據(jù)進(jìn)行浮點數(shù)運算才能得到相應(yīng)的溫濕度值。
評論