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

什么是網(wǎng)絡(luò)操作系統(tǒng)(NOS)
嵌入式實(shí)時(shí)操作系統(tǒng)pSOSystem系統(tǒng)
嵌入式操作系統(tǒng)的網(wǎng)絡(luò)加載實(shí)現(xiàn)

一個(gè)簡單實(shí)用的MCU程序框架(非操作系統(tǒng),簡單調(diào)度任務(wù)) - 總體介紹

評論