王景剛 鄧如玉 楊小平
(1、哈爾濱工程大學自動化學院,黑龍江 哈爾濱150001 2、哈爾濱工程大學自動化學院,黑龍江 哈爾濱150001 3、武昌造船廠,湖北 武漢430060)
VxWorks是一個具有微內核、可裁剪的高性能強實時操作系統,它以其良好的可靠性和卓越的實時性被廣泛地應用在通信、軍事、航空、航天等高精尖技術及實時性要求極高的領域中。我校研制的綜合導航顯控臺采用VxWorks操作系統,它作為船舶導航系統的核心設備實時為指揮系統、駕控系統等提供各種信息。當需要更改海圖模塊硬盤中一些及時需要修改的數據、程序等信息時,為避免拆卸設備,可以通過網絡傳輸來解決上述問題。本文以Intel82557網卡為例,提出了基于VxWorks的網絡設備驅動程序的開發方法和實現流程。
VxWorks提供了與其他TCP/IP網絡系統間"透明"的存取方式、BSD Socket兼用的編程接口,遠程過程調用(RPC),遠程文件存取等。網絡驅動程序和上層網絡協議棧可以有兩種實現形式:BSD方式和MUX方式。在VxWorks中,MUX與END(增強的網絡驅動程序)合稱SENS驅動(可裁剪增強型網絡驅動)。網卡驅動程序的層次結構使網卡驅動程序的實現和移植更加方便。而且VxWorks為編寫網卡增強型驅動程序(SENS)提供了很好的接口和規范。圖1是VxWorks的網絡系統。


2.1 MUX與END
VxWorks網絡協議棧可以分為以下幾層:應用層、傳輸層、IP層、MUX層、數據鏈路層和物理層。如圖2所示。
從圖2看出,與其他TCP/IP協議相比Vx-Works網絡協議棧增加一層MUX層。MUX層是VxWorks為方便在網絡接口硬件上實現多種協議而增加的一層。它主要用于管理底層的多種硬件的設備驅動,向上層不同協議提供統一的接口,降低了上層協議與底層物理硬件的藕合,使得網絡驅動和上層協議彼此保持獨立,既方便在現有硬件基礎上實現新的上層協議,也利于用新的硬件支持原有的上層協議。
MUX與END的交互是通過提供一套可供底層調用接口服務來實現的,實現END驅動必須遵循這套接口關系。如圖3所示。
圖3中右邊框中列出的函數是驅動需要實現的函數,供MUX層調用在必要的時間調用,如當上層使用該網卡發送數據時,MUX會調用該網卡END驅動提供的Send函數,將數據提交給網卡芯片硬件。
2.2 緩沖池數據結構
網絡設備驅動與上層協議進行數據交換需要相應的內存緩沖,并且管理這些緩沖也需要相應的函數。VxWorks提供了netBufLib函數庫用于創建和管理網絡設備用到的內存緩沖池,網絡設備驅動可以直接使用也可以在此基礎上設計自己特定的內存緩沖池。數據以簇的形式保存,數據結構mBlks(內存塊)和clBlks(簇塊)形成的數據鏈結構則用于指定各個簇。
在clBlk之上是mBlk結構。該結構存儲一個到clBlk的連接,也可以存儲一個到另一個mBlk的連接。通過mBlk的連接,可以引用任意數量的數據,如圖4所示。

3.1 END設備驅動程序裝載過程
END設備驅動程序裝載過程實際上是分三個步驟完成的。即指定END設備、裝載END設備和啟動END設備。
3.1.1 指定END設備
網絡設備的驅動程序安裝時通過修改相應的BSP實現。在修改BSP之前,首先看一下BSP中的END設備驅動程序入口表END_TBL_ENTRY的結構。在BSP的configNet.h文件中定義著END_TBL_ENTRY結構的數組endDevTbl[],其數據結構如下所示。
該數組描述了系統中的所有網絡設備的裝載函數入口點及其相關參數。將網絡設備驅動程序的裝載函數rt8185lEndLoad()入口點及相關參數添加到網絡設備表endDevTbl[]中,而后在config.h中加入"#define INCLUDE_FEI_EN D"以使系統準備初始化MUX并通過MUX裝載網絡設備驅動程序。
在VxWorks網絡驅動程序的編程規范中,為了系統的高移植性、兼容性和可裁剪型等,通常在configNet.h文件中對系統支持的INTEL82557網絡設備定義一些宏,其編寫宏程序如下所示。

3.1.2 裝載及啟動END設備
裝載及啟動END設備的系統函數主要用到以下幾個:
(1).muxDevLoad()
該函數裝載指定設備的驅動程序裝載函數。如果要裝載END設備,系統必須調用muxDevLoad()函數。
(2).muxDevStart()啟動設備函數
(3).muxBind()
muxBind()可以將協議綁定到指定的END設備上。其調用過程是系統調用ipAttach()函數,而該函數調用muxBind()函數,綁定協議堆棧到MUX上的一個指定的網絡接口。當一個網絡接口被關閉時,ipAttach()函數將釋放網絡接口所關聯的TCP/IP堆棧模塊。
裝載及啟動END設備驅動程序的流程如下:
使用指定的END設備驅動程序的BSP引導VxWorks系統時,在引導過程中,系統將執行任務tUsrRoot來完成如下各項:(1)初始化網絡任務的工作隊列;(2)創建tNetTask任務來處理網絡任務工作隊列的條目;(3)調用muxDevLoad()裝載指定的網絡驅動程序;(4)調用muxDevStart()啟動指定的網絡驅動程序。
tUsrRoot任務調用MUX設備裝載函數muxDevLoad()和設備啟動函數muxDevStart(),通過這兩個函數來裝載和啟動設備驅動程序。
muxDevLoad()函數會根據網絡設備表end-DevTbl[]中的定義逐一調用各網絡設備的裝載函數,其中這個函數是muxDevLoad()的一個輸入參數。muxDevStart()函數也會根據endDevTbl[]逐一調用網絡設備所定義的設備開始函數。至此MUX的初始化以及END驅動程序的初始化工作已經完成。但是網絡設備還是不可以使用,因為還需要將協議綁定到指定的END指定的設備上,這一步需要用muxBind()函數實現。
在VxWorks中,系統通過usrRoot()函數調用usrNetInit()函數完成MUX的初始化、裝載網絡設備表endDevTbl[]中描述的所有設備并將IP協議綁定到網絡引導設備上等工作。
網絡設備驅動程序的安裝過程即圖5所示的網絡初始化順序。
3.2 發送數據
在VxWorks網絡系統中,發送數據的流程如圖6。
通過對圖6分析,主要包含以下幾個處理。
(1)用戶調用write()函數,通過套接字訪問網絡。(2)網絡協議拷貝需要發送的數據到網絡緩區中,并調用協議驅動程序的發送程序。(3)協議驅動程序調用muxSend()啟動發送循環。(4)muxSend()通過調用send()回調函數,把緩沖區傳遞給END。(5)數據發送程序把數據拷貝到設備緩沖區中,并把它放置到設備的發送隊列中。(6)當產生發送中斷時,驅動程序的中斷服務程序調度程序丟棄已發送的數據包,徹底清理發送隊列。
3.3 接收數據

在VxWorks網絡系統中,接收數據的流程如圖7。
通過對圖7進行分析,它主要包含以下幾個處理。(1)設備接收到數據包后直接把數據存放到預先分配的簇中。(2)當接收到中斷時,驅動程序的中斷服務程序調度任務級接收程序進行如下操作。①clBlk結構和簇連接;mBlk和clBlk連接;最后構成緩沖區。②通過調用receiveRtn()函數,把緩沖區傳遞給更高級別的協議。(3)muxReceive()調用協議的stackRcvRtn()函數,把成列的緩沖區傳遞給應用。用戶使用read()函數,通過套接字訪問網絡中的成列緩沖區
3.4 驅動程序的中斷處理
中斷處理函數RT8185L INT()處理設備中斷。根據中斷狀態調用相應的中斷處理程序,如接收終端程序、發送中斷程序等。當網絡接口產生中斷時,系統調用中斷服務程序。為了將終端阻塞減到最小,中斷驅動程序只處理那些需要最小時間的工作,把其他耗時的任務排列到網絡任務的工作隊列中。為了排列任務級的包接收處理工作,網絡驅動程序中斷服務程序必須調用netJobAdd()函數。在調用netJobAdd()函數時,應當指定任務級處理數據包的驅動程序入口。然后由netJobAdd()把函數指派到網絡系統任務--tNetTask的工作隊列中。VxWorks通過tNetTask處理任務級的網絡處理。
tNetTask調用隊列中處理程序如下:(1)包接收程序:把接收到的數據包上傳到網絡緩沖區的堆棧中,通過一個調用上傳給MUX。(2)釋放所有發送幀程序:程序調用netClFree()函數釋放發送緩沖區中所有已經發送的數據幀。
本文分析了RT8185L網卡驅動程序在VxWorks操作系統下的實現。在網卡驅動的設計開發過程中,著重說明網卡驅動在結構、在整個系統中的位置,中斷處理,收發包存儲空間分配等。RT8185L網卡驅動程序應用于我校綜合導航顯控臺,有重要的現實意義。由于主控器內部的差異,其他網卡在初始化、接收數據和發送數據方面會不同,但是在其他方面,可以參考上述驅動程序。
[1]周啟平、張揚,VxWorks下設備驅動程序及BSP開發指南.[M]中國電力出版社.2004.
[2]孔祥營、張保山、俞烈彬,VxWorks驅動及分布式編程.
[M]中國電力出版社.2007.
[3]Wind River Systems,Inc.VxWorks Network Protocol
Toolkit Users Guide[K].California:Wind River,1999.
[4]王守林、蘇建華,VxWorks下PCI網卡驅動程序結構與實現.[J]工業控制計算機.2005
[5]景琦,基于VxWorks的設備驅動和網絡通信.[D]西安科技大學.2006.