基于嵌入式Linux 系統(tǒng)的高速設(shè)備驅(qū)動(dòng)程序?qū)崿F(xiàn)
1 Linux驅(qū)動(dòng)程序的研究現(xiàn)狀
嵌入式系統(tǒng)已越來越廣泛應(yīng)用于通信領(lǐng)域。而Linux操作系統(tǒng)因?yàn)槠鋬?nèi)核小、開源以及可靈活裁剪等優(yōu)點(diǎn),在嵌人式設(shè)備中得到了廣泛的應(yīng)用。下面首先介紹嵌入式linux系統(tǒng)驅(qū)動(dòng)程序的一般結(jié)構(gòu)。
1.1 傳統(tǒng)的驅(qū)動(dòng)程序結(jié)構(gòu)簡(jiǎn)介
Linux操作系統(tǒng)最基本的組成部分包括資源管理器、調(diào)度程序、介于硬件和應(yīng)用軟件之間的接口、網(wǎng)絡(luò)管理器和文檔系統(tǒng)管理器。本文主要闡述介于硬件和應(yīng)用軟件之間的接口——設(shè)備驅(qū)動(dòng)程序的實(shí)現(xiàn)。
對(duì)于多數(shù)字符設(shè)備而言,其功能主要是數(shù)據(jù)的傳輸。驅(qū)動(dòng)程序操作的一般流程是:當(dāng)read()函數(shù)被系統(tǒng)調(diào)用時(shí),首先對(duì)中斷寄存器進(jìn)行配置,并開中斷,并進(jìn)入中斷等待函數(shù)。此時(shí)系統(tǒng)會(huì)調(diào)用schedule()函數(shù),進(jìn)行其他進(jìn)程的執(zhí)行。一旦有中斷的產(chǎn)生,則根據(jù)中斷寄存器判斷是否為設(shè)備的讀寄存器中斷,即是否有數(shù)據(jù)到達(dá)。若是,則將該數(shù)據(jù)從寄存器所在的地址讀入,并送至相應(yīng)的內(nèi)存。
1.2 傳統(tǒng)驅(qū)動(dòng)程序結(jié)構(gòu)存在的問題
當(dāng)設(shè)備的數(shù)據(jù)量足夠大時(shí),中斷將會(huì)十分的頻繁,而中斷服務(wù)程序?qū)?huì)被反復(fù)的調(diào)用,這會(huì)使得系統(tǒng)長(zhǎng)時(shí)間的處于核心態(tài)中,而無法相應(yīng)其他進(jìn)程的請(qǐng)求,且極大地增加了CPU 的負(fù)擔(dān)。這在高速率、大吞吐量數(shù)據(jù)傳輸?shù)膽?yīng)用中,是無法容忍的。
因此,我們不得不考慮針對(duì)現(xiàn)有的驅(qū)動(dòng)程序的數(shù)據(jù)傳輸程序結(jié)構(gòu)進(jìn)行改進(jìn),以適應(yīng)高速率的數(shù)據(jù)傳輸?shù)男枰?/P>
2 Linux高速設(shè)備驅(qū)動(dòng)的實(shí)現(xiàn)
2.1 采用DMA方式的驅(qū)動(dòng)程序
首先使用DMA 的數(shù)據(jù)傳輸方式對(duì)原有的結(jié)構(gòu)進(jìn)行改進(jìn)。
DMA(direct memory access)是直接存儲(chǔ)器訪問的意思,它可以讓I/O設(shè)備上的數(shù)據(jù)直接與系統(tǒng)的內(nèi)存進(jìn)行通信訪問,而不需要處理器的參與,大大降低了CPU的負(fù)荷,對(duì)于需要進(jìn)行除數(shù)據(jù)傳輸外其他一些數(shù)據(jù)處理的嵌入式處理器是很有幫助的。程序執(zhí)行步驟如下:
1. 配置寄存器,指示硬件開始傳輸數(shù)據(jù);開中斷,進(jìn)程進(jìn)入睡眠等待;
2. 硬件將數(shù)據(jù)寫入DMA存儲(chǔ)器,完成后產(chǎn)生中斷;
3. 喚醒進(jìn)程,中斷服務(wù)程序進(jìn)行中斷的處理(如將數(shù)據(jù)傳輸?shù)接脩魬B(tài)內(nèi)存)。
操作流程如圖1所示。這一結(jié)構(gòu)的驅(qū)動(dòng)程序,相對(duì)于不使用DMA方式而言,能夠很大降低CPU的占用率。但是,該驅(qū)動(dòng)程序結(jié)構(gòu)也有個(gè)明顯的缺陷:當(dāng)硬件進(jìn)行DMA傳輸時(shí),該進(jìn)程進(jìn)入了睡眠等待,只有等到中斷之后,才能喚醒進(jìn)程,這也意味著在DMA 的過程中,我們無法對(duì)該進(jìn)程的其他線程做任何操作。換句話說,其他的線程也會(huì)被阻塞住。當(dāng)數(shù)據(jù)量很大且對(duì)這些讀取的數(shù)據(jù)處理復(fù)雜度很高時(shí),很可能會(huì)造成以下的問題:在長(zhǎng)時(shí)間的用戶態(tài)上數(shù)據(jù)處理期間,有新的數(shù)據(jù)到達(dá)硬件,而核心態(tài)無法及時(shí)進(jìn)行下一次的DMA讀取操作,數(shù)據(jù)因此而丟失。這將是很嚴(yán)重的。特別,如果我們使用wait_for_interrupt ()函數(shù)進(jìn)行中斷的等待,甚至?xí)拐麄€(gè)系統(tǒng)被阻塞,這對(duì)于多線程編程是不可接受的。
圖1 DMA操作的驅(qū)動(dòng)流程圖
評(píng)論