王煊
(中國空空導(dǎo)彈研究院 河南 洛陽 471009)
首先,本文詳細探討了基于VxWorks的PXI板卡驅(qū)動程序的開發(fā),總結(jié)出PXI驅(qū)動開發(fā)的具體流程,闡述了驅(qū)動程序中各功能模塊的實現(xiàn)方法和技術(shù)要點,完成了BMK卡在VxWorks系統(tǒng)下的驅(qū)動程序開發(fā)與調(diào)試工作,尤其是DMA數(shù)據(jù)傳輸部分的實現(xiàn),填補了國防型號測試系統(tǒng)中的空白,滿足了研制的急需性。其次,論文重點說明了系統(tǒng)應(yīng)用程序的設(shè)計,實現(xiàn)了VxWorks端與Windows端跨平臺的通信,分別詳細說明了客戶端和服務(wù)端的網(wǎng)絡(luò)通信程序的設(shè)計與實現(xiàn),為嵌入式軟件的遠程控制奠定了基礎(chǔ)。最后給出了接口函數(shù)的列表,完成了整個系統(tǒng)的設(shè)計。
基于PXI總線的BMK卡是空空導(dǎo)彈測試系統(tǒng)的重要組成部分,在遙測接收計算機上發(fā)揮重要作用。遙測計算機包括:6槽PXI機箱,PXI嵌入式控制器——PXI3800以及相應(yīng)的PXI總線接口功能子單元和信號調(diào)理硬件。整體結(jié)構(gòu)如圖1。
本文所涉及的BMK卡測試系統(tǒng)是在VxWorks實時控制系統(tǒng)下設(shè)計的BMK的驅(qū)動,實時性較好,為微秒級,對研發(fā)高實時性系統(tǒng)奠定重要基礎(chǔ)。此外在Windows系統(tǒng)下實現(xiàn)了用戶界面的開發(fā),人機交互界面良好。結(jié)構(gòu)圖如圖2。
圖1 遙測接收計算機框架圖Fig.1 The telemetry receiving computer framework figure
圖2 BMK卡測試程序結(jié)構(gòu)圖Fig.2 BMK card test program design chart
VxWorks系統(tǒng)中輸入輸出設(shè)備宏觀上被分為3種類型:字符設(shè)備、塊設(shè)備和網(wǎng)絡(luò)設(shè)備[2]。這種分類方法是根據(jù)硬件本身的特性來決定的。依照設(shè)備類型,VxWorks下設(shè)備驅(qū)動程序的管理也被分為3種模塊:字符設(shè)備驅(qū)動程序模塊、塊設(shè)備驅(qū)動程序模塊、網(wǎng)絡(luò)設(shè)備驅(qū)動程序模塊。每個模塊對應(yīng)一種設(shè)備類型,而每個模塊中不同的設(shè)備包含的功能不一樣。用戶可以根據(jù)自己的需要在VxWorks下,創(chuàng)建不同的模塊。
BMK卡為PXI設(shè)備,屬于網(wǎng)絡(luò)設(shè)備,其驅(qū)動程序應(yīng)創(chuàng)建為網(wǎng)路設(shè)備驅(qū)動程序。
系統(tǒng)加電以后,加載VxWorks映像。然后處理器跳到加載映像的地址即 sysInit()的首地址開始執(zhí)行,sysInit()完成最初的硬件初始化工作。再調(diào)用第二個子程序UserInit()來關(guān)閉所有硬件中斷[5]。 其中 UserInit()的子程序 sysHInit()將硬件處于初始的安靜狀態(tài),此時VxWorks系統(tǒng)內(nèi)核還沒有被激活,內(nèi)存也沒有被初始化。
主要工作如下:在config.h中定義INCLUDE_PCI,設(shè)置PCI_CFG_TYPE為PCI_CFG_NONE讓BIOS來完成硬件資源配置;sysHWInit()做動態(tài)配置調(diào)用 sysPlx9054PciInit()查找設(shè)備和動態(tài)配置設(shè)備[1]。
2)重視項目化的過程考核。傳統(tǒng)的高職大學(xué)英語課堂上,學(xué)生普遍認為只要期末根據(jù)教師所給定的復(fù)習(xí)重點臨時抱抱佛腳,就能應(yīng)付期末考試。而對于英語學(xué)習(xí)來說,在期末英語考試中,考試內(nèi)容只有一小部分的聽力考試,其余都是筆試,不能全面反映學(xué)生在一個學(xué)期內(nèi)的學(xué)習(xí)成果。因此,在英語考試方面應(yīng)當增加考試內(nèi)容,將學(xué)習(xí)的過程納入英語期末考評中,增加其占考評的比重。在核心素養(yǎng)培養(yǎng)下的英語課程考核應(yīng)當包括對學(xué)生語言能力、學(xué)習(xí)能力、思維能力和文化意識方面的考核。
PXI3800的BSP對專門的PCI設(shè)備提供了支持,BMKCardInit()函數(shù)就是通過調(diào)用這些庫函數(shù)來完成硬件搜索和資源配置功能的。
對于中斷,首先要進行中斷掛接,其次進行中斷處理模塊。
中斷掛接是在系統(tǒng)內(nèi)核被激活后才被調(diào)用的,其主要工作是初始化DMA相關(guān)寄存器,為進行DMA操作做準備;掛接中斷,將中斷向量和中斷服務(wù)程序相關(guān)聯(lián),并使能中斷;創(chuàng)建互斥信號量,用于建立驅(qū)動程序和應(yīng)用程序之間的特殊通信[3]。
一般情況PCI設(shè)備會共享中斷,所以掛接要使用pciIntConnect來將所有共享中斷的中斷服務(wù)程序組成一個函數(shù)鏈,這樣每次發(fā)生中斷都會將這個鏈調(diào)用一遍,從而實現(xiàn)中斷共享。
接收中斷后進入中斷處理模塊。中斷處理模塊的主要工作是中斷到來時判斷是否為自己控制的設(shè)備發(fā)生的中斷,是則繼續(xù)處理,否則立即返回,交由其他中斷服務(wù)程序處理。若為DMA0通道產(chǎn)生的中斷,則釋放互斥信號量通知應(yīng)用程序處理剛通過DMA方式存入內(nèi)存的數(shù)據(jù);最后清中斷。
由于所有的中斷服務(wù)例程共享一個堆棧,沒有任務(wù)控制模塊,所以,在中斷服務(wù)程序中不能使用可導(dǎo)致阻塞的函數(shù),如 printf()、semTake()等。 另外,中斷服務(wù)程序不允許使用浮點協(xié)處理器的函數(shù),因為在 VxWorks中,intConnect()建立的中斷服務(wù)程序不能保存并回復(fù)浮點寄存器,如果一定要在中斷服務(wù)程序中使用浮點運算的話,必須使用fppArchLib庫中的函數(shù)顯式的保存和恢復(fù)浮點協(xié)處理器寄存器。
在VxWorks的BSP完成了網(wǎng)口的底層驅(qū)動和TCP/IP層上的協(xié)議加載后,用戶程序需要的就是在TCP/IP層上進行網(wǎng)絡(luò)通信。在本系統(tǒng)中,采用的是服務(wù)器 (server)和客戶端(client)的通信方式。其實現(xiàn)過程如圖3所示。
圖3 服務(wù)器端與客戶端的建立Fig.3 Socket connecting between server and client
在服務(wù)器端,在Tornado2.2中利用VxWorks對socket的支持,其通信程序如下[4]:
1)創(chuàng)建套接字。創(chuàng)建 socket是利用函數(shù) socket(AF_INET,SOCK_STREAM,0), 其 中 ,AF_INET 指 定 通 信 域 為TCP/IP協(xié)議簇,SOCK_STREAM是全雙工的字節(jié)流。Socket調(diào)用成功后返回一個套接字描述符,接著對服務(wù)器地址等數(shù)據(jù)結(jié)構(gòu)初始化并對字節(jié)順序進行初始化。
2)bind (listenSkt, (struct sockaddr*) &serverAddr, sock AddrSize),將套接字口和端口號綁定在一起。
3)監(jiān)聽。函數(shù) listen (listenSkt, 5)將在 listenSkt套接字指定的端口上開始監(jiān)聽,等待客戶的連接請求。
4)建立連接。 函數(shù) accept(listenSkt, (struct sockaddr*)(&clientAddr),&sockAddrSize)接收客戶機的連接請求并為此建立一個連接。函數(shù)accept返回一個新的套接字描述符commuSkt來供連接使用,服務(wù)器可以在以前的socket上繼續(xù)監(jiān)聽。
5)關(guān)閉連接。用函數(shù)close()來關(guān)閉一個套接字描述符。
6)發(fā)送和接收數(shù)據(jù)。函數(shù)send()用于從發(fā)送緩沖區(qū)讀取指定字節(jié)長度的數(shù)據(jù)來發(fā)送。函數(shù)recv()從接收緩沖區(qū)接收指定字節(jié)長度的數(shù)據(jù)。
整個程序的運行,需要多任務(wù)的支持。在多任務(wù)操作系統(tǒng)VxWorks下,任務(wù)由唯一的ID來標識,并且對應(yīng)某一個特定的任務(wù)名,系統(tǒng)支持256個優(yōu)先級。在默認情況下,0為最高優(yōu)先級,255為最低優(yōu)先級。每個任務(wù)都有自己的狀態(tài),是下面一種或幾種的組合狀態(tài):excute(正在執(zhí)行),ready(就緒狀態(tài)),pended(阻塞狀態(tài)),delayed(延遲狀態(tài)),suspended(掛起狀態(tài))。本系統(tǒng)中采用了默認的優(yōu)先級搶占調(diào)度策略。
Windows端通信程序是基于Windows socket的,windows socket定義了一套Microsoft Windows下網(wǎng)絡(luò)編程接口。它提供了針對Windows的擴展函數(shù)庫,使程序員可以充分的利用Windows消息驅(qū)動機制進行編程。
Windows socket通信的基礎(chǔ)是套接字 (socket)。 利用socket進行通信,主要有兩種方式。第一種是有連接的流方式,即需要在兩個通信的應(yīng)用程序之間建立一條連接鏈路。必須在兩端確定通路后,數(shù)據(jù)才能被正確接收和發(fā)送。第二種是無連接的數(shù)據(jù)報文方式,這時通信的兩臺計算機把數(shù)據(jù)通過網(wǎng)絡(luò)郵寄給對方,數(shù)據(jù)在傳送過程中有可能會殘缺,也有可能接收順序與發(fā)出時順序不同,這種方式支持雙向的數(shù)據(jù)流,但并不保證數(shù)據(jù)的可靠、有序、無重復(fù)性。在本系統(tǒng)中采用的是有連接的流方式,用的是客戶機/服務(wù)器模型。
對于VxWorks端來說,Windows屬于客戶機,客戶機的界面用MFC進行編寫,通過界面向服務(wù)器請求服務(wù),并通過一套協(xié)議保證服務(wù)可以被提供或者接收,該協(xié)議需要被客戶機和服務(wù)器所接受。在MFC中為套接字提供了類CAsyncSocket和 CSocket,由于CAsyncSocket不需要多線程,使用簡單,雖然CAsyncSocket的發(fā)送和接收受到TCP/IP緩沖大小的限制,但是Windows作為上層界面控制的時候,數(shù)據(jù)量并不大,所以在本系統(tǒng)中采用CAsyncSocket類庫中的函數(shù)。
創(chuàng)建函數(shù):BOOL Create(UINT nSocketPort=0,int nSocketType=SOCK_STREAM,long lEvent=FD_READ|FD_WRITE|FD_OOB|FD_ACCEPT|FD_CONNECT|FD_CLOSE,LPCTSTR lpszSocketAddress=NULL)
關(guān) 聯(lián) 函 數(shù) :BOOL Bind ( UINT nSocketPort, LPCTSTR lpszSocketAddress=NULL)
客戶套接字連接函數(shù):BOOL Connect(LPCTSTR lpszHostAddress, UINT nHostPort)
接口函數(shù)包括發(fā)送例程和接收例程。
發(fā)送例程的設(shè)計分為以下幾步:
1)應(yīng)用程序把要發(fā)送的數(shù)據(jù)的緩沖區(qū)首指針和發(fā)送要求傳遞給驅(qū)動程序,發(fā)送要求包括通道號,發(fā)送方式,發(fā)送個數(shù)。
2)驅(qū)動程序?qū)l(fā)送要求寫入對應(yīng)的寄存器地址。寫發(fā)送命令字,然后請求獲得該發(fā)送通道以及發(fā)送方式對應(yīng)的發(fā)送緩沖區(qū)的信號量。若信號量獲得成功,驅(qū)動程序就把將要發(fā)送的數(shù)據(jù)通過DMA傳輸?shù)姆绞綄懭氚l(fā)送緩沖區(qū);若信號量獲得不成功,多請求幾次,超過一次次數(shù)后函數(shù)返回,發(fā)送失敗。對于單次發(fā)送的方式必須首先查詢一個特定的標志位,該標志位表示的是發(fā)送是否準備好,只有查詢到該標志位為0,才可以進行后面的操作。
相對于發(fā)送例程來說,接收例程要復(fù)雜一些[6]。
圖4 接收例程流程圖Fig.4 Receive routine flowchart
這里涉及到了兩個任務(wù)的同步以及任務(wù)間的通信,采用了信號量的方式進行處理。VxWorks為信號量做了很好的優(yōu)化,為任務(wù)間通信提供了最快捷的方式。信號量是互斥和任務(wù)同步的主要實現(xiàn)手段。
二進制信號量是速度最快、真正意義上的信號量。VxWorks專門為任務(wù)同步和互斥優(yōu)化了這種信號量,這種信號量相當于總數(shù)為1的計數(shù)型信號量,也可以理解成一種開關(guān)。一個信號量只有唯一的任務(wù)可以獲得,當一個任務(wù)釋放信號量之后,其他的任務(wù)才可以重新獲得這個信號量。
BMK的接口函數(shù)如下:
表1 BMK通信卡接口函數(shù)表Tab.1 BMK card interface functions list
本文設(shè)計了基于PXI總線的BMK卡的軟件測試程序,該程序結(jié)構(gòu)緊湊,功能齊全,并且在實時性系統(tǒng)VxWorks的操作下,確保了數(shù)據(jù)處理的迅速準確。該板卡工作穩(wěn)定,可以實現(xiàn)收發(fā)數(shù)據(jù),尤其在DMA傳輸過程中,保證了大量數(shù)據(jù)發(fā)送的及時性,適用于高實時性要求的系統(tǒng)。在國防中可以發(fā)揮重要作用。
[1]9054 Data Book Version 2.1,PCI 9054 Data Book[S].U.S:PLX,2000.
[2]Barbalance A.Performance Comparison of VxWorks, Linux,RTAI and Xenomai in a Hard Realctime Application[C]//Real-Time Conference,2007.
[3]卞紅雨,曹明明.VxWorks下 PCI總線設(shè)備驅(qū)動程序設(shè)計[J].聲學(xué)與電子工程,2005(3):42-45.
BIAN Hong-yu,CAO Ming-ming.PCI device driver design on VxWorks[J].Acoustics and Electronics Engineering,2005(3):42-45.
[4]程敬原.VxWorks軟件開發(fā)項目實例[M].北京:中國電力出版社,2005:24-64.
[5]CHENG Jing-yuan,AN Qi,YANG Jun-feng.Algorithm design ofCPCIbackboard’sinterruptsmanagementbased on VxWorks’ multi-tasks[J].Plasma Science and Technology,2006,V8(5):614-617.
[6]孔祥營,柏桂枝.嵌入式實時操作系統(tǒng)VxWorks及其開發(fā)環(huán)境Tornado[M].北京:中國電力出版社,2002:114-116.