摘 要:主要介紹了應(yīng)用于航管雷達中的一種雷達數(shù)據(jù)傳輸模塊的設(shè)計方法。在Linux系統(tǒng)中運用CPCI總線設(shè)備的DMA傳輸能力,在模塊設(shè)計中采用中斷的底半部處理機制和讀寫請求的等待隊列機制,實現(xiàn)了對高頻大量數(shù)據(jù)的實時、可靠、高速傳輸。模塊運行在系統(tǒng)內(nèi)核層,通過系統(tǒng)調(diào)用向雷達數(shù)據(jù)處理軟件提供讀、寫和控制等函數(shù)功能。
關(guān)鍵詞:Linux;CPCI;DMA;底半部;等待隊列
中圖分類號:TP274
在航管雷達中,信號處理向數(shù)據(jù)處理實時發(fā)送大量的雷達目標(biāo)數(shù)據(jù)。而數(shù)據(jù)處理需要完成大量的運算工作。如何既保證運算任務(wù)實時完成,又實現(xiàn)數(shù)據(jù)快速穩(wěn)定的傳輸,是迫切需要解決的問題。存儲器直接存取是一種允許外圍設(shè)備直接從內(nèi)存存取數(shù)據(jù)而無需CPU全程參與的硬件機制,常用在需要高速大批量數(shù)據(jù)傳輸?shù)南到y(tǒng)中[1]。緊湊型外設(shè)組件互連標(biāo)準(zhǔn)總線是基于標(biāo)準(zhǔn)的PCI電氣規(guī)范上的一個高性能總線,是一種新的開放式工業(yè)計算機標(biāo)準(zhǔn),其可靠性優(yōu)于PCI總線。與PCI總線一樣,它能夠被Linux系統(tǒng)支持、不依賴于處理器架構(gòu)、支持總線控制技術(shù)。
1 模塊設(shè)計
數(shù)據(jù)傳輸模塊嵌入Linux內(nèi)核,通過系統(tǒng)標(biāo)準(zhǔn)接口向用戶層數(shù)據(jù)處理軟件提供接口函數(shù),包括讀、寫和控制設(shè)備等功能。在Linux系統(tǒng)中CPCI設(shè)備被歸類為字符設(shè)備,因此它具有PCI設(shè)備和字符設(shè)備的特性,在設(shè)計設(shè)備的數(shù)據(jù)結(jié)構(gòu)時應(yīng)包含PCI設(shè)備結(jié)構(gòu)體和字符設(shè)備結(jié)構(gòu)體
2 模塊實現(xiàn)
2.1 CPCI設(shè)備的加載與卸載
CPCI驅(qū)動程序通過創(chuàng)建struct pci_driver結(jié)構(gòu)體進行注冊,向PCI核心描述CPCI驅(qū)動程序。在模塊的入口函數(shù)static int__init cpcidev_init(void)中,使用函數(shù)pci_register_driver,向系統(tǒng)注冊上述結(jié)構(gòu)體。設(shè)備的實際加載過程在函數(shù)cpcidev_probe中進行,該函數(shù)按照設(shè)備列表cpcidev_pci_tbl中所列設(shè)備進行逐個檢測和初始化。
2.2 中斷處理
信號處理將雷達掃描周期等分為64個扇區(qū)。每接收一次數(shù)據(jù)包都將產(chǎn)生中斷。頻繁的中斷、耗時的數(shù)據(jù)包拷貝操作,如果在中斷處理中完成所有工作,將造成中斷的丟失。
Linux將中斷處理程序分解成兩個半部:頂半部(top half)和底半部(bottom half)[2]。底半部機制包括:軟中斷(Softirq)、Tasklet、工作隊列(Work queues)。本文采用工作隊列機制實現(xiàn)底半部工作。在設(shè)備結(jié)構(gòu)體中已經(jīng)定義了工作隊列結(jié)構(gòu)體struct work_struct bh_task,設(shè)備初始化時通過函數(shù)INIT_WORK()初始化工作隊列并與底半部處理函數(shù)void bh_handler(unsigned long)掛接。在中斷處理頂半部中,對中斷進行類型判斷、關(guān)閉該類型中斷允許位、釋放該類型中斷的信號量、調(diào)度工作隊列。其它工作在中斷底半部完成。中斷的頂半部和底半部處理流程如圖1和圖2所示。
2.3 接口函數(shù)
設(shè)備的接口函數(shù)在注冊字符設(shè)備時與設(shè)備掛接,為數(shù)據(jù)處理軟件提供與設(shè)備進行交互的各功能接口,主要完成對設(shè)備的讀、寫和控制等訪問功能。
在設(shè)備讀、寫函數(shù)中,實現(xiàn)數(shù)據(jù)處理軟件對設(shè)備的阻塞式操作。非阻塞操作的進程在不能進行設(shè)備操作。如果不阻塞,則用戶想獲取設(shè)備資源只能不停地查詢,這會無謂地耗費CPU資源;而阻塞訪問時,不能獲取資源的進程將進入休眠,它將CPU資源“禮讓”給其他進程。
在Linux系統(tǒng)中,可以采用等待隊列來實現(xiàn)阻塞進程的喚醒[3]。wait queue以隊列為基礎(chǔ)數(shù)據(jù)結(jié)構(gòu),與進程調(diào)度機制緊密結(jié)合,用于實現(xiàn)內(nèi)核中的異步事件通知機制,用來同步對系統(tǒng)資源的訪問。
數(shù)據(jù)傳輸模塊提供這樣的能力:當(dāng)數(shù)據(jù)處理進行read、write等系統(tǒng)調(diào)用時,若設(shè)備的接收緩區(qū)為空或者發(fā)送緩區(qū)未空,模塊在函數(shù)cpcidev_read、cpcidev_write中將進程阻塞直到接收緩區(qū)不空或發(fā)送緩區(qū)為空,數(shù)據(jù)處理的read、write等調(diào)用成功才返回。
在設(shè)備控制函數(shù)cpcidev_ioctl中,主要完成對信號處理的控制和狀態(tài)的獲取。
3 結(jié)束語
高效、穩(wěn)定的雷達數(shù)據(jù)傳輸通道對于發(fā)揮雷達數(shù)據(jù)處理的精確、快速跟蹤能力至關(guān)重要。本文在Linux系統(tǒng)下采用CPCI總線配合DMA技術(shù)設(shè)計雷達數(shù)據(jù)傳輸模塊,運用中斷的底半部處理機制和讀寫請求的等待隊列機制,實現(xiàn)了高頻高速大數(shù)據(jù)量傳輸功能。利用內(nèi)核封裝傳輸處理過程,向數(shù)據(jù)處理軟件提供了與系統(tǒng)一致的接口函數(shù),調(diào)用簡單方便。該數(shù)據(jù)傳輸模塊已應(yīng)用于某航管雷達,工程實踐表明,模塊能夠滿足實際的數(shù)據(jù)傳輸需求,并且運行可靠。
參考文獻:
[1]譚欽紅,張際生,李文杰.Linux系統(tǒng)中PCI設(shè)備DMA數(shù)據(jù)傳輸?shù)膶崿F(xiàn)[J].重慶郵電大學(xué)學(xué)報(自然科學(xué)版),2012(24).
[2]熊安萍,韓松,蔣溢.優(yōu)化Linux網(wǎng)絡(luò)處理性能的軟中斷處理機制[J].計算機應(yīng)用,2010(01).
[3]陳學(xué)松.深入Linux設(shè)備驅(qū)動程序內(nèi)核機制[M].北京:電子工業(yè)出版社.
[4]宋寶華.Linux設(shè)備驅(qū)動開發(fā)詳解(第2版)[M].北京:人民郵電出版社.
作者單位:中國電子科技集團 第38研究所,合肥 230088