如何實現(xiàn)SylixOS網(wǎng)卡驅(qū)動優(yōu)化

這篇文章將為大家詳細(xì)講解有關(guān)如何實現(xiàn)SylixOS網(wǎng)卡驅(qū)動優(yōu)化,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關(guān)知識有一定的了解。

為隆化等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計制作服務(wù),及隆化網(wǎng)站建設(shè)行業(yè)解決方案。主營業(yè)務(wù)為網(wǎng)站設(shè)計制作、成都網(wǎng)站制作、隆化網(wǎng)站設(shè)計,以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會得到認(rèn)可,從而選擇與我們長期合作。這樣,我們也可以走得更遠(yuǎn)!

1. 開發(fā)環(huán)境

  • 操作系統(tǒng):SylixOS

  • 編程環(huán)境:RealEvo-IDE3.1

  • 硬件平臺:AT9x25開發(fā)板

1. 技術(shù)實現(xiàn)

在編寫完成了網(wǎng)卡驅(qū)動,可以實現(xiàn)基本的發(fā)送與接收功能之后,本篇文章將簡要介紹一下如何優(yōu)化網(wǎng)卡驅(qū)動的發(fā)送功能,提高發(fā)送的吞吐量和實時性。

1.1      網(wǎng)卡發(fā)送吞吐量優(yōu)化

網(wǎng)卡驅(qū)動可以通過零拷貝的方式來提升發(fā)送吞吐量。驅(qū)動里調(diào)用enetCoreTx發(fā)送函數(shù)來實現(xiàn)以太網(wǎng)報文的發(fā)送。這個函數(shù)接收兩個參數(shù),分別是netdev結(jié)構(gòu)體類型指針和pbuf類型指針。enetCoreTx會將pbuf指向的內(nèi)容拷貝到發(fā)送描述符指向的DMA發(fā)送buffer中。這次拷貝對發(fā)送吞吐量造成一定影響。

因此,在優(yōu)化時,可以將DMA描述符指向的buffer地址改為pbuf結(jié)構(gòu)體成員payload指向真正需要發(fā)送報文的地址。具體實現(xiàn)如程序清單 21。

程序清單 21零拷貝優(yōu)化

  if (usLen == pstPbuf->len) {
        if ((pstPbuf->type != PBUF_REF)&& (pstPbuf->type != PBUF_ROM)) {
            bCopy = LW_FALSE;
        }
    }
 
    if (!bCopy) {
        pbuf_ref(pstPbuf);
       pEnet->pTxRing[iHead].iTxBaddr = (UINT32)pstPbuf->payload;
        API_CacheFlushPage(DATA_CACHE,pstPbuf->payload, pstPbuf->payload, LW_CFG_VMM_PAGE_SIZE);
    } else {
       pEnet->pTxRing[iHead].iTxBaddr =(UINT32)pEnet->NET_pTxInfo[iHead].TXI_pvDmaAddr;
        pbuf_copy_partial(pstPbuf,(PVOID)(pEnet->pTxRing[iHead].iTxBaddr), usLen, 0);
    }

上述代碼中的,bCopy變量表明是否需要進(jìn)行零拷貝操作。

使用零拷貝優(yōu)化時,需要注意以下幾個方面:

        1.  pbuf類型為REF或者ROM類型時,不能進(jìn)行零拷貝。

        2.  在進(jìn)行零拷貝時需要調(diào)用API_CacheFlushPage函數(shù),清除cache。同時,還需要調(diào)用          pbuf_ref函數(shù),使得pbuf的成員ref值加1。

   3. 調(diào)用pbuf_ref函數(shù)后,需要在中斷里將進(jìn)行零拷貝的pbuf手動free掉。free時調(diào)用函數(shù)pbuf_free。      但是因為這個操作是在中斷中進(jìn)行,因此如果在中斷服務(wù)函數(shù)中直接調(diào)用這個函數(shù)的話,會報      錯。具體實現(xiàn)時,可以采用工作隊列的方式,將需要釋放pbuf的操作加到工作隊列中進(jìn)行。

2.2      網(wǎng)卡驅(qū)動實時發(fā)送

網(wǎng)卡驅(qū)動發(fā)送時,需要判斷一下當(dāng)前的描述符是否可以用來進(jìn)行報文的發(fā)送,一般的操作是通過一個while循環(huán)來等待,當(dāng)有描述符可以使用時,再進(jìn)行發(fā)送操作。這樣會對實時性有一定影響。

這里可以采用信號量的方式來對發(fā)送流程進(jìn)行優(yōu)化,從而優(yōu)化網(wǎng)絡(luò)發(fā)送的實時性。

首先,在網(wǎng)絡(luò)初始化的時候,創(chuàng)建一個計數(shù)型信號量。數(shù)值就為當(dāng)前設(shè)置的發(fā)送描述符的個數(shù)。

當(dāng)需要進(jìn)行發(fā)送時,需要先調(diào)用API_SemaphoreCPend函數(shù)獲取信號量,成功獲取之后才能進(jìn)行下面的發(fā)送操作。

同樣的,在中斷服務(wù)函數(shù)里,如果檢測為發(fā)送成功中斷,則需要調(diào)用API_SemaphoreCPost函數(shù)釋放信號量。

具體實現(xiàn)如程序清單 22 ,程序清單 23所示。

程序清單 22獲取信號量

#ifAT_TX_REALTIME > 0
    API_SemaphoreCPend(pEnet->NET_hTxRdyCnt,LW_OPTION_WAIT_INFINITE);
#else

程序清單 23釋放信號量

#ifAT_TX_REALTIME > 0
     API_SemaphoreCPost(pEnet->NET_hTxRdyCnt);
#endif

關(guān)于如何實現(xiàn)SylixOS網(wǎng)卡驅(qū)動優(yōu)化就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

分享名稱:如何實現(xiàn)SylixOS網(wǎng)卡驅(qū)動優(yōu)化
鏈接URL:http://bm7419.com/article8/gijgop.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供靜態(tài)網(wǎng)站App開發(fā)、小程序開發(fā)、品牌網(wǎng)站制作、網(wǎng)頁設(shè)計公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

手機(jī)網(wǎng)站建設(shè)