0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于pSoSystem操作系統(tǒng)實現(xiàn)通用網(wǎng)絡(luò)代碼框架的設(shè)計

電子設(shè)計 ? 來源:廈門大學(xué)學(xué)報:自然科學(xué) ? 作者:陳海華,胡林,楊 ? 2021-05-27 10:40 ? 次閱讀

作者:陳海華,胡林,楊晨暉

pSoSystem操作系統(tǒng)簡介

pSoSystem是一種專門用以嵌入式處理器的高性能的、模塊化的操作系統(tǒng)?;陂_放操作系統(tǒng)標準,它提供了一種復(fù)雜的多任務(wù)運行環(huán)境。同時,它也提供了一系列的集成開發(fā)工具,這些開發(fā)工具可用于Unix系統(tǒng),也可用于Windows系統(tǒng)。另外,由于pSoSystem是一種模塊化的操作系統(tǒng),所以,開發(fā)人員可以根據(jù)需要,選用不同的操作系統(tǒng)模塊。這樣,就使得我們沒有必要把一個龐大的操作系統(tǒng)全部加載到嵌入式系統(tǒng)設(shè)備上。比如說,如果我們的應(yīng)用系統(tǒng)不需要支持文件功能,則可以不用加載文件系統(tǒng)。這樣,就可以大大縮減操作系統(tǒng)的尺寸.pSoSystem的整個系統(tǒng)結(jié)構(gòu)如圖1所示。

圖1pSOS系統(tǒng)框圖

pSoSystem網(wǎng)絡(luò)設(shè)備驅(qū)動程序概述

網(wǎng)絡(luò)驅(qū)動在pSoSystem里有作專門的處理,它不是直接和pSOS+內(nèi)核模塊的I/Osupervisor打交道,而是和pNA+網(wǎng)絡(luò)模塊打交道。和I/O監(jiān)管層一樣,為了屏蔽具體硬件之間的差異,pNA+也為網(wǎng)絡(luò)驅(qū)動程序提供了一個中間層,稱之為NI(NetworkInterface)層。在NI層,它為上層提供了一系列的標準網(wǎng)絡(luò)接口函數(shù)(如網(wǎng)卡初始化,網(wǎng)絡(luò)包發(fā)送等),這些接口函數(shù)是在網(wǎng)絡(luò)驅(qū)動程序里實現(xiàn),而由pNA+模塊里的其它網(wǎng)絡(luò)層調(diào)用。要編寫網(wǎng)絡(luò)驅(qū)程,就是要具體實現(xiàn)這幾個接口函數(shù)。圖2是網(wǎng)絡(luò)驅(qū)動程序在pSoSystem中的模型圖。

圖2網(wǎng)絡(luò)驅(qū)動模型

通用網(wǎng)絡(luò)驅(qū)動模型的設(shè)計

通用網(wǎng)絡(luò)驅(qū)動模型的整體設(shè)計思想,就是將獨立于具體硬件的操作抽象出來,以形成一個通用的代碼框架。具體來說,主要包括以下幾個部分:

a) 底層驅(qū)動和上層應(yīng)用的分離層次模型設(shè)計;

b) 由上述分離層次所得到的相應(yīng)接口函數(shù)的設(shè)計;

c) 網(wǎng)卡數(shù)據(jù)包接收、發(fā)送的抽象代碼框架的設(shè)計;

下面,本文將就上述3個方面的設(shè)計作一個較為全面的分析。

底層驅(qū)動和上層應(yīng)用的分離層次模型設(shè)計

顯然,這一塊的設(shè)計是整個驅(qū)動模型設(shè)計的首要部分。只有將底層驅(qū)動和上層應(yīng)用有效地分離出來,才能保證代碼的獨立性與重用性,從而也使得驅(qū)動程序的開發(fā)者不用過多地關(guān)心上層應(yīng)用,符合現(xiàn)代軟件的設(shè)計思想。關(guān)于這一部分的設(shè)計,pSoSys2tem已經(jīng)幫助我們完成,其所提供的網(wǎng)絡(luò)驅(qū)動模型就是一個典型的軟件分層設(shè)計實例。詳情請看圖2.

接口函數(shù)的設(shè)計

一般來說,根據(jù)上述所設(shè)計的驅(qū)動程序分層模型,都會為上下兩層的溝通提供一些標準的接口函數(shù)。顯然,這些接口函數(shù)的實現(xiàn),大部分是和底層硬件具體相關(guān)的,但其操作步驟卻是大同小異的。因此,在我們的通用驅(qū)動模型框架里,就是要抽象出獨立于具體硬件的一般操作,以形成一個通用的代碼框架,在這里,我們一般就以偽C代碼形式來給出各個接口函數(shù)的一般實現(xiàn)。

(1)NiLan接口函數(shù)的設(shè)計與分析

NiLan是pNA+層和網(wǎng)絡(luò)驅(qū)動掛接的一個最為重要的接口函數(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);

/*通過這個函數(shù)的調(diào)用,將NiLan函數(shù)安裝到了pNA+模塊中去了*/

FreeMemPtr=SetupLanParams(BSP-LAN1-PKB,F(xiàn)reeMemPtr);

/*在pNA+模塊里為網(wǎng)卡要用到的接收與發(fā)送等緩存分配空間*/

}

代碼1

通過這個函數(shù),pNA+層可以完成所有有關(guān)網(wǎng)絡(luò)應(yīng)用的調(diào)用。其具體做法就是:由pNA+層傳入不同的功能號,以達到調(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è)計與分析

此函數(shù)主要是用來配置和初始化網(wǎng)卡的各種硬件和軟件資源,具體功能如下所述:

a)初始化buffers,主要是將其鏈成鏈表,以方便操作;

b)初始化網(wǎng)卡相關(guān)的寄存器,最重要的就是收發(fā)寄存器的首址RxDesc和TxDesc;

c)初始化收發(fā)寄存器,主要是將其鏈成隊列,以方便內(nèi)存的循環(huán)使用;

staticlongni-init(void)

{

InitBuffers();/*初始化buffer,主要是將

其鏈成鏈表*/

InstallIsr();/*安裝中斷服務(wù)程序,最重要

的就是網(wǎng)絡(luò)數(shù)據(jù)接收中斷*/

InitDescps()/*將收發(fā)寄存器鏈成隊列*/

lanInit();/*初始化網(wǎng)卡的各個寄存器*/

}

代碼3

網(wǎng)卡數(shù)據(jù)包收發(fā)代碼框架的設(shè)計與分析

設(shè)計通用網(wǎng)卡驅(qū)動模型,顯然,數(shù)據(jù)包的收發(fā)是最為重要的與具體硬件有關(guān)的操作,如何去除具體硬件的相關(guān)性,而抽象出獨立于各種硬件的一般的收發(fā)代碼,則顯得非常重要。下面,將就網(wǎng)卡收發(fā)過程的一般步驟進行分析。

(1)網(wǎng)卡數(shù)據(jù)包的發(fā)送過程其具體步驟如下所示

a)應(yīng)用程序為了發(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的具體實現(xiàn)參看代碼2,這里,主要解釋一下其傳入的參數(shù);function:功能號,NiLan將根據(jù)不同的功能號調(diào)用合適的NI層的函數(shù);p:NI層的入口點,即上層和下層交換數(shù)據(jù)的地方,發(fā)送數(shù)據(jù)時,由這個入口點將相應(yīng)的數(shù)據(jù)由pNA+層傳入NI層,同樣,接收數(shù)據(jù)時,也是由這個入口點將NI層收到的數(shù)據(jù)上傳給pNA+層。

c)NI層收到pNA+層傳入的數(shù)據(jù)之后,則將待發(fā)送數(shù)據(jù)組裝成數(shù)據(jù)幀,以便接下來移

入網(wǎng)卡的發(fā)送寄存器發(fā)送出去,其相應(yīng)的實現(xiàn)代碼如下所示:

staticvoidni-send(char*hwa-ptr,char*pkbpt

r,USHORTtype)

{

tx-hdr=InitMblk();/3初始化三元組,一個三元組里存放一個數(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ù)時,有一個獨立的發(fā)送數(shù)據(jù)的函數(shù),而在網(wǎng)卡的接收數(shù)據(jù)的過程中,并不存在這樣一個獨立的函數(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(),這個函數(shù)是真正負責網(wǎng)卡數(shù)據(jù)接收的地方,其工作原理就是讀取網(wǎng)卡相應(yīng)的接收寄存器,并通知pNA+層將數(shù)據(jù)取走;

staticvoidRxBufRcv(void)

{

for(;;)

{

good=CheckFrame()/*判斷接收的數(shù)據(jù)包是否出錯*/

if(good==TRUE)/*如果數(shù)據(jù)包沒有出錯,則將它交給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ù)取走。至此,一個數(shù)據(jù)包的接收過程全部完成;注:Announce是一個回調(diào)函數(shù),即在pNA+模塊中定義的,由NI層調(diào)用的函數(shù);

驅(qū)動程序的安裝

在pSOS中,一般的驅(qū)動程序安裝是通過修改drv-conf.c(pSoSystem操作系統(tǒng)里的一個系統(tǒng)配置文件)中的InstallDriver來完成。而網(wǎng)絡(luò)驅(qū)動程序在pSoSystem里有作專門的處理,它是通過調(diào)用drvconf.c中的SetUpNi函數(shù)來實現(xiàn)的,而SetUpNi則會調(diào)用pSoSystem所提供的InstallDriver來最后完成網(wǎng)絡(luò)驅(qū)動程序的安裝。當然,最后還需要重新編譯pSoSystem的內(nèi)核,從而將我們的驅(qū)動程序模塊加載到pSoSystem系統(tǒng)模塊中。具體實現(xiàn)可以參看前面的代碼1.

結(jié)束語

本文只給出了通用網(wǎng)絡(luò)驅(qū)動模型的最重要部分的設(shè)計與分析,至于其它一些細節(jié)函數(shù),限于篇幅,本文未做詳述。有興趣的讀者,可以進一步參看文末所附的參考文獻。最后,希望本文能對有心開發(fā)類似應(yīng)用的工程技術(shù)人員有所幫助。

責任編輯:gt

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 處理器
    +關(guān)注

    關(guān)注

    68

    文章

    19286

    瀏覽量

    229841
  • 嵌入式
    +關(guān)注

    關(guān)注

    5082

    文章

    19126

    瀏覽量

    305192
  • 操作系統(tǒng)
    +關(guān)注

    關(guān)注

    37

    文章

    6825

    瀏覽量

    123331
收藏 人收藏

    評論

    相關(guān)推薦

    一個判斷操作系統(tǒng)的VBScript腳本代碼

    西門子觸摸屏基于不同的Windows操作系統(tǒng),有的是標準的Windows系統(tǒng),有的是嵌入式操作系統(tǒng)Windows CE。這兩種系統(tǒng)對于VBScript腳本的支持不同,因此在使用腳本編程
    發(fā)表于 09-21 14:56 ?596次閱讀

    嵌入式操作系統(tǒng)通用硬件抽象層設(shè)計

    層API能夠在下層硬件平臺上實現(xiàn),那么操作系統(tǒng)和應(yīng)用程序的代碼就可以移植。圖1 引入HAL后的嵌入式系統(tǒng)結(jié)構(gòu)這樣,原先嵌入式系統(tǒng)的3層結(jié)構(gòu)逐
    發(fā)表于 12-07 10:30

    嵌入式操作系統(tǒng)怎么實現(xiàn)網(wǎng)絡(luò)加載?

    在復(fù)雜的應(yīng)用系統(tǒng)中通常都需要嵌入式操作系統(tǒng)的支持,這樣嵌入式操作系統(tǒng)鏡像文件的尺寸往往就會變得比較大??梢赃x擇通過網(wǎng)絡(luò)將嵌入式操作系統(tǒng)加載到
    發(fā)表于 03-18 08:20

    如何實現(xiàn)嵌入式操作系統(tǒng)網(wǎng)絡(luò)加載?

    如何實現(xiàn)嵌入式操作系統(tǒng)網(wǎng)絡(luò)加載?
    發(fā)表于 04-28 06:42

    Firefly通過網(wǎng)絡(luò)遠程掛載操作系統(tǒng)設(shè)計實現(xiàn)

    技術(shù)方案是通過NFS(Network File System)網(wǎng)絡(luò)文件系統(tǒng)從而實現(xiàn)了遠程掛載操作系統(tǒng)。例如:用戶可把系統(tǒng)文件集中放置在NFS
    發(fā)表于 04-07 16:08

    很小的ARM操作系統(tǒng)代碼

    很小的ARM操作系統(tǒng)代碼
    發(fā)表于 12-26 00:21 ?48次下載
    很小的ARM<b class='flag-5'>操作系統(tǒng)</b>源<b class='flag-5'>代碼</b>

    簡述幾種實時多任務(wù)操作系統(tǒng)

    從整體上介紹VxWorks、pSOSystem、Hopen OS、Pencil、CMX、PTXC 幾種實時操作系統(tǒng)(RTOS)及其特點, 有助于RTOS 選型。
    發(fā)表于 05-13 15:44 ?17次下載

    計算機網(wǎng)絡(luò)網(wǎng)絡(luò)操作系統(tǒng)

    理解網(wǎng)絡(luò)操作系統(tǒng)的功能與作用,了解常用網(wǎng)絡(luò)操作系統(tǒng)如WINDOWS操作系統(tǒng)、LINUX 操作系統(tǒng)
    發(fā)表于 08-05 17:50 ?3次下載

    操作系統(tǒng)網(wǎng)絡(luò)計算機的啟動研究

    介紹了一種基于集成的方法將多個單操作系統(tǒng)NC 的啟動程序代碼整合成一個多操作系統(tǒng)NC 啟動環(huán)境的方法。文中著重介紹了單操作系統(tǒng)NC 的啟動原理及多
    發(fā)表于 09-02 11:21 ?13次下載

    嵌入式操作系統(tǒng)通用硬件抽象層設(shè)計

    摘要 基于嵌入式操作系統(tǒng)硬件抽象層理論,設(shè)計一種用于嵌入式操作系統(tǒng)內(nèi)核開發(fā)的通用硬件抽象層平臺。通用硬件抽象層能夠為嵌入式操作系統(tǒng)內(nèi)核的設(shè)計
    發(fā)表于 03-29 15:16 ?1196次閱讀
    嵌入式<b class='flag-5'>操作系統(tǒng)</b>的<b class='flag-5'>通用</b>硬件抽象層設(shè)計

    網(wǎng)絡(luò)操作系統(tǒng)

    網(wǎng)絡(luò)操作系統(tǒng)           
    發(fā)表于 12-17 11:50 ?730次閱讀

    什么是網(wǎng)絡(luò)操作系統(tǒng)(NOS)

    什么是網(wǎng)絡(luò)操作系統(tǒng)(NOS) 網(wǎng)絡(luò)操作系統(tǒng)(NOS)是網(wǎng)絡(luò)的心臟和靈魂,是向網(wǎng)絡(luò)計算機提供服務(wù)
    發(fā)表于 04-03 15:07 ?2932次閱讀

    嵌入式實時操作系統(tǒng)pSOSystem系統(tǒng)

    This manual is part of a documentation set that describes pSOSystem, the modular, high-performance
    發(fā)表于 05-09 15:55 ?28次下載

    嵌入式操作系統(tǒng)網(wǎng)絡(luò)加載實現(xiàn)

      在復(fù)雜的應(yīng)用系統(tǒng)中通常都需要嵌入式操作系統(tǒng)的支持,這樣嵌入式操作系統(tǒng)鏡像文件的尺寸往往就會變得比較大??梢赃x擇通過網(wǎng)絡(luò)將嵌入式操作系統(tǒng)
    發(fā)表于 08-25 14:02 ?1269次閱讀
    嵌入式<b class='flag-5'>操作系統(tǒng)</b>的<b class='flag-5'>網(wǎng)絡(luò)</b>加載<b class='flag-5'>實現(xiàn)</b>

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

    。實際上,在我的使用過程中發(fā)現(xiàn),應(yīng)用這類實時操作系統(tǒng)的場景其實非常小,更多的應(yīng)用無需操作系統(tǒng),要做的只有簡單的幾個事情。?在無操作系統(tǒng)的程序上,如果沒有一個框架
    發(fā)表于 12-08 14:06 ?6次下載
    一個簡單實用的MCU程序<b class='flag-5'>框架</b>(非<b class='flag-5'>操作系統(tǒng)</b>,簡單調(diào)度任務(wù)) - 總體介紹