中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何實現SylixOS網卡驅動優化

發布時間:2022-01-10 09:47:23 來源:億速云 閱讀:122 作者:柒染 欄目:網絡安全

這篇文章將為大家詳細講解有關如何實現SylixOS網卡驅動優化,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。

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網卡驅動優化就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

曲靖市| 黄平县| 延庆县| 陆川县| 蒙自县| 长乐市| 崇文区| 合川市| 南投县| 曲阜市| 临邑县| 仁化县| 稻城县| 策勒县| 根河市| 庆元县| 古蔺县| 永春县| 怀远县| 白城市| 湘潭市| 丹阳市| 洪洞县| 托克托县| 泗阳县| 鄂尔多斯市| 安新县| 大田县| 积石山| 铁岭市| 晋中市| 康乐县| 霍林郭勒市| 衡水市| 淮阳县| 青阳县| 当雄县| 怀仁县| 富顺县| 涟源市| 比如县|