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