1. 開發環境
作業系統:SylixOS
#程式設計環境:RealEvo-IDE3.1
硬體平台:AT9x25開發板
1. 技術實作
在編寫完成了網卡驅動,可以實現基本的發送與接收功能之後,本篇文章將簡單介紹如何優化網卡驅動的發送功能,提高發送的吞吐量和即時性。
1.1 網卡傳送吞吐量最佳化
網路卡驅動可透過零拷貝的方式來提升送運吞吐量。驅動裡呼叫enetCoreTx發送函數來實現乙太網路封包的發送。這個函數接收兩個參數,分別是netdev結構體類型指標和pbuf類型指標。 enetCoreTx會將pbuf指向的內容拷貝到發送描述符指向的DMA發送buffer中。這次拷貝對發送吞吐量造成一定影響。
因此,在最佳化時,可以將DMA描述符指向的buffer位址改為pbuf結構體成員payload指向真正需要發送封包的位址。具體實現如程序清單 21。
程式清單 21零拷貝最佳化
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變數表示是否需要進行零拷貝操作。
使用零拷貝最佳化時,需要注意以下幾個面向:
1. pbuf類型為REF或ROM類型時,不能進行零拷貝。
2. 進行零拷貝時需要呼叫API_CacheFlushPage函數,清除cache。同時,也需要呼叫 pbuf_ref函數,使得pbuf的成員ref值加1。
3. 呼叫pbuf_ref函數後,需要在中斷裡將進行零拷貝的pbuf手動free掉。 free時呼叫函數pbuf_free。 但是因為這個操作是在中斷中進行,因此如果在中斷服務函數中直接呼叫這個函數的話,會報 錯。具體實作時,可以採用工作佇列的方式,將需要釋放pbuf的操作加到工作佇列中進行。
2.2 網卡驅動即時發送
網卡驅動發送時,需要判斷目前的描述子是否可以用來進行封包的傳送,一般的操作是透過一個while循環來等待,當有描述符可以使用時,再進行傳送操作。這樣會對即時性有一定影響。
這裡可以採用信號量的方式來對發送流程進行最佳化,從而優化網路發送的即時性。
首先,在網路初始化的時候,建立一個數數型訊號量。數值就為目前設定的發送描述符的個數。
當需要進行傳送時,需要先呼叫API_SemaphoreCPend函數取得訊號量,成功取得後才能進行下面的傳送操作。
同樣的,在中斷服務函數裡,如果偵測為傳送成功中斷,則需要呼叫API_SemaphoreCPost函數釋放訊號量。
具體實作如程式清單 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
以上是如何實現SylixOS網路卡驅動最佳化的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

Safe Exam Browser
Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

Dreamweaver Mac版
視覺化網頁開發工具

WebStorm Mac版
好用的JavaScript開發工具

EditPlus 中文破解版
體積小,語法高亮,不支援程式碼提示功能

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),