摘 要:隨著嵌入式技術在軍工、信息家電中的應用,如何在嵌入式實時系統下對網卡進行驅動程序的設計以及實現網絡通信和管理,成為非常重要的技術。本文首先從整體上VxWorks網絡系統得基本原理和與結構,然后以Intel82557網卡驅動為例,著重介紹網絡設備驅動程序設計與實現過程。本文對所有基于MUX機制下的VxWorks網絡設備驅動程序開發者具有參考價值。
引言
VxWorks 是一個具有微內核、可裁剪的高性能強實時操作系統,它以其良好的可靠性和卓越的實時性被廣泛地應用在通信、軍事、航空、航天等高精尖技術及實時性要求極高的領域中。我校研制的綜合導航顯控臺采用VxWorks操作系統,它作為艦船導航系統的核心設備實時為導航、通信、駕控系統提供各種信息。當需要更改海圖模塊硬盤中一些及時需要修改的數據、程序和電子海圖等信息時,為避免拆卸設備,可以通過網絡傳輸來解決上述問題??梢员疚囊訧ntel82557網卡為例 ,給出了基于VxWorks的網絡設備驅動程序的開發方法和實現流程。
1 VXWORKS的網絡結構
VxWorks提供了與其他TCP/IP網絡系統間“透明”的存取方式、BSD Socket兼用的編程接口,遠程過程調用(RPC),遠程文件存取等。網絡驅動程序和上層網絡協議??梢杂袃煞N實現形式:BSD方式和MUX方式。在VxWorks中, MUX與END合稱 SENS驅動(可裁剪增強型網絡驅動)。網卡驅動程序的層次結構使網卡驅動程序的實現和移植更加方便。而且VxWorks為編寫網卡增強型驅動程序(SENS)提供了很好的接口和規范。下圖是VxWorks的網絡系統。
圖1 VxWorks的網絡系統
2 END驅動概述
2.1 MUX與END
VxWorks網絡協議??梢苑譃橐韵聨讓樱簯脤?、傳輸層、IP層、MUX層、數據鏈路層和物理層。如圖2所示。
圖2 VxWorks網絡協議棧分層結構示意圖
從上圖看出,與其他TCP/IP 協議相比VxWorks網絡協議棧增加一層MUX層。MUX層是VxWorks為方便在網絡接口硬件上實現多種協議而增加的一層 。它主要用于管理底層的多種硬件的設備驅動,向上層不同協議提供統一的接口,降低了上層協議與底層物理硬件的藕合,使得網絡驅動和上層協議彼此保持獨立,既方便在現有硬件基礎上實現新的上層協議,也利于用新的硬件支持原有的上層協議。
MUX與END的交互是通過提供一套可供底層調用接口服務來實現的,實現END驅動必須遵循這套接口關系。如圖3所示
圖3 MUX與END的接口關系
上圖中右邊框中列出的函數是驅動需要實現的函數,供MUX層調用在必要的時間調用,如當上層使用該網卡發送數據時,MUX會調用該網卡END驅動提供的Send函數,將數據提交給網卡芯片硬件。
2.2 緩沖池數據結構
網絡設備驅動與上層協議進行數據交換需要相應的內存緩沖,并且管理這些緩沖也需要相應的函數。VxWorks提供了netBufLib函數庫用于創建和管理網絡設備用到的內存緩沖池,網絡設備驅動可以直接使用也可以在此基礎上設計自己特定的內存緩沖池。數據以簇的形式保存,數據結構mBlks(內存塊)和clBlks(簇塊)形成的數據鏈結構則用于指定各個簇。
在clBlk之上是mBlk結構。該結構存儲一個到clBlk的連接,也可以存儲一個到另一個mBlk的連接。通過mBlk的連接,可以引用任意數量的數據,如圖4所示
圖4 mBlks和clBlks的數據結構
3 END驅動實現
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[],其結構原型如下所示:
END_TBL_ENTRY endDevTbl[]=
{
-----
#ifdef INCLUDE_FEI_END
{0,FEI82557_LOAD_FUNC,FEI82557_LOAD_
STRING,FEI82557_BUFF_LOAN,NULL,FALSE},
#endif /*INCLUDE_FEI_END*/
#ifdef INCLUDE_ELT_3C509_END
{0,END_3C509_LOAD_FUNC,END_3C509_LOAD_STRING,END_3C509_BUFF_LOAN,NULL,FALSE}
#endif /*INCLUDE_ELT_3C509_END*/
-----
};
該數組描述了系統中的所有網絡設備的裝載函數入口點及其相關參數。將網絡設備驅動程序的裝載函數fei82557EndLoad()入口點及相關參數添加到網絡設備表endDevTbl[] 中,而后在config.h中加入“#define INCLUDE_END”以使系統準備初始化MUX并通過MUX裝載網絡設備驅動程序。
在VxWorks網絡驅動程序的編程規范中,為了系統的高移植性、兼容性和可裁剪型等,通常在configNet.h文件中對系統支持的INTEL82557網絡設備定義一些宏,其編寫規范如下所示:
#ifdef INCLUDE_FEI_END
#define FEI82557_LOAD_FUNC fei82557EndLoad /*設備驅動程序裝載函數*/
#define FEI82557_BUFF_LOAN 1/*允許緩沖借出*/
/*
*fei82557End初始化字符串格式:
*::::
*/
#define FEI82557_LOAD_STRING“-1:0x00:0x20:0x20:0x00”
IMPORT END_OBJ*FEI82557_LOAD_FUNC(char*,
void*);
#endif /*INCLUDE_FEI_END*/
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()函數會根據網絡設備表endDevTbl[]中的定義逐一調用各網絡設備的裝載函數,其中這個函數是muxDevLoad()的一個輸入參數。muxDevStart()函數也會根據endDevTbl[]逐一調用網絡設備所定義的設備開始函數。至此MUX的歘石化以及END 驅動程序的初始化工作已經完成。但是網絡設備還是不可以使用,因為還需要將協議綁定到指定的END 指定的設備上,這一步需要用muxBind()函數實現。
在VxWorks中,系統通過usrRoot()函數調用usrNetInit()函數完成MUX的初始化、裝載網絡設備表endDevTbl[]中描述的所有設備并將IP協議綁定到網絡引導設備上等工作。
網絡設備驅動程序的安裝過程即下圖所示的網絡初始化順序。
圖5 網絡初始化順序
3.3 發送數據
在VxWorks網絡系統中,發送數據的流程如下圖
通過對上圖分析,主要包含以下幾個處理。
(1) 用戶調用write()函數,通過套接字訪問網絡。
(2) 網絡協議拷貝需要發送的數據到網絡緩 區中,并調用協議驅動程序的發送程序。
(3) 協議驅動程序調用muxSend()啟動發送循環。
(4) muxSend()通過調用send()回調函數,把緩沖區傳遞給END。
(5) 數據發送程序把數據拷貝到設備緩沖區中,并 把它放置到設備的發送隊列中。
(6) 當產生發送中斷時,驅動程序的中斷服務程序調度程序丟棄已發送的數據包,徹底清理發送隊列。
3.4 接收數據
在VxWorks網絡系統中,接收數據的流程如下圖
通過對上圖進行分析,它主要包含以下幾個處理。
(1) 設備接收到數據包后直接把數據存放到預先分配的簇中。
(2) 當接收到中斷時,驅動程序的中斷服務程序調度任務級接收程序進行如下操作。
- clBlk結構和簇連接;mBlk和clBlk連接;最后構成緩沖區。
- 通過調用receiveRtn()函數,把緩沖區傳遞給更高級別的協議。
(3) muxReceive()調用協議的stackRcvRtn()函數,把成列的緩沖區傳遞給應用。用戶使用read()函數,通過套接字訪問網絡中的成列緩沖區
3.5 驅動程序的中斷處理
中斷處理函數fei82557INT處理設備中斷。當網絡接口產生中斷時,系統調用用戶驅動程序注冊的中斷服務程序。中斷程序主要完成將數據包從本地網絡設備送出的操作。為了排列任務級的包接收處理工作,網絡驅動程序中斷服務程序必須調用netJobAdd()函數。在調用netJobAdd()函數時,應當指定任務級處理數據包的驅動程序入口。然后由netJobAdd()把函數指派到網絡系統任務——tNetTask的工作隊列中。VxWorks通過tNetTask處理任務級的網絡處理。
tNetTask調用隊列中處理程序如下:
(1)包接收程序:把接收到的數據包上傳到網絡緩沖區的堆棧中,通過一個調用上傳給MUX。
(2)釋放所有發送幀程序:程序調用netClFree()函數釋放發送緩沖區中所有已經發送的數據幀。
4 結束語
本文分析了VxWorks下網卡驅動程序的原理,并以Intel82557網卡為例具體說明了網卡驅動的設計開發過程。主要就VxWorks下網卡驅動程序的共性做了闡述, 比如VxWorks下網卡驅動的在結構、在整個系統中的位置,中斷處理,收發包存儲空間分配等。
-
VxWorks
+關注
關注
3文章
351瀏覽量
97099 -
RPC
+關注
關注
0文章
111瀏覽量
11540 -
網卡驅動
+關注
關注
0文章
35瀏覽量
17705 -
BSD
+關注
關注
0文章
31瀏覽量
10424 -
嵌入式實時系統
+關注
關注
0文章
3瀏覽量
1558
發布評論請先 登錄
相關推薦
評論