如何实现SylixOS网卡驱动优化-创新互联

这篇文章将为大家详细讲解有关如何实现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网卡驱动优化就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


本文标题:如何实现SylixOS网卡驱动优化-创新互联
文章地址:http://azwzsj.com/article/ddjdih.html