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