梅 濤,黃堡壘,徐曉光
(中航工業(yè)西安計(jì)算技術(shù)研究所 基礎(chǔ)軟件室,陜西 西安 710068)
?
嵌入式系統(tǒng)網(wǎng)卡驅(qū)動(dòng)模型設(shè)計(jì)與實(shí)現(xiàn)
梅濤,黃堡壘,徐曉光
(中航工業(yè)西安計(jì)算技術(shù)研究所 基礎(chǔ)軟件室,陜西 西安710068)
摘要以嵌入式系統(tǒng)下網(wǎng)卡驅(qū)動(dòng)的功能為出發(fā)點(diǎn),提出了一種嵌入式系統(tǒng)下網(wǎng)卡驅(qū)動(dòng)設(shè)計(jì)模型,通過(guò)在網(wǎng)絡(luò)協(xié)議層與網(wǎng)卡驅(qū)動(dòng)之間增加一個(gè)網(wǎng)卡驅(qū)動(dòng)功能抽象中間層,有效地隔離上層網(wǎng)絡(luò)協(xié)議與底層具體的網(wǎng)卡驅(qū)動(dòng),使得驅(qū)動(dòng)實(shí)現(xiàn)的細(xì)節(jié)對(duì)上層協(xié)議透明。中間層作為網(wǎng)卡驅(qū)動(dòng)的抽象層,在提供網(wǎng)卡驅(qū)動(dòng)控制服務(wù)的同時(shí),可實(shí)現(xiàn)網(wǎng)絡(luò)層協(xié)議與驅(qū)動(dòng)之間的交互;有效地簡(jiǎn)化網(wǎng)卡驅(qū)動(dòng)的設(shè)計(jì)工作。通過(guò)在合適的平臺(tái)上進(jìn)行驗(yàn)證和測(cè)試,實(shí)驗(yàn)結(jié)果證明該模型能有效指導(dǎo)嵌入式系統(tǒng)網(wǎng)卡驅(qū)動(dòng)的設(shè)計(jì),網(wǎng)卡驅(qū)動(dòng)能正確,可靠地工作,網(wǎng)絡(luò)通信功能正常。
關(guān)鍵詞嵌入式系統(tǒng);網(wǎng)卡驅(qū)動(dòng)模型;設(shè)計(jì)與實(shí)現(xiàn)
隨著物聯(lián)網(wǎng)[1]、可穿戴設(shè)備[2]的發(fā)展,嵌入式設(shè)備中支持以太網(wǎng)通信已成為必然趨勢(shì),客觀上要求各嵌入式操作系統(tǒng)支持TCP/IP網(wǎng)絡(luò)協(xié)議棧功能。各種嵌入式操作系統(tǒng)的使用,以及眾多硬件平臺(tái)的出現(xiàn),嵌入式領(lǐng)域?qū)W(wǎng)絡(luò)協(xié)議棧的需求日趨復(fù)雜。嵌入式系統(tǒng)開(kāi)發(fā)人員面臨種類繁多的網(wǎng)絡(luò)硬件平臺(tái)需進(jìn)行驅(qū)動(dòng)的適配。本文以嵌入式系統(tǒng)下網(wǎng)卡驅(qū)動(dòng)的功能為出發(fā)點(diǎn),提出一種網(wǎng)卡驅(qū)動(dòng)開(kāi)發(fā)模型;選擇相應(yīng)的硬件和軟件平臺(tái),對(duì)網(wǎng)卡驅(qū)動(dòng)開(kāi)發(fā)模型進(jìn)行驗(yàn)證,并對(duì)設(shè)計(jì)的驅(qū)動(dòng)進(jìn)行的測(cè)試,結(jié)果證明該模型能夠正確有效地指導(dǎo)嵌入式系統(tǒng)網(wǎng)卡驅(qū)動(dòng)的設(shè)計(jì)。
1網(wǎng)卡驅(qū)動(dòng)模型
網(wǎng)卡驅(qū)動(dòng)實(shí)現(xiàn)鏈路層與網(wǎng)絡(luò)層之間的信息傳遞功能。并通過(guò)網(wǎng)卡驅(qū)動(dòng)實(shí)現(xiàn)對(duì)以太網(wǎng)控制器的初始化,實(shí)現(xiàn)對(duì)網(wǎng)卡設(shè)備的控制,進(jìn)而實(shí)現(xiàn)數(shù)據(jù)轉(zhuǎn)發(fā)的工作。網(wǎng)絡(luò)驅(qū)動(dòng)模型定義,如圖1所示。
圖1 嵌入式系統(tǒng)網(wǎng)絡(luò)驅(qū)動(dòng)結(jié)構(gòu)
網(wǎng)絡(luò)協(xié)議驅(qū)動(dòng)提供基于上層協(xié)議所需的通信、控制接口,能處理上層協(xié)議的數(shù)據(jù)和控制命令,并將數(shù)據(jù)和控制命令發(fā)送給底層的設(shè)備驅(qū)動(dòng)。在網(wǎng)絡(luò)協(xié)議驅(qū)動(dòng)與網(wǎng)卡設(shè)備驅(qū)動(dòng)之間,增加了一個(gè)驅(qū)動(dòng)功能抽象中間層,該層提供網(wǎng)卡驅(qū)動(dòng)與協(xié)議驅(qū)動(dòng)之間的交互功能。
1.1網(wǎng)卡設(shè)備與驅(qū)動(dòng)功能抽象層
驅(qū)動(dòng)功能抽象層(下文簡(jiǎn)稱中間層)是網(wǎng)絡(luò)設(shè)備控制和通信功能的抽象集合,為網(wǎng)絡(luò)協(xié)議和驅(qū)動(dòng)程序提供了一套通用的編程接口;該功能位于鏈路層和網(wǎng)絡(luò)層之間。通過(guò)該層可屏蔽網(wǎng)絡(luò)協(xié)議對(duì)底層具體網(wǎng)絡(luò)設(shè)備的感知,中間層相當(dāng)于上層協(xié)議與網(wǎng)絡(luò)驅(qū)動(dòng)程序之間的管道,通過(guò)該層,上層網(wǎng)絡(luò)協(xié)議可與不同的網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)交互。中間層的加入有效隔離了網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)和上層的網(wǎng)絡(luò)協(xié)議,中間層屏蔽了底層網(wǎng)絡(luò)設(shè)備的差異性和上層網(wǎng)絡(luò)組件的特殊性,降低了增加網(wǎng)絡(luò)設(shè)備的和擴(kuò)展網(wǎng)絡(luò)組件的復(fù)雜性。
中間層實(shí)現(xiàn)對(duì)具體網(wǎng)絡(luò)驅(qū)動(dòng)的封裝。同時(shí)為下層具體的網(wǎng)卡驅(qū)動(dòng)提供交互的入口。中間層提供的功能是通用網(wǎng)卡驅(qū)動(dòng)功能的一個(gè)集合,主要實(shí)現(xiàn)數(shù)據(jù)和控制命令的交互。該層的目的是為了隔離上層協(xié)議(如TCP/IP協(xié)議)與底層驅(qū)動(dòng)之間的直接相關(guān)性,將具體的驅(qū)動(dòng)與上層協(xié)議經(jīng)過(guò)隔離,簡(jiǎn)化驅(qū)動(dòng)的設(shè)計(jì)。中間層負(fù)責(zé)層管理網(wǎng)絡(luò)協(xié)議與底層驅(qū)動(dòng)程序之間的通信,使數(shù)據(jù)發(fā)送和接收變得簡(jiǎn)單。
1.2驅(qū)動(dòng)和協(xié)議層數(shù)據(jù)管理
網(wǎng)絡(luò)設(shè)備使用緩沖區(qū)描述符組織所需的數(shù)據(jù)緩沖空間。在設(shè)備驅(qū)動(dòng)初始化時(shí),分配接收和發(fā)送緩沖區(qū)。當(dāng)接收數(shù)據(jù)包時(shí),首先把數(shù)據(jù)存放在設(shè)備的接收緩沖區(qū),然后將緩沖區(qū)傳遞給中間層。當(dāng)發(fā)送數(shù)據(jù)時(shí),首先包發(fā)送緩沖區(qū)的數(shù)據(jù)復(fù)制到設(shè)備的發(fā)送緩沖區(qū)中,再將緩沖區(qū)放置到發(fā)送隊(duì)列中,啟動(dòng)數(shù)據(jù)發(fā)送過(guò)程,數(shù)據(jù)發(fā)送完成后將數(shù)據(jù)緩沖區(qū)歸還給內(nèi)存池。
網(wǎng)絡(luò)中通常使用鏈?zhǔn)浇Y(jié)構(gòu)管理網(wǎng)絡(luò)數(shù)據(jù)。數(shù)據(jù)鏈上的每個(gè)節(jié)點(diǎn)包含一個(gè)給定大小的數(shù)據(jù)塊,數(shù)據(jù)塊由一個(gè)控制節(jié)點(diǎn)進(jìn)行索引。數(shù)據(jù)塊的控制節(jié)點(diǎn)形成一個(gè)數(shù)據(jù)鏈,一個(gè)數(shù)據(jù)鏈表示一個(gè)有效的網(wǎng)絡(luò)數(shù)據(jù)包[3],通過(guò)鏈頭節(jié)點(diǎn)構(gòu)成網(wǎng)絡(luò)中數(shù)據(jù)包的鏈。網(wǎng)卡驅(qū)動(dòng)初始化時(shí),通過(guò)控制節(jié)點(diǎn)為數(shù)據(jù)節(jié)點(diǎn)分配空間;在初始化網(wǎng)卡數(shù)據(jù)緩沖時(shí),為數(shù)據(jù)節(jié)點(diǎn)分配的空間,并與網(wǎng)卡驅(qū)動(dòng)使用的緩沖空間進(jìn)行關(guān)聯(lián)。網(wǎng)絡(luò)數(shù)據(jù)包的組織形式,如圖2所示。
圖2 網(wǎng)絡(luò)數(shù)據(jù)包結(jié)構(gòu)圖
在網(wǎng)絡(luò)通信過(guò)程中存在多種大小的數(shù)據(jù)塊,不同的數(shù)據(jù)包可能使用不同的數(shù)據(jù)塊。不同大小的數(shù)據(jù)塊使網(wǎng)絡(luò)數(shù)據(jù)包的組織更加靈活;但在具體的網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)設(shè)計(jì)中,通常使用統(tǒng)一的數(shù)據(jù)塊大小,從而簡(jiǎn)化網(wǎng)卡驅(qū)動(dòng)的開(kāi)發(fā)。同一個(gè)數(shù)據(jù)塊可能會(huì)被多個(gè)數(shù)據(jù)包引用,當(dāng)數(shù)據(jù)塊對(duì)應(yīng)的控制節(jié)點(diǎn)中引用計(jì)數(shù)[4]為0時(shí),才能釋放對(duì)應(yīng)的數(shù)據(jù)塊空間。
2網(wǎng)卡驅(qū)動(dòng)實(shí)現(xiàn)
網(wǎng)卡驅(qū)動(dòng)主要實(shí)現(xiàn)以下功能模塊:(1)向系統(tǒng)中注冊(cè)網(wǎng)絡(luò)設(shè)備;(2)網(wǎng)絡(luò)設(shè)備空間初始化;(3)網(wǎng)絡(luò)數(shù)據(jù)收發(fā)處理;(4)網(wǎng)絡(luò)設(shè)備啟動(dòng)。
2.1網(wǎng)卡設(shè)備注冊(cè)
在設(shè)備初始化過(guò)程中,系統(tǒng)查找 “網(wǎng)絡(luò)設(shè)備配置表”的全局?jǐn)?shù)據(jù)結(jié)構(gòu)。該表定義了當(dāng)前系統(tǒng)中配置的網(wǎng)絡(luò)設(shè)備的相關(guān)信息,包括設(shè)備編號(hào),設(shè)備驅(qū)動(dòng)入口,設(shè)備初始參數(shù)串等信息。
網(wǎng)絡(luò)設(shè)備配置表結(jié)構(gòu)定義如下:
typedef struct nd_tbl_entry
{
int unit;/* 設(shè)備單元號(hào) */
ND_OBJ* (*LoadFunc) (char*,void*);/* 設(shè)備驅(qū)動(dòng)入口. */
char* LoadString;/* 設(shè)備初始化參數(shù)串. */
void* ndParam;/* 驅(qū)動(dòng)參數(shù)指針 */
BOOL processed;/* 設(shè)備初始化標(biāo)志 */
char ndRes[5];
} ND_TBL_ENTRY;
其中,ND_OBJ表示網(wǎng)卡設(shè)備對(duì)象數(shù)據(jù)結(jié)構(gòu),為網(wǎng)卡設(shè)備通用結(jié)構(gòu)[5],一個(gè)節(jié)點(diǎn)代表網(wǎng)卡設(shè)備鏈的一個(gè)設(shè)備。具體的網(wǎng)卡設(shè)備,通過(guò)在設(shè)備結(jié)構(gòu)定義中引用該結(jié)構(gòu),實(shí)現(xiàn)具體設(shè)備驅(qū)動(dòng)與上層協(xié)議的關(guān)聯(lián)。不同的網(wǎng)卡設(shè)備對(duì)應(yīng)的“網(wǎng)絡(luò)設(shè)備配置”參數(shù)可能不盡相同。初始化時(shí)根據(jù)配置表中的信息,逐個(gè)完成具體設(shè)備的解析。
網(wǎng)卡設(shè)備的注冊(cè),另外一個(gè)主要工作完成網(wǎng)卡驅(qū)動(dòng)操作表的注冊(cè)。網(wǎng)卡驅(qū)動(dòng)操作表數(shù)據(jù)結(jié)構(gòu)定義如下:
typedef struct net_funcs
{
STATUS (*start) (ND_OBJ*);
STATUS (*stop) (ND_OBJ*);
STATUS (*unload) (ND_OBJ*);
int (*ioctl) (ND_OBJ*,int,caddr_t);
STATUS (*send) (ND_OBJ*,PKT*);
STATUS (*mCastAddrAdd) (ND_OBJ*,char*);
STATUS (*mCastAddrDel) (ND_OBJ*,char*);
STATUS (*mCastAddrGet) (ND_OBJ*,MULTI_TABLE*);
STATUS (*pollSend) (ND_OBJ*,PKT*);
STATUS (*pollRcv) (ND_OBJ*,PKT*);
M_BLK_ID (*formAddress) (PKT*,PKT*,PKT*,BOOL);
STATUS (*packetDataGet) (PKT*,LL_HDR_INFO *);
STATUS (*addrGet) (PKT*,PKT*,PKT*,PKT*,PKT*);
int (*endBind) (void*,void*,void*,long);
} NET_FUNCS;
根據(jù)上述定義,網(wǎng)絡(luò)驅(qū)動(dòng)操作表分為如下4類:(1)設(shè)備控制服務(wù),包括網(wǎng)卡設(shè)備啟動(dòng)、停止、卸載服務(wù)以及IO控制服務(wù);(2)網(wǎng)卡數(shù)據(jù)轉(zhuǎn)發(fā)服務(wù),包括數(shù)據(jù)發(fā)送服務(wù);以及輪詢方式下數(shù)據(jù)發(fā)送和接收服務(wù);(3)支持多播的服務(wù),包括為網(wǎng)卡增加、刪除多播地址的服務(wù),獲取多播地址的服務(wù);(4)其他支持服務(wù),包括以太網(wǎng)地址操作相關(guān)服務(wù),構(gòu)造以太網(wǎng)地址,獲取以太網(wǎng)數(shù)據(jù)包頭指針,獲取以太網(wǎng)數(shù)據(jù)包的地址等服務(wù)。
其中,第(4)類服務(wù),不同的協(xié)議類型對(duì)應(yīng)的服務(wù)不盡相同。若基于以太網(wǎng)通信,網(wǎng)絡(luò)層協(xié)議提供了缺省的服務(wù),網(wǎng)卡驅(qū)動(dòng)直接使用相關(guān)服務(wù)即可。根據(jù)使用過(guò)程中網(wǎng)卡設(shè)備的實(shí)際情況,可以靈活的配置網(wǎng)卡的驅(qū)動(dòng)操作表。若網(wǎng)卡使用中斷方式進(jìn)行通信,則在驅(qū)動(dòng)操作表中無(wú)需提供輪詢操作的服務(wù)。不使用多播時(shí),亦可不提供多播支持服務(wù)等。
當(dāng)完成設(shè)備的加載和設(shè)備驅(qū)動(dòng)操作表的注冊(cè)工作,網(wǎng)卡設(shè)備的注冊(cè)過(guò)程基本完成。同時(shí),設(shè)備注冊(cè)過(guò)程中還需完成網(wǎng)卡設(shè)備MAC[6]層和PHY[7]的初始化工作。由于網(wǎng)卡設(shè)備MAC層和PHY的初始化工作主要與網(wǎng)卡硬件直接相關(guān),需參考網(wǎng)卡硬件手冊(cè),在此不再贅述。
2.2網(wǎng)卡設(shè)備空間初始化
網(wǎng)卡設(shè)備空間初始化工作完成網(wǎng)卡緩沖所需空間的分配和初始化工作。網(wǎng)卡的數(shù)據(jù)傳輸通過(guò)DMA完成,DMA操作對(duì)象是網(wǎng)卡設(shè)備緩沖描述符。描述符用于指定MAC數(shù)據(jù)幀的緩沖地址,每個(gè)描述符最多可指定兩個(gè)緩沖地址,緩沖大小有嚴(yán)格的限制,一個(gè)描述符不能容納一幀的數(shù)據(jù)時(shí),需使用多個(gè)描述符。描述符的組織結(jié)構(gòu)有如下兩種方式:(1)環(huán)形緩沖組織結(jié)構(gòu);(2)鏈?zhǔn)骄彌_組織結(jié)構(gòu)[8]。環(huán)形緩沖的組織結(jié)構(gòu),如圖3所示。
圖3 網(wǎng)卡緩沖環(huán)形結(jié)構(gòu)
鏈?zhǔn)骄彌_組織結(jié)構(gòu)如圖4所示。
圖4 網(wǎng)卡緩沖鏈?zhǔn)浇Y(jié)構(gòu)
網(wǎng)卡設(shè)備空間初始化時(shí),根據(jù)具體使用方式,完成網(wǎng)卡設(shè)備緩沖描述符的分配,并為對(duì)應(yīng)的緩沖分配數(shù)據(jù)存儲(chǔ)空間。為簡(jiǎn)化網(wǎng)卡驅(qū)動(dòng)設(shè)計(jì),通常在網(wǎng)卡驅(qū)動(dòng)中僅使用相同大小的緩沖空間,構(gòu)建設(shè)備緩沖區(qū)。
設(shè)備緩沖的分配和初始化完成后需要實(shí)現(xiàn)網(wǎng)卡設(shè)備緩沖獲取和釋放的機(jī)制。在獲取緩沖時(shí),要保證對(duì)緩沖空間訪問(wèn)的互斥性,確保沒(méi)有其他任務(wù)同時(shí)操作當(dāng)前的緩沖。釋放不再使用的緩沖時(shí),確保沒(méi)有其他任務(wù)繼續(xù)使用當(dāng)前緩沖空間。網(wǎng)卡設(shè)備空間初始化,還包括網(wǎng)卡驅(qū)動(dòng)數(shù)據(jù)結(jié)構(gòu)所需空間的分配和初始等工作。
2.3網(wǎng)卡數(shù)據(jù)處理
網(wǎng)卡數(shù)據(jù)處理主要完成數(shù)據(jù)接收和發(fā)送工作。
(1)數(shù)據(jù)接收過(guò)程。網(wǎng)卡將收到的數(shù)據(jù)存放到接收緩沖中,然后將數(shù)據(jù)轉(zhuǎn)發(fā)給上層協(xié)議,數(shù)據(jù)接收過(guò)程如圖5所示。
圖5 網(wǎng)卡驅(qū)動(dòng)接收數(shù)據(jù)模型
數(shù)據(jù)接收過(guò)程,驅(qū)動(dòng)完成如下工作:1)將數(shù)據(jù)存放到設(shè)備的接收緩沖,獲取當(dāng)前空閑的緩沖,存放收到的數(shù)據(jù)幀;2)將數(shù)據(jù)上傳給上層協(xié)議,包括數(shù)據(jù)包結(jié)構(gòu)的調(diào)整,驅(qū)動(dòng)需根據(jù)上層協(xié)議棧定義的格式組織數(shù)據(jù)包。
驅(qū)動(dòng)在數(shù)據(jù)上傳的過(guò)程中,弱直接復(fù)制數(shù)據(jù)到上層協(xié)議,將伴隨一次數(shù)據(jù)的復(fù)制操作,導(dǎo)致網(wǎng)卡接收效率降低。通常直接將網(wǎng)卡設(shè)備所需的接收緩沖指向上層協(xié)議使用的數(shù)據(jù)緩沖,通過(guò)緩沖地址的傳遞,減少數(shù)據(jù)的復(fù)制操作,提高數(shù)據(jù)傳輸效率;
(2)數(shù)據(jù)發(fā)送過(guò)程。該過(guò)程較簡(jiǎn)單,將上層協(xié)議發(fā)送的數(shù)據(jù),復(fù)制到網(wǎng)卡的發(fā)送緩沖中,啟動(dòng)發(fā)送操作,將數(shù)據(jù)發(fā)送出去,更新網(wǎng)卡的設(shè)備狀態(tài),然后回收發(fā)送緩沖。發(fā)送過(guò)程如圖6所示。
圖6 網(wǎng)卡驅(qū)動(dòng)數(shù)據(jù)發(fā)送模型
在數(shù)據(jù)發(fā)送過(guò)程中,也存在一次數(shù)據(jù)復(fù)制操作,為提高網(wǎng)卡數(shù)據(jù)發(fā)送效率,直接將網(wǎng)卡的發(fā)送緩沖指向上層協(xié)議的數(shù)據(jù)緩沖,通過(guò)緩沖地址的傳遞,減少一次數(shù)據(jù)復(fù)制的過(guò)程。
數(shù)據(jù)發(fā)送過(guò)程中,驅(qū)動(dòng)需保證數(shù)據(jù)操作的互斥性,在操作網(wǎng)卡發(fā)送緩沖時(shí),需要保證當(dāng)前操作是獨(dú)立的,防止數(shù)據(jù)被破壞。在驅(qū)動(dòng)實(shí)現(xiàn)中一般通過(guò)加鎖的方式,提供數(shù)據(jù)操作的獨(dú)立性。獲取網(wǎng)卡的發(fā)送緩沖時(shí),需先獲取對(duì)應(yīng)的互斥鎖,才能進(jìn)行后續(xù)的操作。在數(shù)據(jù)發(fā)送完成后,需要回收發(fā)送緩沖;
(3)數(shù)據(jù)處理方式。根據(jù)網(wǎng)卡處理數(shù)據(jù)觸發(fā)機(jī)制的不同,分為中斷方式和輪詢方式兩種。
中斷方式下,網(wǎng)卡數(shù)據(jù)的收發(fā)均通過(guò)中斷觸發(fā)。當(dāng)發(fā)送數(shù)據(jù)時(shí),將數(shù)據(jù)復(fù)制到網(wǎng)卡的發(fā)送緩沖中,啟動(dòng)發(fā)送,數(shù)據(jù)發(fā)送完成后,產(chǎn)生發(fā)送完成中斷,更新網(wǎng)卡的設(shè)備狀態(tài),完成數(shù)據(jù)發(fā)送過(guò)程。當(dāng)有數(shù)據(jù)到達(dá)時(shí),觸發(fā)網(wǎng)卡的數(shù)據(jù)接收中斷,中斷處理服務(wù)進(jìn)行數(shù)據(jù)的接收,更新網(wǎng)卡的狀態(tài);然后上傳數(shù)據(jù),完成一次數(shù)據(jù)接收中斷處理。
輪詢方式下,處理器定時(shí)去查詢網(wǎng)卡的狀態(tài)寄存器,當(dāng)有數(shù)據(jù)發(fā)送時(shí),啟動(dòng)輪詢發(fā)送服務(wù),將數(shù)據(jù)發(fā)送出去,然后更新網(wǎng)卡的狀態(tài),回收發(fā)送緩沖,完成一次發(fā)送過(guò)程。如果有數(shù)據(jù)到達(dá),啟動(dòng)輪詢方式下的數(shù)據(jù)接收,給協(xié)議上傳數(shù)據(jù),完成一次輪詢數(shù)據(jù)接收過(guò)程。
相對(duì)于輪詢方式,頻繁查詢網(wǎng)卡的狀態(tài),浪費(fèi)大量的處理器時(shí)間;中斷方式網(wǎng)卡的數(shù)據(jù)處理效率較高。在實(shí)時(shí)性要求較高的環(huán)境下,通常使用中斷方式。當(dāng)然,如果數(shù)據(jù)量較小,但數(shù)據(jù)達(dá)到頻率高,輪詢方式可能更合適。因此,選擇那種數(shù)據(jù)處理方式,需要根據(jù)實(shí)際使用情況進(jìn)行抉擇。
2.4啟動(dòng)網(wǎng)卡設(shè)備
當(dāng)前述工作均已完成,此時(shí)網(wǎng)卡驅(qū)動(dòng)的基本功能便已實(shí)現(xiàn),網(wǎng)卡設(shè)備也已處于就緒狀態(tài),可以啟動(dòng)設(shè)備開(kāi)始工作。啟動(dòng)網(wǎng)卡設(shè)備,主要實(shí)現(xiàn)網(wǎng)卡狀態(tài)的設(shè)置和檢查工作,包括設(shè)備緩沖初始化完成的檢查,PHY狀態(tài)的檢查等;中斷方式下,使能網(wǎng)卡的中斷,正確連接網(wǎng)卡的中斷服務(wù)程序;然后將網(wǎng)卡置于正常工作模式。
3驗(yàn)證與測(cè)試
為驗(yàn)證模型的可用性和正確性,選擇了PowerPC 8640[9]單核處理器作為功能驗(yàn)證的目標(biāo)硬件平臺(tái),該平臺(tái)集成了一款Motorola生產(chǎn)的10/100 M自適應(yīng)以太網(wǎng)控制器;選擇某型嵌入式實(shí)時(shí)操作系統(tǒng)作為驅(qū)動(dòng)功能驗(yàn)證的軟件環(huán)境。實(shí)驗(yàn)中實(shí)現(xiàn)了基于中斷方式的驅(qū)動(dòng)操作表;通過(guò)在系統(tǒng)中分配一塊IO空間,作為網(wǎng)卡所需的緩沖空間,完成設(shè)備空間初始化以及MAC層和PHY層的初始化工作;當(dāng)網(wǎng)卡初始化工作完成之后,通過(guò)設(shè)備啟動(dòng)服務(wù)啟動(dòng)網(wǎng)卡。將驗(yàn)證平臺(tái)作為目標(biāo)端,與之進(jìn)行以太網(wǎng)通信測(cè)試的是一臺(tái)PC機(jī)。測(cè)試環(huán)境如圖7所示。
圖7 網(wǎng)絡(luò)測(cè)試環(huán)境
測(cè)試過(guò)程中主要進(jìn)行了黑盒測(cè)試和壓力測(cè)試。黑盒測(cè)試主要驗(yàn)證網(wǎng)卡根據(jù)輸入能獲得正確的輸出;壓力測(cè)試主要驗(yàn)證網(wǎng)卡驅(qū)動(dòng)工作的穩(wěn)定性。黑盒測(cè)試通過(guò)讀寫(xiě)網(wǎng)卡相關(guān)寄存器的方式進(jìn)行驗(yàn)證。驗(yàn)證時(shí)機(jī)包括數(shù)據(jù)幀到達(dá),中斷發(fā)生時(shí)網(wǎng)卡寄存器狀態(tài)的變化。黑盒測(cè)試結(jié)果證明網(wǎng)卡能準(zhǔn)確響應(yīng)各種命令請(qǐng)求,網(wǎng)卡工作正常。壓力測(cè)試選擇基于UDP/TCP協(xié)議的以太網(wǎng)通信案例。測(cè)試過(guò)程在PC機(jī)端通過(guò)網(wǎng)絡(luò)抓包工具wireShark[10]進(jìn)行數(shù)據(jù)捕獲,通過(guò)對(duì)比抓包獲取的數(shù)據(jù)與發(fā)送數(shù)據(jù)內(nèi)容,以驗(yàn)證網(wǎng)卡驅(qū)動(dòng)數(shù)據(jù)通信功能是否可靠。基于UDP、TCP協(xié)議的通信測(cè)試結(jié)果,如圖8和圖9所示。
圖8 基于UDP的通信測(cè)試結(jié)果
圖9 基于TCP的通信測(cè)試結(jié)果
基于UDP/TCP的通信測(cè)試,實(shí)驗(yàn)結(jié)果證明網(wǎng)卡數(shù)據(jù)收發(fā)工作正確,以太網(wǎng)通信過(guò)程穩(wěn)定,網(wǎng)卡驅(qū)動(dòng)數(shù)據(jù)處理功能正確可靠,網(wǎng)卡工作正常。
4結(jié)束語(yǔ)
本文介紹了一種嵌入式系統(tǒng)中網(wǎng)卡驅(qū)動(dòng)的設(shè)計(jì)模型。該模型通過(guò)在具體的網(wǎng)卡設(shè)備驅(qū)動(dòng)與上層網(wǎng)絡(luò)協(xié)議之間引入網(wǎng)卡驅(qū)動(dòng)功能抽象層,通過(guò)該層能有效隔離上層的網(wǎng)絡(luò)協(xié)議與底層具體的網(wǎng)絡(luò)設(shè)備。網(wǎng)卡驅(qū)動(dòng)功能抽象層作為網(wǎng)卡驅(qū)動(dòng)功能集合,提供了一種上層協(xié)議與底層驅(qū)動(dòng)交互的機(jī)制,使得底層設(shè)備的變化對(duì)上層協(xié)議透明,簡(jiǎn)化了嵌入式系統(tǒng)中網(wǎng)卡驅(qū)動(dòng)設(shè)計(jì)發(fā)的復(fù)雜度,為嵌入式系統(tǒng)下網(wǎng)卡驅(qū)動(dòng)的開(kāi)發(fā)提供了參考。同時(shí),通過(guò)選擇實(shí)際的驗(yàn)證測(cè)試平臺(tái),驗(yàn)證該模型的可用性和正確性。根據(jù)實(shí)際的驗(yàn)證測(cè)試結(jié)果,證明該模型能夠正確有效的指導(dǎo)嵌入式系統(tǒng)下網(wǎng)卡驅(qū)動(dòng)的設(shè)計(jì)與實(shí)現(xiàn)。
參考文獻(xiàn)
[1]Jaydip Sen.Internet of things:application and challenges in technology and standardization[J].Wireless Personal Communication,An International Joumal,2011,58(2):49-69.
[2]Pedro Castillejo.An internet of things approach for managing smart service provided by wearable device[J/OL].(2014-06-15)[2015-07-20]http://dx.doi.org/10.1155/2013/190813,2013.
[3]John Ray.TCP/IP開(kāi)發(fā)使用手冊(cè)[M].北京:機(jī)械工業(yè)出版社,1999.
[4]Shahriyar R,Blackburn S M,Yang X,et al.Taking off the gloves with reference counting immix[C].Indianapolis,USA:in Proceedings of the 24th ACM SIGPLAN conference on Object Oriented Programming Systems,Languages and Applications,2013.
[5]曹桂平.VxWorks設(shè)備驅(qū)動(dòng)開(kāi)發(fā)詳解[M].北京:電子工業(yè)出版社,2011.
[6]IEEE-SA.IEEE Standard for ethernet,IEEE 802.3[S].USA:IEEE,2012.
[7]IEEE-SA.Local and metropolitan area network standards,IEEE 802.2[S].USA:IEEE,1998.
[8]樊東東,莫瀾.Linux內(nèi)核源碼剖析—TCP/IP實(shí)現(xiàn):上冊(cè)[M].北京:機(jī)械工業(yè)出版社,2011.
[9]Freescale Inc.MPC8640D microprocessor family user’s manual[M].USA:Freescale Inc,2010.
[10]Free Software Foundation,Inc.Wireshark user’s guide[M].USA:Free Software Foundation,Inc 2004.
Design and Realization of Network Driver Model in Embedded System
MEI Tao,HUANG Baolei,XU Xiaoguang
(Software Research Room,Aeronautical Computing Technique Research Institute,Xi’an 710068,China)
AbstractA model of network driver in embedded system is proposed with emphasis on its function.There is an abstract mid-layer between the network protocols and network drivers,which separates the upper layer network protocols from network drivers effectively,thus making concrete network drivers detail transparent to network protocols.The mid-layer is an abstract layer of network driver,which supports driver function abstraction while supporting command exchange between the network protocols upper layer and drivers.The cost of network driver designing is decreased because of the mid-layer.The validation and testing experiments are carried out.The results show that of network drivers in embedded system designed based on this model work correctly and reliably with normal network communication.
Keywordsembedded system;model of network driver;design and realization
中圖分類號(hào)TP316.2
文獻(xiàn)標(biāo)識(shí)碼A
文章編號(hào)1007-7820(2016)04-111-05
doi:10.16180/j.cnki.issn1007-7820.2016.04.029
作者簡(jiǎn)介:梅濤(1984—),男,碩士,工程師。研究方向:嵌入式實(shí)時(shí)操作系統(tǒng)和網(wǎng)絡(luò)。
基金項(xiàng)目:工信部民用飛機(jī)專項(xiàng)科研基金資助項(xiàng)目(MJ-S-2012-05)
收稿日期:2015- 08- 19