您好,登錄后才能下訂單哦!
這篇文章將為大家詳細(xì)講解有關(guān)如何實(shí)現(xiàn)SylixOS網(wǎng)卡驅(qū)動(dòng)優(yōu)化,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。
操作系統(tǒng):SylixOS
編程環(huán)境:RealEvo-IDE3.1
硬件平臺(tái):AT9x25開發(fā)板
在編寫完成了網(wǎng)卡驅(qū)動(dòng),可以實(shí)現(xiàn)基本的發(fā)送與接收功能之后,本篇文章將簡(jiǎn)要介紹一下如何優(yōu)化網(wǎng)卡驅(qū)動(dòng)的發(fā)送功能,提高發(fā)送的吞吐量和實(shí)時(shí)性。
網(wǎng)卡驅(qū)動(dòng)可以通過零拷貝的方式來提升發(fā)送吞吐量。驅(qū)動(dòng)里調(diào)用enetCoreTx發(fā)送函數(shù)來實(shí)現(xiàn)以太網(wǎng)報(bào)文的發(fā)送。這個(gè)函數(shù)接收兩個(gè)參數(shù),分別是netdev結(jié)構(gòu)體類型指針和pbuf類型指針。enetCoreTx會(huì)將pbuf指向的內(nèi)容拷貝到發(fā)送描述符指向的DMA發(fā)送buffer中。這次拷貝對(duì)發(fā)送吞吐量造成一定影響。
因此,在優(yōu)化時(shí),可以將DMA描述符指向的buffer地址改為pbuf結(jié)構(gòu)體成員payload指向真正需要發(fā)送報(bào)文的地址。具體實(shí)現(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)化時(shí),需要注意以下幾個(gè)方面:
1. pbuf類型為REF或者ROM類型時(shí),不能進(jìn)行零拷貝。
2. 在進(jìn)行零拷貝時(shí)需要調(diào)用API_CacheFlushPage函數(shù),清除cache。同時(shí),還需要調(diào)用 pbuf_ref函數(shù),使得pbuf的成員ref值加1。
3. 調(diào)用pbuf_ref函數(shù)后,需要在中斷里將進(jìn)行零拷貝的pbuf手動(dòng)free掉。free時(shí)調(diào)用函數(shù)pbuf_free。 但是因?yàn)檫@個(gè)操作是在中斷中進(jìn)行,因此如果在中斷服務(wù)函數(shù)中直接調(diào)用這個(gè)函數(shù)的話,會(huì)報(bào) 錯(cuò)。具體實(shí)現(xiàn)時(shí),可以采用工作隊(duì)列的方式,將需要釋放pbuf的操作加到工作隊(duì)列中進(jìn)行。
網(wǎng)卡驅(qū)動(dòng)發(fā)送時(shí),需要判斷一下當(dāng)前的描述符是否可以用來進(jìn)行報(bào)文的發(fā)送,一般的操作是通過一個(gè)while循環(huán)來等待,當(dāng)有描述符可以使用時(shí),再進(jìn)行發(fā)送操作。這樣會(huì)對(duì)實(shí)時(shí)性有一定影響。
這里可以采用信號(hào)量的方式來對(duì)發(fā)送流程進(jìn)行優(yōu)化,從而優(yōu)化網(wǎng)絡(luò)發(fā)送的實(shí)時(shí)性。
首先,在網(wǎng)絡(luò)初始化的時(shí)候,創(chuàng)建一個(gè)計(jì)數(shù)型信號(hào)量。數(shù)值就為當(dāng)前設(shè)置的發(fā)送描述符的個(gè)數(shù)。
當(dāng)需要進(jìn)行發(fā)送時(shí),需要先調(diào)用API_SemaphoreCPend函數(shù)獲取信號(hào)量,成功獲取之后才能進(jìn)行下面的發(fā)送操作。
同樣的,在中斷服務(wù)函數(shù)里,如果檢測(cè)為發(fā)送成功中斷,則需要調(diào)用API_SemaphoreCPost函數(shù)釋放信號(hào)量。
具體實(shí)現(xiàn)如程序清單 22 ,程序清單 23所示。
程序清單 22獲取信號(hào)量
#ifAT_TX_REALTIME > 0 API_SemaphoreCPend(pEnet->NET_hTxRdyCnt,LW_OPTION_WAIT_INFINITE); #else
程序清單 23釋放信號(hào)量
#ifAT_TX_REALTIME > 0 API_SemaphoreCPost(pEnet->NET_hTxRdyCnt); #endif
關(guān)于如何實(shí)現(xiàn)SylixOS網(wǎng)卡驅(qū)動(dòng)優(yōu)化就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。