基于1394b總線仿真設(shè)備的WDM驅(qū)動(dòng)開(kāi)發(fā)
掃描二維碼
隨時(shí)隨地手機(jī)看文章
IEEE-1394b總線協(xié)議具有實(shí)時(shí)性、可靠性、確定性等特性,這些特性使其在點(diǎn)對(duì)點(diǎn)通信方面表現(xiàn)突出。IEEE-1394b作為F22猛禽戰(zhàn)機(jī)的總線,同時(shí)也使用在F35、NASA的航天飛機(jī)上以及DV設(shè)備上。而總線的仿真驗(yàn)證設(shè)備需要圖形化的界面軟件,這就要求其工作環(huán)境支持PC機(jī)環(huán)境。作為硬件與軟件橋梁的驅(qū)動(dòng)程序主要工作是保證軟硬件協(xié)調(diào)工作,提供安全簡(jiǎn)單的操作接口,保證通信數(shù)據(jù)的可靠性、實(shí)時(shí)性、確定性等。
1 硬件系統(tǒng)簡(jiǎn)介
圖1是以Xilinx的V6系列的FPGA為核心的硬件框圖。該設(shè)備具有3個(gè)余度,并且三余度之間能夠獨(dú)立工作,互不影響。硬件采用三路Link和PHY芯片,三路獨(dú)立供電。由于仿真設(shè)備運(yùn)行的環(huán)境的封閉性,從而設(shè)計(jì)軟件和硬件兩種供電控制開(kāi)關(guān)。軟件電源控制信號(hào)由FPGA控制可編程的電源控制芯片來(lái)遠(yuǎn)程控制設(shè)備。設(shè)備供電無(wú)需外接電源,直接利用PC機(jī)的PCI或者PCIe總線插槽供電,硬件提供電源管理系統(tǒng)進(jìn)行電壓轉(zhuǎn)換。該設(shè)備支持速率S100Mbps和S400Mbps,硬件提供S100Mbps和S400Mbps端口速率切換按鈕,F(xiàn)PGA內(nèi)部通信速率由邏輯控制完成。
FPGA邏輯功能框如圖2所示,F(xiàn)PGA邏輯對(duì)PCI/PCIe總線協(xié)議和1394b總線進(jìn)行協(xié)議封裝以及協(xié)議解析;對(duì)內(nèi)存空間,IO空間以及中斷號(hào)等進(jìn)行劃分;對(duì)操作寄存器進(jìn)行定義;對(duì)發(fā)送數(shù)據(jù)的DM口,接收數(shù)據(jù)的GRF口進(jìn)行控制;開(kāi)放LINK和PHY的軟件訪問(wèn)權(quán)限,便于實(shí)現(xiàn)遠(yuǎn)程訪問(wèn)功能;對(duì)DPRAM進(jìn)行雙口切換操作,以保證數(shù)據(jù)通信的可靠性;設(shè)計(jì)退避算法防止總線競(jìng)爭(zhēng)失敗數(shù)據(jù)丟失;支持DMA操作,實(shí)現(xiàn)通信的實(shí)時(shí)性。
2 驅(qū)動(dòng)設(shè)計(jì)
驅(qū)動(dòng)程序是硬件廠商根據(jù)硬件工作環(huán)境的操作系統(tǒng)編寫(xiě)的配置文件,其運(yùn)行于操作系統(tǒng)內(nèi)核態(tài),是設(shè)備與計(jì)算機(jī)交互的橋梁,它把硬件的功能告訴操作系統(tǒng),同時(shí)也將系統(tǒng)
的指令傳達(dá)給硬件。驅(qū)動(dòng)軟件分為軟件驅(qū)動(dòng)和硬件驅(qū)動(dòng)。軟件驅(qū)動(dòng)是把工作最終交給CPU處理,對(duì)CPU依賴性比較高,對(duì)操作系統(tǒng)影響比較大;而硬件驅(qū)動(dòng)能夠最大化的避免CPU的調(diào)度,提高硬件資源的利用率、增加傳輸?shù)膶?shí)時(shí)性、減少設(shè)備對(duì)計(jì)算機(jī)的依賴性等。
本設(shè)備驅(qū)動(dòng)程序采用硬件驅(qū)動(dòng),開(kāi)發(fā)工具為DDK(Device Development Kit),調(diào)試工具為Debug view,其工作流程如圖3所示。
由于Windows是多任務(wù)非實(shí)時(shí)的操作系統(tǒng),每個(gè)進(jìn)程占用處理器的時(shí)間應(yīng)小于50微秒,如果需要長(zhǎng)時(shí)間的硬件訪問(wèn)應(yīng)采用系統(tǒng)線程的方法,本設(shè)計(jì)采用三余度三個(gè)內(nèi)核線程對(duì)數(shù)據(jù)處理用以保證訪問(wèn)的準(zhǔn)確性。由于該設(shè)備硬件的快捷性和軟件的延時(shí)性,并且突發(fā)大數(shù)據(jù)量傳輸發(fā)生概率比較高。所以驅(qū)動(dòng)程序在發(fā)送模塊上使用了乒乓原理,在接收模塊使用了循環(huán)隊(duì)列,保證數(shù)據(jù)能夠平滑的通信,在突發(fā)大數(shù)據(jù)量操作時(shí)保證了數(shù)據(jù)的完整性和確定性。由于中斷函數(shù)(wdmISR)的系統(tǒng)優(yōu)先級(jí)最高,其工作占用CPU資源能夠影響到整個(gè)系統(tǒng)的運(yùn)行,所以中斷需盡可能的簡(jiǎn)短、盡可能避免使用浮點(diǎn)操作、盡可能的將處理移交給任務(wù)處理。所以設(shè)計(jì)了中斷延時(shí)處理函數(shù)DPC(Deferred Procedure Call)對(duì)系統(tǒng)進(jìn)行資源合理利用保證通信的有效性。中斷服務(wù)程序功能框圖如圖4所示。
串行處理:為了提高硬件資源利用率以及設(shè)備工作的安全性。本設(shè)備設(shè)計(jì)為三余度(兩個(gè)余度為主節(jié)點(diǎn),一個(gè)余度為備用節(jié)點(diǎn))一體設(shè)備,三節(jié)點(diǎn)能夠獨(dú)立進(jìn)行工作。1394b總線協(xié)議允許發(fā)送物理層包訪問(wèn)遠(yuǎn)程節(jié)點(diǎn),并且能夠通過(guò)遠(yuǎn)程訪問(wèn)包對(duì)設(shè)備節(jié)點(diǎn)進(jìn)行遠(yuǎn)程控制。所以當(dāng)任意一個(gè)主節(jié)點(diǎn)出現(xiàn)故障,備用節(jié)點(diǎn)可以通過(guò)遠(yuǎn)程命令斷開(kāi)故障主節(jié)點(diǎn),從而啟用備用節(jié)點(diǎn),增加設(shè)備運(yùn)行的安全性。
單功能多設(shè)備的運(yùn)行對(duì)驅(qū)動(dòng)程序而言每個(gè)設(shè)備都有自己的內(nèi)存空間、I/O空間以及中斷號(hào),運(yùn)行互不影響。軟件對(duì)硬件的操作,在串行處理方面只需要對(duì)操作進(jìn)行排隊(duì)處理,就能夠避免軟件對(duì)硬件的并行操作。而三余度多功能多樣性設(shè)備的運(yùn)行對(duì)驅(qū)動(dòng)而言,使用的可能有很多的共享資源(如DMA等資源),并且軟件對(duì)3個(gè)余度的操作有可能是并行的,驅(qū)動(dòng)軟件設(shè)計(jì)在節(jié)點(diǎn)間共享資源進(jìn)行加鎖處理保證通信的獨(dú)立性及確定性。
串行處理能夠有效的避免資源訪問(wèn)沖突,能夠以不同優(yōu)先級(jí)級(jí)別控制各個(gè)功能,能夠以不同頻率控制各個(gè)功能,有效的提高了軟件對(duì)硬件操作的安全性。該驅(qū)動(dòng)設(shè)計(jì)了節(jié)點(diǎn)間公共資源訪問(wèn)設(shè)置互斥信號(hào)量(KeWaitForMultipleObjects),只有信號(hào)的擁有者才能釋放信號(hào)量。同時(shí)設(shè)計(jì)了保護(hù)節(jié)點(diǎn)內(nèi)共享資源的保護(hù)措施,如中斷掛接IoCionnect Intei Tupt函數(shù)下的自旋鎖。對(duì)上層操作進(jìn)行堆棧處理,保證操作的有效性,并且對(duì)該操作進(jìn)行風(fēng)險(xiǎn)評(píng)估(如對(duì)鏈路層操作可能影響設(shè)備收發(fā)數(shù)據(jù)操作),達(dá)到對(duì)硬件的全面保護(hù)。
內(nèi)核線程:由于該設(shè)備應(yīng)用于通信方面,突發(fā)性大數(shù)據(jù)量傳輸發(fā)生率比較高,而windows環(huán)境下每個(gè)進(jìn)程占用處理器的時(shí)間應(yīng)小于50微秒,所以該驅(qū)動(dòng)在PNP(Plug and Play)
為每個(gè)節(jié)點(diǎn)設(shè)置一個(gè)線程(PsCreateSvstemThread)對(duì)突發(fā)的大數(shù)據(jù)量數(shù)據(jù)進(jìn)行平滑處理,以保證數(shù)據(jù)平穩(wěn)的交由上層,該線程為事件驅(qū)動(dòng)類(lèi)型。并且通過(guò)KeCetCurrentThread和KeSetPriorityThread調(diào)整線程優(yōu)先級(jí)。
當(dāng)中斷發(fā)生,中斷處理函數(shù)記錄中斷狀態(tài)并清除中斷,判斷中斷是否為空,如果不為空則通過(guò)IoRequestDpc請(qǐng)求DPC,同時(shí)把相應(yīng)的中斷狀態(tài)傳給DPC。DPC通過(guò)中斷狀態(tài)判斷中斷類(lèi)型和發(fā)生中斷的節(jié)點(diǎn),并且置位對(duì)應(yīng)線程的線程事件。線程觸發(fā)后,從阻塞態(tài)變?yōu)榫途w態(tài),當(dāng)該進(jìn)程得到處理器資源,調(diào)用數(shù)據(jù)處理函數(shù)處理數(shù)據(jù)。
DMA:Windows是多任務(wù)非實(shí)時(shí)的操作系統(tǒng),而DMA可以有效的避免CPU的調(diào)度而節(jié)省時(shí)間,提高設(shè)備的實(shí)時(shí)性。系統(tǒng)要求DMA的使用率盡可能的減少并且盡可能的快捷。本設(shè)計(jì)使用硬件側(cè)DMA,由FPGA邏輯實(shí)現(xiàn),DMA控制由驅(qū)動(dòng)控制。
驅(qū)動(dòng)軟件對(duì)DMA進(jìn)行初始化,當(dāng)中斷服務(wù)程序被調(diào)用,驅(qū)動(dòng)程序根據(jù)DPRAM的0、1區(qū)標(biāo)志獲取新數(shù)據(jù)存放區(qū)域,并從該區(qū)獲取新數(shù)據(jù)的刷新標(biāo)記。如有新數(shù)據(jù),則服務(wù)程序申請(qǐng)DMA資源,獲取到DMA資源后,鎖定DMA資源并啟動(dòng)(DMA源地址、目的地址、數(shù)據(jù)搬運(yùn)長(zhǎng)度、控制命令)I/O端口到主存區(qū)的DMA。DMA完成后上報(bào)完整中斷并釋放DMA資源。當(dāng)上層調(diào)用IRP_MJ_DEVICE_CONTROL對(duì)DPRAM進(jìn)行寫(xiě)操作時(shí),驅(qū)動(dòng)程序判斷用戶該次操作的DPRAM的內(nèi)存大小,如果在32K~2048K字節(jié)之間,則啟動(dòng)主存區(qū)到I/O端口的DMA,如果大于則分次啟動(dòng)DMA,如果小于32K字節(jié)則單拍或者多拍操作。操作流程與啟動(dòng)接收DMA相同,操作完成則上報(bào)中斷。
循環(huán)隊(duì)列:快捷性是硬件的特性之一,而應(yīng)用層相對(duì)于硬件是及其緩慢的。并且由于PCI數(shù)據(jù)包封包的影響,其總線實(shí)際帶寬只有133 Mbps/s,而本1394b設(shè)備支持S100Mbps
和S400Mbps兩種傳輸速率。所以為避免設(shè)備長(zhǎng)時(shí)間工作帶來(lái)內(nèi)存遞增、內(nèi)存泄漏以及突發(fā)大數(shù)據(jù)量給PCI總線通信超負(fù)荷運(yùn)轉(zhuǎn)造成數(shù)據(jù)丟失現(xiàn)象,驅(qū)動(dòng)利用IoAllocateMdl申請(qǐng)一塊3M的內(nèi)存區(qū),供硬件軟件交互循環(huán)利用的循環(huán)隊(duì)列用以保證傳輸?shù)挠锌煽啃?,以及安全性?/p>
當(dāng)中斷服務(wù)程序被調(diào)用時(shí),驅(qū)動(dòng)啟動(dòng)DMA或者讀寫(xiě)寄存器操作把數(shù)據(jù)從指定DPRAM區(qū)搬運(yùn)到主存區(qū),更新新的數(shù)據(jù)指針并通過(guò)軟中斷方式通知上層軟件。上層軟件通過(guò)Deviee IoCo ntrol對(duì)設(shè)備進(jìn)行控制,當(dāng)應(yīng)用層對(duì)驅(qū)動(dòng)進(jìn)行操作時(shí),驅(qū)動(dòng)根據(jù)寫(xiě)指針與讀指針的差值提供可操作的內(nèi)存塊給上層軟件。
乒乓原理:乒乓原理不僅能夠提高帶寬的利用率,并且能夠有效避免硬件與軟件操作沖突情況的出現(xiàn),并且避免了資源訪問(wèn)沖突的重試耗時(shí),提高傳輸?shù)挠行浴?shí)時(shí)性。驅(qū)動(dòng)收發(fā)模塊乒乓操作如圖5和圖6所示。
發(fā)送模塊中,驅(qū)動(dòng)軟件與應(yīng)用層交互,采用兩塊地址內(nèi)存區(qū)。內(nèi)存塊操作由用戶層軟件操作,操作完成后切換內(nèi)存區(qū)并通知驅(qū)動(dòng)最新數(shù)據(jù)存放位置。驅(qū)動(dòng)軟件與硬件交互也采用兩塊DPRAM區(qū)。DPRAM的0、1區(qū)的切換操作由驅(qū)動(dòng)軟件進(jìn)行操作,數(shù)據(jù)更新完畢的DPRAM交由邏輯處理并進(jìn)行換區(qū)操作。
接收模塊中,驅(qū)動(dòng)軟件設(shè)計(jì)循環(huán)隊(duì)列與上層軟件進(jìn)行交互。硬件與驅(qū)動(dòng)軟件交互同樣采用乒乓原理,該操作由硬件邏輯操作,驅(qū)動(dòng)軟件根據(jù)最新數(shù)據(jù)存放的DPRAM區(qū),以及消
息新舊標(biāo)記來(lái)進(jìn)行數(shù)據(jù)處理。處理完成后完成數(shù)據(jù)新舊標(biāo)志切換,并軟中斷方式通知應(yīng)用層有新數(shù)據(jù)到達(dá),應(yīng)用層驅(qū)動(dòng)返回的地址指針和內(nèi)存大小獲取最新數(shù)據(jù)。
3 驗(yàn)證分析
本設(shè)備提供DLL(Dynamic Link Library),采用Microsoft Visual Studio 2008專(zhuān)業(yè)版開(kāi)發(fā),封裝為標(biāo)準(zhǔn)的動(dòng)態(tài)鏈接庫(kù)。提供Demo程序,圖7為CC(Control computer)的發(fā)送數(shù)據(jù)窗口測(cè)試圖,圖8為RN(Remote Node)的接收數(shù)據(jù)的窗口測(cè)試圖。
由上圖可見(jiàn)驅(qū)動(dòng)程序?qū)崿F(xiàn)了1394b的S400 Mbps速率和PCI的S133 Mbps速率的跨速率通信數(shù)據(jù)不丟失,避免了軟硬件交互產(chǎn)生的誤碼,使在S100 Mbps通信速率下平均帶寬達(dá)到79.2 Mbps,在S400Mbps通信速率下平均帶寬達(dá)到231.7 Mbps,實(shí)現(xiàn)了數(shù)據(jù)延時(shí)控制在us級(jí)別,實(shí)現(xiàn)了操作的準(zhǔn)確性,保證了數(shù)據(jù)傳輸?shù)拇_定性。
4 結(jié)束語(yǔ)
自2011年中國(guó)面臨著國(guó)外大規(guī)模技術(shù)轉(zhuǎn)移封鎖以來(lái),國(guó)內(nèi)自研設(shè)備百花齊放,尤其是軟件硬化無(wú)疑已經(jīng)成為焦點(diǎn)。作為硬件靈魂的驅(qū)動(dòng)程序越來(lái)越受到人們的重視。本文根據(jù)軟硬件的特性進(jìn)行軟硬件工作協(xié)調(diào),提高了硬件資源的利用率,提高了仿真通信的實(shí)時(shí)性,確定性,可靠性。由于需求要求該設(shè)備為PCI總線設(shè)備,通信的帶寬受到限制,所以準(zhǔn)備利用PCIe總線和實(shí)時(shí)操作系統(tǒng)提高設(shè)備的通信帶寬。