黃 睿,蘇 陽,趙英瀟,張 月
(國防科學(xué)技術(shù)大學(xué) 電子科學(xué)與工程學(xué)院,湖南 長沙 410073)
隨著電子技術(shù)的不斷發(fā)展,寬帶雷達系統(tǒng)正朝著高速、數(shù)字化的方向迅速發(fā)展[1],對數(shù)據(jù)的實時記錄提出了更高的要求[2]。雷達數(shù)據(jù)記錄依賴外部設(shè)備與主板間的通信,PCIe協(xié)議作為板件通信最常用的標準,采用點對點傳輸、內(nèi)嵌時鐘等方式[3-4],在硬件層面可以滿足高速數(shù)據(jù)實時記錄需求,因此,上位機軟件性能成為能否實現(xiàn)高速數(shù)據(jù)記錄的關(guān)鍵。
針對上述問題,本文在高性能硬件平臺上設(shè)計了一種合理的軟件架構(gòu),基于PCIe總線,采用DMA傳輸機制、乒乓緩存機制和內(nèi)存池技術(shù)共同實現(xiàn)高速數(shù)據(jù)流的實時記錄。文章闡述了方案詳細的實現(xiàn)流程,并通過結(jié)果驗證方案的可行性。
本文以某寬帶相控陣雷達數(shù)據(jù)采集記錄系統(tǒng)研制為研究背景,采集得到的寬帶回波數(shù)據(jù)用于目標的成像測量。寬帶數(shù)據(jù)采樣率為1.6 Gsps,量化位數(shù)32 bit,數(shù)據(jù)波門占雷達周期的35%。故寬帶數(shù)據(jù)的數(shù)據(jù)率可達1.6 Gsps×32/8×0.35 = 2.24 Gsps。
為了滿足數(shù)據(jù)的高速記錄,本文的硬件平臺如圖1所示。硬件板卡與主板CPU之間通過PCIe協(xié)議進行通信,采用PCIe 8×2.0接口[5],傳輸速率最高可達3.0 GB/s。存儲介質(zhì)為磁盤陣列,以實現(xiàn)數(shù)據(jù)的高速存儲。寬帶模擬回波經(jīng)過ADC采集形成高速數(shù)據(jù)流,在硬件FPGA的控制下,通過PCIe總線傳輸至主機內(nèi)存,最后存儲在磁盤陣列中。
磁盤陣列的測速結(jié)果圖如圖2所示。磁盤陣列讀寫速度可達2.4 GB/s,因此,硬件平臺的數(shù)據(jù)傳輸和存儲性能滿足寬帶數(shù)據(jù)的高速記錄需求。
圖1 采集記錄系統(tǒng)架構(gòu)
圖2 磁盤陣列測速結(jié)果
數(shù)據(jù)傳輸方式可分為3種:輪詢、中斷和直接內(nèi)存存取(Direct Memory Access,DMA)。其中,輪詢機制會大量消耗CPU處理時間,中斷機制相比于輪詢機制在消耗CPU處理時間上有所改善,但仍會給CPU造成大量的中斷負載[6-7]。
相比于前兩種數(shù)據(jù)傳輸機制,DMA是一種不依賴CPU實現(xiàn)內(nèi)存與外部設(shè)備之間數(shù)據(jù)轉(zhuǎn)移的傳輸機制。在DMA模式下,CPU只需向DMA控制器發(fā)送指令,由DMA控制器數(shù)據(jù)傳輸,數(shù)據(jù)傳送完畢再把信息反饋給CPU,在很大程度上減輕了CPU的資源占有率,大幅節(jié)省了系統(tǒng)資源[8]。因此,本文采用DMA機制進行高速數(shù)據(jù)流傳輸。
DMA傳輸需要上位機軟件與硬件FPGA之間不斷進行交互才能完成。然而,處于用戶層的上位機軟件無法直接訪問硬件層。所有的硬件板卡通過PCIe總線與主板相連,故需要開發(fā)基于PCIe總線的設(shè)備驅(qū)動程序?qū)崿F(xiàn)上位機軟件與硬件之間的通信。
本文采用WinDriver進行PCIe設(shè)備驅(qū)動程序開發(fā)。WinDriver是一款使用簡單、方便地驅(qū)動開發(fā)軟件,利用WinDriver開發(fā)驅(qū)動程序無需程序員熟悉操作系統(tǒng)的內(nèi)核,整個驅(qū)動程序工作在用戶態(tài)下,可以大幅加速設(shè)備驅(qū)動程序的開發(fā)[9-10]。
WinDriver的驅(qū)動程序框架如圖3所示。驅(qū)動程序首先對硬件設(shè)備進行初始化,打開WinDriver的內(nèi)核模塊,初始化WDC函數(shù)庫。根據(jù)指定的DeviceID和VendorID,掃描該硬件板卡并返回設(shè)備信息,最后打開該PCIe設(shè)備,并返回設(shè)備句柄。設(shè)備初始化后,將相應(yīng)的API函數(shù)加入PCIe驅(qū)動程序代碼中,可以實現(xiàn)存儲器訪問、配置寄存器訪問、I/O訪問、DMA數(shù)據(jù)傳輸、硬件中斷等功能[11]。
圖3 WinDriver驅(qū)動程序框架
每一次DMA數(shù)據(jù)傳輸過程,上位機軟件都需要向硬件配置所需的信息。DMA數(shù)據(jù)傳輸操作流程如圖4所示,過程如下[12-13]:
圖4 DMA數(shù)據(jù)傳輸流程圖
(1)第一次DMA傳輸,清空FPGA緩存,保證本次傳輸數(shù)據(jù)為最新數(shù)據(jù);
(2)復(fù)位與DMA傳輸相關(guān)的控制/狀態(tài)寄存器,初始化DMA操作;
(3)設(shè)置本次DMA需要發(fā)送TLP包的數(shù)量和載荷數(shù),并設(shè)置DMA寫地址;
(4)收到DMA寫啟動命令后,F(xiàn)PGA根據(jù)上一步設(shè)置的DMA數(shù)量大小組裝TLP包,然后發(fā)送到上一步指定的地址中,并將該地址中的數(shù)據(jù)映射到上位機的一個緩存區(qū)中;
(5)DMA傳輸完成時,F(xiàn)PGA的DMA完成狀態(tài)位(DMA_Done)有效,DMA傳輸完成,上位機通過輪詢或硬件中斷的方式獲取該標志位,以進行后續(xù)操作;
(6)重復(fù)步驟(2),啟動下一次DMA。
基于上述操作,可實現(xiàn)硬件FPGA到主板的高速數(shù)據(jù)流持續(xù)傳輸。
采用乒乓緩存機制,可提升PCIe總線帶寬的利用率。傳統(tǒng)數(shù)據(jù)傳輸方法采用一個設(shè)備對應(yīng)一個傳輸通路,如圖5所示,每開啟一次數(shù)據(jù)傳輸,主機得到DMA傳輸完成響應(yīng)后,對緩存中的數(shù)據(jù)進行后續(xù)處理,之后循環(huán)往復(fù)。該方案在進行主機內(nèi)存數(shù)據(jù)拷貝或者直接存儲的這段時間,PCIe總線一直處于空閑狀態(tài),故該方案對PCIe總線帶寬的利用率低。乒乓緩存則采用并行流水線的思想,傳輸?shù)臄?shù)據(jù)流按節(jié)拍、相互配合的切換,完成數(shù)據(jù)的無縫傳輸與處理[14]。如圖6所示,一個設(shè)備對應(yīng)兩個傳輸通路,在開啟一個通路進行數(shù)據(jù)傳輸時,對另一條通路對應(yīng)的緩存數(shù)據(jù)進行后續(xù)處理。如此便減少了PCIe總線的空閑時間,提高了總線的利用率,同時也提高了數(shù)據(jù)傳輸?shù)乃俾省?/p>
圖5 傳統(tǒng)傳輸機制示意圖
圖6 乒乓傳輸機制示意圖
基于乒乓緩存機制的DMA數(shù)據(jù)傳輸最大限度的利用了PCIe總線的帶寬,可以實現(xiàn)高速數(shù)據(jù)流的有效傳輸,為高速數(shù)據(jù)存儲提供保障。
DMA傳輸完畢后,緩存區(qū)的數(shù)據(jù)有兩種存儲方式:直接存儲和分開存儲[15]。直接存儲的示意圖如圖7所示。直接存儲涉及頻繁的磁盤I/O操作,其直接影響數(shù)據(jù)傳輸效率,在數(shù)據(jù)高速持續(xù)記錄過程中極易導(dǎo)致FPGA緩存區(qū)變滿,造成數(shù)據(jù)丟失。硬件FPGA模擬寬帶直采數(shù)據(jù)率發(fā)送遞增自然數(shù),圖8和圖9分別顯示實時數(shù)據(jù)存儲速率和數(shù)據(jù)校驗結(jié)果,結(jié)果表明,直接存儲方案數(shù)據(jù)存儲速率僅能達到約300 MB/s,F(xiàn)PGA緩存很快變滿,校驗數(shù)據(jù)表明存儲數(shù)據(jù)不是嚴格的遞增自然數(shù)。故直接存儲方案無法滿足高速數(shù)據(jù)記錄需求。
圖7 緩存區(qū)數(shù)據(jù)直接存儲示意圖
圖8 緩存區(qū)數(shù)據(jù)直接存儲結(jié)果圖
圖9 緩存區(qū)數(shù)據(jù)直接存儲數(shù)據(jù)校驗結(jié)果
分開存儲是指DMA數(shù)據(jù)傳輸完成后,對數(shù)據(jù)進行拷貝再存儲,保證傳輸過程不受影響。為此,本文采用多線程技術(shù),設(shè)計了一種高速數(shù)據(jù)記錄的軟件架構(gòu),如圖10所示。軟件采用3個線程分別用于數(shù)據(jù)傳輸、拷貝和存儲,傳輸線程通知拷貝線程復(fù)制緩存區(qū)數(shù)據(jù),拷貝數(shù)據(jù)進入數(shù)據(jù)隊列,存儲線程再將隊列內(nèi)數(shù)據(jù)依次存儲。
圖10 數(shù)據(jù)記錄軟件架構(gòu)
高速數(shù)據(jù)流在記錄過程中必然涉及頻繁的內(nèi)存申請,一般的動態(tài)內(nèi)存申請采用new、malloc等API實現(xiàn),然而,它存在以下幾個缺點[16]:
(1)在堆上頻繁申請/釋放內(nèi)存,系統(tǒng)需要需要查找/合并空閑內(nèi)存塊,會產(chǎn)生額外開銷,降低系統(tǒng)效率;
(2)在堆上頻繁申請/釋放內(nèi)存,會產(chǎn)生大量內(nèi)存碎片,降低內(nèi)存利用率;
(3)容易造成內(nèi)存泄漏;
(4)內(nèi)存分配頻繁時,有可能出現(xiàn)內(nèi)存申請失敗的情況。
動態(tài)內(nèi)存申請實現(xiàn)高速數(shù)據(jù)流記錄結(jié)果如圖11和圖12所示。該方案提高了數(shù)據(jù)存儲速度,但頻繁的內(nèi)存申請加大了系統(tǒng)開銷,導(dǎo)致拷貝線程效率較低。數(shù)據(jù)校驗結(jié)果不是嚴格的遞增自然數(shù),故動態(tài)內(nèi)存申請仍然無法滿足高速數(shù)據(jù)記錄需求。
圖11 動態(tài)內(nèi)存申請存儲結(jié)果圖
圖12 動態(tài)內(nèi)存申請存儲數(shù)據(jù)校驗結(jié)果
基于上述問題,本文提出了一種基于內(nèi)存池技術(shù)實現(xiàn)數(shù)據(jù)高速存儲的實現(xiàn)方案。
內(nèi)存池是一種內(nèi)存分配方法,它大幅加快了申請/釋放內(nèi)存的速度。采用內(nèi)存池技術(shù)可有效避免操作系統(tǒng)級內(nèi)存碎片化問題,使得內(nèi)存分配效率得到提高。
內(nèi)存池的形成一般為一次性申請大量大小相同的小塊內(nèi)存。需要申請內(nèi)存時在內(nèi)存池中獲取內(nèi)存塊,內(nèi)存使用完畢再將內(nèi)存塊歸還到內(nèi)存池中。為了保證線程在O(1)時間內(nèi)獲取內(nèi)存塊,本文采用鏈表實現(xiàn)內(nèi)存池管理,鏈表的單元節(jié)點為一個內(nèi)存塊,內(nèi)存塊采用結(jié)構(gòu)體維護,該結(jié)構(gòu)體如圖13所示。
圖13 內(nèi)存池的內(nèi)存塊單元
內(nèi)存池結(jié)構(gòu)示意圖如圖14所示,所有內(nèi)存塊單元采用鏈表結(jié)構(gòu)相連。鏈表節(jié)點數(shù)量上限固定。程序申請內(nèi)存時,若鏈表不為空,從鏈表頭部取走內(nèi)存塊,否則動態(tài)申請內(nèi)存塊。釋放內(nèi)存時,若當前鏈表長度達到上限,直接釋放內(nèi)存塊,否則將內(nèi)存塊置于鏈表頭部。基于內(nèi)存池實現(xiàn)高速數(shù)據(jù)持續(xù)記錄的示意圖如圖15所示。
圖14 內(nèi)存池結(jié)構(gòu)示意圖
圖15 內(nèi)存池實現(xiàn)數(shù)據(jù)存儲示意圖
本文采用實時數(shù)據(jù)存儲速率觀測、硬件模擬雷達時序產(chǎn)生遞增自然數(shù)、對實測數(shù)據(jù)進行數(shù)據(jù)回放驗證高速數(shù)據(jù)記錄軟件設(shè)計的可靠性。圖16和圖17表示硬件模擬雷達時序產(chǎn)生數(shù)據(jù)率為2.24 GB/s左右的遞增自然數(shù),數(shù)據(jù)實時存儲的速率以及校驗結(jié)果。結(jié)果
表明,系統(tǒng)的存儲速率基本穩(wěn)定在約2.24 GB/s,對存儲的數(shù)據(jù)文件進行校驗,存儲數(shù)據(jù)為嚴格的遞增自然數(shù),保證了數(shù)據(jù)記錄的正確性。圖18表示系統(tǒng)在實測模式下,存儲的數(shù)據(jù)經(jīng)過回放后的波形圖和脈壓結(jié)果。結(jié)果表明,采集記錄的寬帶目標在模擬靜止狀態(tài)下的點目標時,對寬帶數(shù)據(jù)進行脈沖壓縮后可以清晰的顯示寬帶數(shù)據(jù)的一維距離像,該距離像的位置保持不變(說明目標為靜止狀態(tài)),證明了系統(tǒng)記錄到所需的目標回波,驗證了數(shù)據(jù)記錄的可靠性。
圖16 寬帶數(shù)據(jù)實時記錄速率
圖17 寬帶數(shù)據(jù)模擬遞增自然數(shù)校驗結(jié)果
圖18 模擬點目標直采數(shù)據(jù)時域圖和脈壓結(jié)果
本文從工程實踐出發(fā),設(shè)計了一種合理的軟件架構(gòu),提出基于DMA數(shù)據(jù)傳輸機制、乒乓緩存機制和內(nèi)存池技術(shù)相結(jié)合的方案實現(xiàn)高速數(shù)據(jù)流的記錄。實驗結(jié)果表明,在硬件平臺性能滿足需求的條件,本文設(shè)計的軟件平臺方案能夠滿足系統(tǒng)需求,平臺工作穩(wěn)定可靠,實測數(shù)據(jù)經(jīng)過事后回放能夠顯示出正確波形,驗證了該方案的可行性。