作者:陳海華,胡林,楊晨暉
pSoSystem操作系統簡介
pSoSystem是一種專門用以嵌入式處理器的高性能的、模塊化的操作系統?;陂_放操作系統標準,它提供了一種復雜的多任務運行環境。同時,它也提供了一系列的集成開發工具,這些開發工具可用于Unix系統,也可用于Windows系統。另外,由于pSoSystem是一種模塊化的操作系統,所以,開發人員可以根據需要,選用不同的操作系統模塊。這樣,就使得我們沒有必要把一個龐大的操作系統全部加載到嵌入式系統設備上。比如說,如果我們的應用系統不需要支持文件功能,則可以不用加載文件系統。這樣,就可以大大縮減操作系統的尺寸.pSoSystem的整個系統結構如圖1所示。
圖1pSOS系統框圖
pSoSystem網絡設備驅動程序概述
網絡驅動在pSoSystem里有作專門的處理,它不是直接和pSOS+內核模塊的I/Osupervisor打交道,而是和pNA+網絡模塊打交道。和I/O監管層一樣,為了屏蔽具體硬件之間的差異,pNA+也為網絡驅動程序提供了一個中間層,稱之為NI(NetworkInterface)層。在NI層,它為上層提供了一系列的標準網絡接口函數(如網卡初始化,網絡包發送等),這些接口函數是在網絡驅動程序里實現,而由pNA+模塊里的其它網絡層調用。要編寫網絡驅程,就是要具體實現這幾個接口函數。圖2是網絡驅動程序在pSoSystem中的模型圖。
圖2網絡驅動模型
通用網絡驅動模型的設計
通用網絡驅動模型的整體設計思想,就是將獨立于具體硬件的操作抽象出來,以形成一個通用的代碼框架。具體來說,主要包括以下幾個部分:
a) 底層驅動和上層應用的分離層次模型設計;
b) 由上述分離層次所得到的相應接口函數的設計;
c) 網卡數據包接收、發送的抽象代碼框架的設計;
下面,本文將就上述3個方面的設計作一個較為全面的分析。
底層驅動和上層應用的分離層次模型設計
顯然,這一塊的設計是整個驅動模型設計的首要部分。只有將底層驅動和上層應用有效地分離出來,才能保證代碼的獨立性與重用性,從而也使得驅動程序的開發者不用過多地關心上層應用,符合現代軟件的設計思想。關于這一部分的設計,pSoSys2tem已經幫助我們完成,其所提供的網絡驅動模型就是一個典型的軟件分層設計實例。詳情請看圖2.
接口函數的設計
一般來說,根據上述所設計的驅動程序分層模型,都會為上下兩層的溝通提供一些標準的接口函數。顯然,這些接口函數的實現,大部分是和底層硬件具體相關的,但其操作步驟卻是大同小異的。因此,在我們的通用驅動模型框架里,就是要抽象出獨立于具體硬件的一般操作,以形成一個通用的代碼框架,在這里,我們一般就以偽C代碼形式來給出各個接口函數的一般實現。
(1)NiLan接口函數的設計與分析
NiLan是pNA+層和網絡驅動掛接的一個最為重要的接口函數。實際上,早在pNA+模塊的加載過程中,pNA+就安裝了此函數,其相應的偽C代碼如下:
UCHAR *SetUpNI(UCHAR *FreeMemPtr)
{InstallNi((int(*)()) Nilan, IPaddr,
BSP-LAN1-MTU,BSP-LAN1-HWALEN,BSP-LAN1-FLAGS,SysVars.Lan1SubnetMask,0);
/*通過這個函數的調用,將NiLan函數安裝到了pNA+模塊中去了*/
FreeMemPtr=SetupLanParams(BSP-LAN1-PKB,FreeMemPtr);
/*在pNA+模塊里為網卡要用到的接收與發送等緩存分配空間*/
}
代碼1
通過這個函數,pNA+層可以完成所有有關網絡應用的調用。其具體做法就是:由pNA+層傳入不同的功能號,以達到調用相應具體功能函數的目的,其相應的偽C代碼如下:
longNiLan(ULONGfunction, union nientry*p)
{
if(function= =NI-INIT)
{
return ni-init();
}else
{
/*根據功能號,調用相應的功能函數*/
switch(function)
caseNI-SEND:調用ni-send();break;
case其它功能號:調用其它功能函數;break;
}
}
代碼2
(2)ni-init函數的設計與分析
此函數主要是用來配置和初始化網卡的各種硬件和軟件資源,具體功能如下所述:
a)初始化buffers,主要是將其鏈成鏈表,以方便操作;
b)初始化網卡相關的寄存器,最重要的就是收發寄存器的首址RxDesc和TxDesc;
c)初始化收發寄存器,主要是將其鏈成隊列,以方便內存的循環使用;
staticlongni-init(void)
{
InitBuffers();/*初始化buffer,主要是將
其鏈成鏈表*/
InstallIsr();/*安裝中斷服務程序,最重要
的就是網絡數據接收中斷*/
InitDescps()/*將收發寄存器鏈成隊列*/
lanInit();/*初始化網卡的各個寄存器*/
}
代碼3
網卡數據包收發代碼框架的設計與分析
設計通用網卡驅動模型,顯然,數據包的收發是最為重要的與具體硬件有關的操作,如何去除具體硬件的相關性,而抽象出獨立于各種硬件的一般的收發代碼,則顯得非常重要。下面,將就網卡收發過程的一般步驟進行分析。
(1)網卡數據包的發送過程其具體步驟如下所示
a)應用程序為了發送數據,調用相應的套接字;
b)套接字的調用引發pNA+的系統調用,pNA+層則調用NiLan函數將上層的數據傳給NI層;NiLan的具體實現參看代碼2,這里,主要解釋一下其傳入的參數;function:功能號,NiLan將根據不同的功能號調用合適的NI層的函數;p:NI層的入口點,即上層和下層交換數據的地方,發送數據時,由這個入口點將相應的數據由pNA+層傳入NI層,同樣,接收數據時,也是由這個入口點將NI層收到的數據上傳給pNA+層。
c)NI層收到pNA+層傳入的數據之后,則將待發送數據組裝成數據幀,以便接下來移
入網卡的發送寄存器發送出去,其相應的實現代碼如下所示:
staticvoidni-send(char*hwa-ptr,char*pkbpt
r,USHORTtype)
{
tx-hdr=InitMblk();/3初始化三元組,一個三元組里存放一個數據幀*/
FillFrameHead();/*填充幀頭*/
TxFillDesc();/*調用TxFillDesc()填充相
應的寄存器以把數據發送出去*/
}
代碼4
(2)網卡數據包的接收過程
網卡接收數據的過程不同于發送數據的過程,發送數據時,有一個獨立的發送數據的函數,而在網卡的接收數據的過程中,并不存在這樣一個獨立的函數,網卡數據的接收是通過中斷服務程序來完成的,其具體步驟如下:
a)網卡產生接收數據的中斷;
b)中斷導致ni-isr()中斷服務程序的調用,而在ni-isr()中,調用真正的中斷響應程序
ni-poll(),ni-poll()則根據不同的中斷事件,調用具體的中斷服務程序;
static voidni-isr(void)
{
ienter();
AppModel-run-on-sstack((Pointer)nipoll, Null);
ireturn();
}
static voidni-poll(void)
{
for(;;)
{
if(接收數據中斷)RxBufRcv();
if(發送數據中斷)TxFillDesc();
if(其它中斷)。..。..
}
}
代碼5
c)對于接收數據的中斷而言,在ni-poll()函數里調用的中斷響應函數就是RxBufRev(),這個函數是真正負責網卡數據接收的地方,其工作原理就是讀取網卡相應的接收寄存器,并通知pNA+層將數據取走;
staticvoidRxBufRcv(void)
{
for(;;)
{
good=CheckFrame()/*判斷接收的數據包是否出錯*/
if(good==TRUE)/*如果數據包沒有出錯,則將它交給pNA+層*/
{
/*建立三元組,并通知pNA+層*/
msgBlk=NiFuncs.esballoc((void3)&pktAddr-》type,dataLen,0,&frtn);
Announce(type,msgBlk,dataLen,IfNum);
}
}
}
代碼6
d)通過RxBufRec()函數將數據從網卡中收下后,它最后還要再調用Announce()函數
通知pNA+模塊將數據取走。至此,一個數據包的接收過程全部完成;注:Announce是一個回調函數,即在pNA+模塊中定義的,由NI層調用的函數;
驅動程序的安裝
在pSOS中,一般的驅動程序安裝是通過修改drv-conf.c(pSoSystem操作系統里的一個系統配置文件)中的InstallDriver來完成。而網絡驅動程序在pSoSystem里有作專門的處理,它是通過調用drvconf.c中的SetUpNi函數來實現的,而SetUpNi則會調用pSoSystem所提供的InstallDriver來最后完成網絡驅動程序的安裝。當然,最后還需要重新編譯pSoSystem的內核,從而將我們的驅動程序模塊加載到pSoSystem系統模塊中。具體實現可以參看前面的代碼1.
結束語
本文只給出了通用網絡驅動模型的最重要部分的設計與分析,至于其它一些細節函數,限于篇幅,本文未做詳述。有興趣的讀者,可以進一步參看文末所附的參考文獻。最后,希望本文能對有心開發類似應用的工程技術人員有所幫助。
責任編輯:gt
-
處理器
+關注
關注
68文章
19336瀏覽量
230199 -
嵌入式
+關注
關注
5086文章
19143瀏覽量
306045 -
操作系統
+關注
關注
37文章
6847瀏覽量
123420
發布評論請先 登錄
相關推薦
評論