應(yīng)三叢,汪明寅,張 行
(1.四川大學(xué) 計(jì)算機(jī)學(xué)院,四川 成都610065;2.四川大學(xué) 電氣信息學(xué)院,四川 成都610065)
嵌入式技術(shù)的發(fā)展導(dǎo)致越來(lái)越多的電子設(shè)備都采用嵌入式計(jì)算機(jī)系統(tǒng)來(lái)實(shí)現(xiàn),而PowerPC和DSP都屬于嵌入式技術(shù)的范疇。對(duì)于具有視頻圖像數(shù)據(jù)處理,以及對(duì)處理結(jié)果需要存儲(chǔ)管理和網(wǎng)絡(luò)傳輸?shù)那度胧郊夹g(shù)應(yīng)用,單純的選擇PowerPC或DSP來(lái)實(shí)現(xiàn),都不是一個(gè)好的選擇,因?yàn)镻owerPC和DSP都有各自的缺陷。眾所周知,DSP作為數(shù)字信號(hào)處理專用處理器,在視頻圖像處理等方面有很大的優(yōu)勢(shì),但對(duì)諸如文件管理,網(wǎng)絡(luò)傳輸?shù)仁聞?wù)性工作的實(shí)現(xiàn)存在困難。而PowerPC處理器與DSP專用處理器剛好形成互補(bǔ),移植在PowerPC處理器上的Linux操作系統(tǒng)則可以根據(jù)需要裁減內(nèi)核,在數(shù)據(jù)管理、多任務(wù)調(diào)度和網(wǎng)絡(luò)傳輸?shù)确矫姹憩F(xiàn)出色。綜合二者各自的優(yōu)點(diǎn),同時(shí)采用Power-PC與DSP技術(shù)來(lái)實(shí)現(xiàn)包含視頻圖像處理和網(wǎng)絡(luò)傳輸?shù)膽?yīng)用是一種最佳方案。采用PowerPC和DSP雙核技術(shù)時(shí),PowerPC與DSP之間通常存在大量數(shù)據(jù)需要相互交換,那么,如何實(shí)現(xiàn)二者之間數(shù)據(jù)的高效通信就成了不容忽視的問(wèn)題。由于PowerPC和DSP處理器都能提供PCI總線接口,并且PowerPC處理器上可以移植嵌入式Linux操作系統(tǒng),因 此,本 文 采 用 PCI(peripheral component interconnect)作為二者之間大量數(shù)據(jù)傳輸?shù)耐ㄐ沤涌?。在Linux操作系統(tǒng)中,為了保證PCI接口數(shù)據(jù)傳輸?shù)母咝?,其?qū)動(dòng)程序設(shè)計(jì)是關(guān)鍵。多篇文獻(xiàn)[1-4]中都只介紹了通用的PCI驅(qū)動(dòng)程序設(shè)計(jì)的基本方法,并沒(méi)有提到如何提高PCI數(shù)據(jù)傳輸?shù)募夹g(shù)。在PCI的驅(qū)動(dòng)程序設(shè)計(jì)中,本文采用了零拷貝技術(shù)和直接存儲(chǔ)器訪問(wèn)(DMA)技術(shù),并與通常的PCI驅(qū)動(dòng)程序設(shè)計(jì)進(jìn)行對(duì)比后,明顯提高了PowerPC和DSP之間的PCI數(shù)據(jù)傳輸能力。
本文驅(qū)動(dòng)程序設(shè)計(jì)是針對(duì)PowerPC與DSP的嵌入式平臺(tái)開發(fā)的,DSP選用 TI公司的 DM642芯片[5-6],主頻600MHz,8個(gè)平行處理單元,外圍包含了多個(gè)VPort口,有利于實(shí)現(xiàn)各種視頻數(shù)據(jù)的采集;片上集成的PCI總線控制器,可以作為PCI主/從設(shè)備傳輸數(shù)據(jù)。PowerPC選用freescale公 司 的 MPC8315E 芯 片[7], 該 芯 片 主 頻 為400MHz的e300內(nèi)核架構(gòu),片內(nèi)集成了兩個(gè)千兆網(wǎng)絡(luò)控制器(gMAC)和SATA接口控制器,有利于PowerPC實(shí)現(xiàn)數(shù)據(jù)的本地存儲(chǔ)處理和網(wǎng)絡(luò)傳輸?shù)裙δ?;MPC8315片上集成了PCI總線控制器,可以作為PCI Host訪問(wèn)PCI總線上的各個(gè)PCI設(shè)備;擴(kuò)展的大容量存儲(chǔ)器和片上集成的DMA控制器(含4個(gè)DMA通道)有利于提高PCI總線上數(shù)據(jù)傳輸?shù)哪芰Α?/p>
PowerPC與DSP(即MPC8315E與DM642)之間的PCI數(shù)據(jù)傳輸機(jī)制如圖1所示,MPC8315E作為PCI Host主機(jī),DM642作為PCI Slave設(shè)備。MPC8315E通過(guò)PCI總線與DM642進(jìn)行數(shù)據(jù)通信存在兩種方式,一種是由CPU直接參與PCI總線讀寫,眾多文獻(xiàn)均采用這種方式進(jìn)行PCI總線傳輸,即MPC8315E直接參與讀寫PCI總線和外圍的DDR-II存儲(chǔ)器。另一種是DMA控制傳輸方式,MPC8315E只需要簡(jiǎn)單設(shè)置DMA控制器的寄存器,雙核之間的大量數(shù)據(jù)傳輸主要由DMA控制器來(lái)完成,幾乎不需要MPC8315E來(lái)干預(yù),這種方式幾乎不占用MPC8315E的CPU運(yùn)行時(shí)間,有助于整個(gè)系統(tǒng)的性能提高。
在Linux操作系統(tǒng)中,所有的外圍設(shè)備都是通過(guò)文件節(jié)點(diǎn)來(lái)進(jìn)行訪問(wèn)的,Linux的虛擬文件系統(tǒng)為各種不同文件系統(tǒng)提高了統(tǒng)一的訪問(wèn)接口,包括PCI外圍設(shè)備,通過(guò)這些接口,應(yīng)用程序可以直接使用open,close,read,write和ioctl等系統(tǒng)調(diào)用來(lái)對(duì)各種設(shè)備進(jìn)行訪問(wèn)和控制[8-9]。而為一個(gè)外圍設(shè)備提供這些系統(tǒng)調(diào)用的響應(yīng)函數(shù)正是該設(shè)備驅(qū)動(dòng)程序的責(zé)任,驅(qū)動(dòng)程序?qū)崿F(xiàn)的這些響應(yīng)函數(shù)才可以直接訪問(wèn)外部的物理設(shè)備,換句話說(shuō),Linux中應(yīng)用程序訪問(wèn)外部的設(shè)備都是通過(guò)該設(shè)備的驅(qū)動(dòng)程序來(lái)實(shí)現(xiàn)的,因此,若要訪問(wèn)外圍設(shè)備,對(duì)該設(shè)備驅(qū)動(dòng)程序的開發(fā)是必需的;若要提高與外圍設(shè)備的數(shù)據(jù)傳輸性能,其驅(qū)動(dòng)程序如何設(shè)計(jì)又是非常重要的。
圖1 PowerPC與DSP之間的數(shù)據(jù)傳輸機(jī)制
在Linux系統(tǒng)中,其系統(tǒng)主要分為3層:應(yīng)用層,內(nèi)核層和物理層[10]。應(yīng)用層主要運(yùn)行與應(yīng)用相關(guān)的應(yīng)用程序;內(nèi)核層主要是Linux操作系統(tǒng)運(yùn)行的空間,包括驅(qū)動(dòng)程序也運(yùn)行在該層;物理層就是各種物理外設(shè),包括該平臺(tái)中掛在PCI總線的DM642設(shè)備。應(yīng)用程序要訪問(wèn)外部的PCI設(shè)備,必須通過(guò)驅(qū)動(dòng)程序來(lái)實(shí)現(xiàn),如圖2所示。
基于MPC8315E和DM642嵌入式平臺(tái),其PCI設(shè)備驅(qū)動(dòng)程序設(shè)計(jì)包括控制命令、上行數(shù)據(jù)傳輸和下行數(shù)據(jù)傳輸,如圖2所示。控制命令主要是通過(guò)各種系統(tǒng)調(diào)用,如read(),write(),ioctl()等,實(shí)現(xiàn)對(duì)DM642控制,包括DM642的啟動(dòng),停止等;上行數(shù)據(jù)傳輸是指MPC8315E讀取DM642端的業(yè)務(wù)數(shù)據(jù);下行數(shù)據(jù)傳輸是指MPC8315E把業(yè)務(wù)數(shù)據(jù)寫到DM642。在本文的驅(qū)動(dòng)程序設(shè)計(jì)中,MPC8315E和DM642之間大量的數(shù)據(jù)傳輸采用了兩個(gè)關(guān)鍵技術(shù),即零拷貝技術(shù)和DMA數(shù)據(jù)傳輸技術(shù)。無(wú)論是上行數(shù)據(jù)還是下行數(shù)據(jù),應(yīng)用層與驅(qū)動(dòng)層之間采用了共享存儲(chǔ)器的方法實(shí)現(xiàn)大量數(shù)據(jù)傳輸,應(yīng)用層和驅(qū)動(dòng)層可以互斥訪問(wèn)同一段存儲(chǔ)器。對(duì)于上行數(shù)據(jù),當(dāng)DM642端數(shù)據(jù)準(zhǔn)備就緒,通過(guò)PCI外部中斷觸發(fā)驅(qū)動(dòng)程序的外部中斷服務(wù)程序,中斷服務(wù)程序處理完中斷現(xiàn)場(chǎng)后啟動(dòng)DMA讀傳輸,DMA控制器通過(guò)PCI總線直接從DM642把準(zhǔn)備好的數(shù)據(jù)傳到共享的存儲(chǔ)器中,傳輸完成后觸發(fā)DMA中斷服務(wù)程序,DMA中斷服務(wù)程序通過(guò)同步消息通知應(yīng)用程序數(shù)據(jù)已經(jīng)在共享存儲(chǔ)器中就緒,應(yīng)用層可以處理共享存儲(chǔ)器中的數(shù)據(jù);對(duì)于下行數(shù)據(jù),應(yīng)用層把數(shù)據(jù)存放到共享存儲(chǔ)器中,通過(guò)ioctl()系統(tǒng)調(diào)用通知驅(qū)動(dòng)層下行的數(shù)據(jù)已準(zhǔn)備就緒,驅(qū)動(dòng)層啟動(dòng)DMA寫傳輸,DMA控制器通過(guò)PCI總線直接把共享存儲(chǔ)器中的數(shù)據(jù)寫到DM642的存儲(chǔ)器中。
PCI設(shè)備驅(qū)動(dòng)程序通用框架以及中斷注冊(cè)等實(shí)現(xiàn)幾乎一樣,在很多文獻(xiàn)[11-12]中都已經(jīng)提到,本文中不再重復(fù)討論這些內(nèi)容。針對(duì)實(shí)現(xiàn)高性能數(shù)據(jù)傳輸?shù)腜CI設(shè)備驅(qū)動(dòng)程序,下面的內(nèi)容主要討論其中關(guān)鍵技術(shù)的實(shí)現(xiàn)。
圖2 Linux系統(tǒng)中PCI驅(qū)動(dòng)程序的實(shí)現(xiàn)框架
在PCI總線的數(shù)據(jù)傳輸中,通常都是由CPU主動(dòng)讀寫訪問(wèn)PCI外圍設(shè)備[13],必然會(huì)占用CPU的大量時(shí)間來(lái)實(shí)現(xiàn)PCI設(shè)備的數(shù)據(jù)輸入輸出,造成整個(gè)系統(tǒng)的性能下降。對(duì)于片上集成有DMA控制器的CPU,若采用DMA傳輸技術(shù)實(shí)現(xiàn)PCI數(shù)據(jù)傳輸,可以幾乎不占用CPU的時(shí)間,由DMA控制器來(lái)完成數(shù)據(jù)的輸入輸出,必然會(huì)提高整個(gè)系統(tǒng)的性能。
MPC8315E處理器片上集成有DMA控制器,可控制多個(gè)DMA傳輸通道,并且可以實(shí)現(xiàn)PCI總線和存儲(chǔ)器總線之間的相互傳輸,在本文驅(qū)動(dòng)程序設(shè)計(jì)中,正是根據(jù)MPC8315E的片上DMA控制器特點(diǎn),采用DMA技術(shù)實(shí)現(xiàn)PCI設(shè)備的數(shù)據(jù)傳輸,為MPC8315E節(jié)約更多的時(shí)間處理別的事務(wù),其實(shí)現(xiàn)步驟如下:
(1)在系統(tǒng)內(nèi)存中分配大塊的存儲(chǔ)區(qū),用于DMA傳輸,必須確保屬于低端內(nèi)存,得到用于DMA傳輸?shù)目偩€地址,且不能換入換出,通常會(huì)用到GFP_KERNEL,GFP_DMA等標(biāo)志,其具體實(shí)現(xiàn)在后面的零拷貝技術(shù)會(huì)詳細(xì)描述。
(2)在內(nèi)核中調(diào)用request_dma()函數(shù)請(qǐng)求并注冊(cè)一個(gè)DMA通道,并為該通道注冊(cè)一個(gè)DMA傳輸完成中斷,并實(shí)現(xiàn)其中斷服務(wù)程序,與驅(qū)動(dòng)程序的其他中斷注冊(cè)方法相同,不再描述。
(3)通過(guò)內(nèi)核函數(shù)獲得PCI設(shè)備DM642在MPC8315E的系統(tǒng)中的總線地址,對(duì)于PCI設(shè)備其中一個(gè)存儲(chǔ)器資源的實(shí)現(xiàn)如下,其余段的存儲(chǔ)器資源處理相同。
(4)當(dāng)數(shù)據(jù)準(zhǔn)備就緒,通過(guò)中斷或者命令通知CPU初始化DMA通道的各個(gè)參數(shù),如DMA的源總線地址寄存器,目的總線地址寄存器以及傳輸數(shù)據(jù)長(zhǎng)度寄存器等,并啟動(dòng)DMA傳輸后,CPU就不再參與數(shù)據(jù)的傳輸,在DMA傳輸完成后,在其DMA傳輸完成中斷服務(wù)程序中CPU只需要清理中斷現(xiàn)場(chǎng)就結(jié)束數(shù)據(jù)傳輸。
因此,驅(qū)動(dòng)程序設(shè)計(jì)中采用了DMA技術(shù),在MPC8315E和DMA642之間的PCI數(shù)據(jù)傳輸?shù)倪^(guò)程中,只需要占用極少的CPU時(shí)間初始化DMA寄存器及DMA中斷管理,有利于優(yōu)化整個(gè)系統(tǒng)的性能。
在Linux操作系統(tǒng)中,應(yīng)用層軟件和內(nèi)核層的驅(qū)動(dòng)程序的數(shù)據(jù)交換通常可以通過(guò)系統(tǒng)調(diào)用read()、write()來(lái)實(shí)現(xiàn),read()和write()調(diào)用[14]時(shí),應(yīng)用層軟件使用的是用戶空間緩沖區(qū),驅(qū)動(dòng)程序使用的是內(nèi)核空間緩沖區(qū)。系統(tǒng)調(diào)用read()要實(shí)現(xiàn)數(shù)據(jù)從驅(qū)動(dòng)層傳輸?shù)綉?yīng)用層,那么需要調(diào)用copy_to_user()來(lái)實(shí)現(xiàn)內(nèi)核空間緩沖區(qū)數(shù)據(jù)拷貝到用戶空間緩沖區(qū);而系統(tǒng)調(diào)用write()要實(shí)現(xiàn)數(shù)據(jù)從應(yīng)用層傳輸?shù)津?qū)動(dòng)層,那么需要調(diào)用copy_from_user()來(lái)實(shí)現(xiàn)用戶空間緩沖區(qū)數(shù)據(jù)拷貝到內(nèi)核空間緩沖區(qū)。大量數(shù)據(jù)從一個(gè)緩沖區(qū)拷貝到另一個(gè)緩沖區(qū),會(huì)占用CPU大量的時(shí)間,因此,采用read()和write()方法實(shí)現(xiàn)用戶空間和內(nèi)核空間數(shù)據(jù)的交換,只適用小量數(shù)據(jù)的傳輸,而不適用大量數(shù)據(jù)的傳輸。
零拷貝技術(shù)[14]是指用戶空間與內(nèi)核空間緩沖區(qū)的數(shù)據(jù)相互傳輸時(shí),只需要傳遞緩沖區(qū)的地址指針,不需要做任何的拷貝,其實(shí)現(xiàn)主要包括共享內(nèi)存和異步通知機(jī)制。共享內(nèi)存是指同一段物理內(nèi)存分別映射出用戶空間虛擬地址和內(nèi)核空間虛擬地址后,應(yīng)用層和驅(qū)動(dòng)層都可以訪問(wèn)同一段物理內(nèi)存;異步通知機(jī)制是指在應(yīng)用層和驅(qū)動(dòng)層之間實(shí)現(xiàn)一個(gè)異步的消息通知機(jī)制,實(shí)現(xiàn)應(yīng)用層和驅(qū)動(dòng)層對(duì)同一物理內(nèi)存的互斥訪問(wèn)。以下主要描述零拷貝技術(shù)在驅(qū)動(dòng)程序中的實(shí)現(xiàn)。
2.3.1 共享內(nèi)存
在Linux系統(tǒng)中,應(yīng)用層軟件通過(guò)文件操作file_operations結(jié)構(gòu)的mmap函數(shù)來(lái)實(shí)現(xiàn)共享存儲(chǔ)器映射[14]。具體實(shí)現(xiàn)是,首先,在驅(qū)動(dòng)的初始化時(shí),在系統(tǒng)內(nèi)存中分配共享存儲(chǔ)區(qū)。由于該共享存儲(chǔ)區(qū)也需要提供給DMA傳輸使用,所以它的分配必須使用面向頁(yè)面的分配技術(shù),而且需要是物理連續(xù)的若干個(gè)頁(yè)面,分配后返回的是該段內(nèi)存的內(nèi)核虛擬地址。其實(shí)現(xiàn)函數(shù)如下:
在驅(qū)動(dòng)程序的對(duì)mmap系統(tǒng)調(diào)用的響應(yīng)函數(shù)mypci_mmap()中,通過(guò)一個(gè)虛擬內(nèi)存區(qū)(VMA)結(jié)構(gòu)把以上分配內(nèi)存的內(nèi)核虛擬地址轉(zhuǎn)換到該段內(nèi)存的物理地址,通過(guò)物理地址為該內(nèi)存建立新的頁(yè)表,并映射出起始的用戶虛擬地址。其實(shí)現(xiàn)函數(shù)如下:
應(yīng)用層軟件的mmap系統(tǒng)調(diào)用函數(shù)返回的地址就是該段共享內(nèi)存在用戶空間的虛擬地址,應(yīng)用程序通過(guò)該地址可以訪問(wèn)該段共享內(nèi)存。
2.3.2 異步通知機(jī)制
在Linux編程中,若應(yīng)用層軟件與驅(qū)動(dòng)程序之間共享了內(nèi)存,那么,應(yīng)用程序和驅(qū)動(dòng)程序都可以訪問(wèn)同一段物理內(nèi)存,為了避免二者之間訪問(wèn)內(nèi)存的沖突,必須在應(yīng)用層和驅(qū)動(dòng)層之間實(shí)現(xiàn)同步互斥訪問(wèn)。用戶程序啟用stdin輸入文件到當(dāng)前進(jìn)程的異步通知機(jī)制,同時(shí)注冊(cè)了一個(gè)應(yīng)用層的消息響應(yīng)函數(shù)msgCallback()。其實(shí)現(xiàn)如下:
在驅(qū)動(dòng)程序?qū)ξ募僮鱢async()的響應(yīng)函數(shù)mypci_fasync()中,通過(guò)fasync_h(yuǎn)elper()函數(shù)實(shí)現(xiàn)對(duì)異步通知事件的系統(tǒng)注冊(cè)。
驅(qū)動(dòng)程序在數(shù)據(jù)緩沖區(qū)就緒后,通過(guò)kill_fasync(&mypci->pci_queue,SIGIO,POLL_IN)函數(shù)發(fā)送通知消息到應(yīng)用軟件,使其消息響應(yīng)函數(shù)msgCallback()被調(diào)用。通過(guò)POLL_IN可以同時(shí)傳遞一個(gè)參數(shù)到其消息響應(yīng)函數(shù)實(shí)現(xiàn)同步。
在本文中,基于MPC8315E和DM642構(gòu)建的嵌入式硬件平臺(tái)和linux2.6.29版本,采用以上描述的關(guān)鍵技術(shù)設(shè)計(jì)了雙處理器之間PCI總線的驅(qū)動(dòng)程序,并用gcc4.1.2交叉編譯器在ltib環(huán)境下編譯生成PCI驅(qū)動(dòng)程序模塊,在驅(qū)動(dòng)程序模塊安裝時(shí),需要完成的工作包括:驅(qū)動(dòng)程序的初始化;分配兩個(gè)共享內(nèi)存,并映射其用戶空間虛擬地址和用于DMA傳輸?shù)奈锢淼刂罚猾@得訪問(wèn)PCI設(shè)備的存儲(chǔ)空間資源的起始地址,通過(guò)該地址獲得用于DMA傳輸?shù)目偩€地址;注冊(cè)外部PCI中斷源及其中斷服務(wù)函數(shù);注冊(cè)DMA通道、DMA傳輸完成中斷源及其中斷服務(wù)函數(shù);注冊(cè)實(shí)現(xiàn)異步通知機(jī)制的消息。驅(qū)動(dòng)程序模塊安裝完成后,其驅(qū)動(dòng)程序就駐留在內(nèi)核程序空間,MPC8315E的應(yīng)用程序可以通過(guò)驅(qū)動(dòng)程序訪問(wèn)PCI外設(shè)DM642,其流程圖如圖3所示。
圖3 驅(qū)動(dòng)程序流程
基于MPC8315E+DM642嵌入式平臺(tái)和Linux操作系統(tǒng),采用本文論述的驅(qū)動(dòng)程序關(guān)鍵技術(shù)實(shí)現(xiàn)PCI總線驅(qū)動(dòng)程序模塊設(shè)計(jì),PCI外設(shè)(DM642)和MPC8315E端應(yīng)用層之間的數(shù)據(jù)傳輸,主要采用DMA控制器和交換緩沖區(qū)指針來(lái)實(shí)現(xiàn),幾乎不占用MPC8315E的時(shí)間。為了說(shuō)明本文描述的驅(qū)動(dòng)程序技術(shù)非常關(guān)鍵,將本文描述方法設(shè)計(jì)的PCI驅(qū)動(dòng)程序和傳統(tǒng)方法(即read,write方法)設(shè)計(jì)的PCI驅(qū)動(dòng)程序都進(jìn)行了性能測(cè)試,其測(cè)試方法是在相同的該嵌入式平臺(tái)上,通過(guò)PCI總線傳輸相同的數(shù)據(jù),并將傳輸?shù)臄?shù)據(jù)保存到文件系統(tǒng)中,分別統(tǒng)計(jì)占用MPC8315E的負(fù)荷。其測(cè)試結(jié)果如表1所示。
表1 兩種PCI驅(qū)動(dòng)程序的性能測(cè)試結(jié)果
針對(duì)該嵌入式系統(tǒng),測(cè)試得到MPC8315E寫文件時(shí)的最大帶寬約10Mbyte/s,根據(jù)表1橫向?qū)Ρ瓤芍?,采用關(guān)鍵技術(shù)實(shí)現(xiàn)的驅(qū)動(dòng)程序在該測(cè)試中,占用的CPU負(fù)荷主要就是寫數(shù)據(jù)到文件所需要的負(fù)荷;而采用傳統(tǒng)方法實(shí)現(xiàn)的驅(qū)動(dòng)程序在該測(cè)試中,占用的CPU負(fù)荷包括了從PCI外設(shè)讀數(shù)據(jù),從內(nèi)核緩沖區(qū)拷貝數(shù)據(jù)到用戶緩沖區(qū)和用戶空間寫數(shù)據(jù)到文件的負(fù)荷總和。根據(jù)表1縱向?qū)Ρ瓤芍?dāng)PCI總線上傳輸?shù)臄?shù)據(jù)量較小時(shí),如1Kbyte/s,100Kbyte/s,CPU的負(fù)荷都很小,采用兩種方法實(shí)現(xiàn)的驅(qū)動(dòng)程序?qū)φ麄€(gè)CPU性能的影響差別不大。當(dāng)傳輸?shù)臄?shù)據(jù)量逐漸增加時(shí),如1Mbyte/s,2Mbyte/s等,采用本文描述方法實(shí)現(xiàn)的驅(qū)動(dòng)程序?qū)τ谔岣逤PU性能具有明顯優(yōu)勢(shì)。
針對(duì)linux操作系統(tǒng),本文提出了PCI設(shè)備驅(qū)動(dòng)程序設(shè)計(jì)的關(guān)鍵技術(shù)實(shí)現(xiàn),主要是DMA技術(shù)和零拷貝技術(shù)。與傳統(tǒng)的PCI設(shè)備驅(qū)動(dòng)程序設(shè)計(jì)方法相比,DMA技術(shù)不需要占用處理器的大量時(shí)間實(shí)現(xiàn)與PCI外設(shè)的數(shù)據(jù)傳輸,零拷貝技術(shù)實(shí)現(xiàn)了應(yīng)用軟件與內(nèi)核軟件共享數(shù)據(jù)緩存,減少處理器拷貝數(shù)據(jù)占用的時(shí)間。
在PowerPC和DM642的雙處理器嵌入式平臺(tái)上,本文提出的關(guān)鍵技術(shù)應(yīng)用于linux系統(tǒng)下PCI外設(shè)驅(qū)動(dòng)程序的設(shè)計(jì),并與傳統(tǒng)的PCI驅(qū)動(dòng)程序設(shè)計(jì)方法進(jìn)行了實(shí)驗(yàn)對(duì)比,結(jié)果表明,在驅(qū)動(dòng)程序設(shè)計(jì)中,采用本文描述的關(guān)鍵技術(shù)對(duì)于提高整個(gè)嵌入式系統(tǒng)的性能具有明顯的優(yōu)勢(shì)。本文描述的關(guān)鍵技術(shù)需要額外占用系統(tǒng)的DMA通道資源,存在一定的局限性,若需進(jìn)一步提高系統(tǒng)性能,建議在PCI設(shè)備卡的設(shè)計(jì)和驅(qū)動(dòng)程序設(shè)計(jì)中實(shí)現(xiàn)PCI master設(shè)備的功能[15],在進(jìn)行大量數(shù)據(jù)傳輸時(shí),PCI外部設(shè)備主動(dòng)申請(qǐng)PCI總線的使用權(quán),直接訪問(wèn)系統(tǒng)內(nèi)存的數(shù)據(jù)。
[1]YANG Qinyu.PCI driver development based on the Linux operation system [J].Electronic Component &Device Pplications,2010,12(6):45-48(in Chinese).[楊慶宇.Linux操作系統(tǒng)下的PCI驅(qū)動(dòng)開發(fā) [J].電子元器件應(yīng)用,2010,12(6):45-48.]
[2]YU Yongwei,MEN Jianbo,DU Liuqing.The real-time image acquisition and processing system based on PCI and DSP [J].Automation and Instrumentation,2005,118(2):11-13(in Chinese).[余永維,蒙建波,杜柳青.基于PCI總線和DSP的實(shí)時(shí)圖像采集與處理系統(tǒng) [J].自動(dòng)化與儀器儀表,2005,118(2):11-13.]
[3]FU Zhizhong,XIAN Haiyin,CHEN Youlin.Device driver development of high speed data capture based on PCI bus [J].Journal of Computer Applications,2009,29(2):577-579(in Chinese).[傅志中,鮮海瀅,陳友林.基于PCI總線的高速數(shù)據(jù)采集設(shè)備驅(qū)動(dòng)程序開發(fā) [J].計(jì)算機(jī)應(yīng)用,2009,29(2):577-579.]
[4]SUN Bo.PCI driver development based on the Linux operation system [J].Information Techonolgy,2010,39(1):19-22(in Chinese).[孫波.Linux操作系統(tǒng)下的PCI驅(qū)動(dòng)開發(fā) [J].信息技術(shù),2010,39(1):19-22.]
[5]TM320DM642Video/Imaging fixed-point digital signal processor [R].Texas Instruments,2007.
[6]TMS320C6000DSP peripheral component internnect reference guide [R].Texas Instruments,2004.
[7]MPC8315EPowerQUICCII Pro integrated host processor family reference manual[R].Freescale Semiconductor,2008.
[8]YANG Defang,PCI Drivers Design [J].Computer Programming Technology and Maintenance,2007,19(4):75-77(in Chinese).[楊德芳,PCI驅(qū)動(dòng)程序設(shè)計(jì) [J].電腦編程技巧與維護(hù),2007,19(4):75-77.]
[9]ZHANG Qiuju,LI Lifen,BAI Yanxia,et al.Development of PCI driver based on DSP [J].Modern Electronic Technology,2009,301(14):18-21(in Chinese).[張秋菊,李麗芬,白燕霞,等.基于DSP的PCI驅(qū)動(dòng)程序開發(fā) [J].現(xiàn)代電子技術(shù),2009,301(14):18-21.]
[10]ROBERT LOVE.Linux kernel development [M].2nd ed.Translator:CHEN Lijun,KANG Hua,ZHANG Bo,transl.Beijing:China Machine Press,2006(in Chinese).[ROBERT LOVE.Linux kernel development[M].2版.陳莉君,康華,張波,譯.北京:機(jī)械工業(yè)出版社,2006.]
[11]SHENG Hongliang,LIU Jinguo,LU Shiliang.Image data acquisition of multi-channel image data based on PCI bus [J].Chinese Journal of Optics and Applied Optics,2009,2(5):438-443(in Chinese).[沈洪亮,劉金國(guó),呂世良.基于PCI總線的多通道圖像數(shù)據(jù)高速采集 [J].中國(guó)光學(xué)與應(yīng)用光學(xué),2009,2(5):438-443.]
[12]MA Hongwei.Research and design of drivers for PCI graphic card based on Linux [D].Wuhan:Huazhong University of Sceince and Technology,2005(in Chinese).[馬洪偉.Linux平臺(tái)下PCI圖像卡的驅(qū)動(dòng)程序設(shè)計(jì)與研究 [D].武漢:華中科技大學(xué),2005.]
[13]Tom Shanley,Don Anderson.PCI system architecture[M].4th ed.Addison-Wesley Professional,1999:123-141.
[14]Jounathan Corbet,Alessandro Rubini,Creg Kroah Hartman.Linux device drivers [M].3rd ed.O’Reilly,2005.
[15]WANG Qi.PCI Express system architecture guide [M].Beijing:China Machine Press,2010(in Chinese).[王齊.PCI Express體系結(jié)構(gòu)導(dǎo)讀 [M].北京:機(jī)械工業(yè)出版社,2010.]