劉新
【摘要】 在LINUX中,設備驅動程序與磁盤文件相同,都是經過打開、讀寫數據、關閉等一系列過程,當硬件有數據時直接讀取,無數據時等待,驅動程序不斷查詢。在LINUX中有信號量機制,本文討論信號量在驅動程序中的應用。
【關鍵詞】 嵌入式LINUX 信號量 驅動程序 I2C
一、引言
筆者在開發嵌入式LINUX系統I2C驅動,通過實驗將信號機制運用到驅動程序中,實現了硬件中斷請求的消息傳遞,從而提高軟件運行效率。
二、異步通知技術
筆者查閱書籍,發現LINUX可以使用信號來處理事件,在設備驅動中也有異步通知SIGIO信號,當新數據到達時發送SIGIO信號通知上層程序讀數據。異步通知只有一個SIGIO信號,當多個設備都發送該信號,用戶進程無法區分,必須用poll或select函數來確定數據來源。筆者研究發現信號機制經過POSIX擴展后,用sigaction()可以傳遞文件句柄,用戶進程就可區分信號來源了。
三、信號在I2C驅動的應用
3.1 I2C驅動信號接口
用戶進程使用fcntl執行F_SETOWN,進程ID號就保存在file->f_owner中,執行F_SETFL在設備中置FASYNC標志,設備有新數據時發送一個SIGIO信號,該信號被存放在file->f_owner中。
3.2信號的安裝
使用sigaction()安裝信號函數。該函數有三個參數,第一個為信號值,第二個是結構sigaction指針,第三個未用。
在結構sigaction中sa_sigaction是信號函數。該信號函數有三個參數,第一個為信號值,第二個是siginfo_t結構指針,第三個未用。在siginfo_t結構中,si_fd就是文件句柄。
結構sigaction的sa_flags中SA_SIGINFO標志位被設定表示附帶的參數可以被傳遞到信號函數中。
四、測試
下面用兩個I2C設備fd、fd1來測試信號在驅動程序的應用。
經測試,I2C驅動程序達到了實時中斷的要求,互不干擾。
結語:筆者以I2C驅動程序為例,拋磚引玉,推廣到其他驅動程序的編寫上來,會使嵌入式LINUX代碼更短,方法更簡單,效率更高。
參 考 文 獻
[1]LINU設備驅動程序.第二版.魏永明,駱剛,姜君譯.北京:中國電力出版社.2002.11.
[2]Linux內核設計與實現.第一版.陳莉君譯.北京:機械工出版社.2006.5.
[3]Linux程序設計.第一版.楊曉云,王建橋,楊濤等譯.北京:機械工業出版社.2002.1.