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

3. 参考资料

时间: 2024-10-16 19:24:46

SylixOS网卡驱动优化的相关文章

SylixOS网卡驱动调用篇

1. 开发环境 操作系统:SylixOS 编程环境:RealEvo-IDE3.1 硬件平台:IMX6Q实验箱 2. 技术实现 <SylixOS网卡驱动框架篇>里提过,网卡驱动的收发功能是通过netdev结构里的transmit和receive两个成员实现的.本篇文章将介绍SylixOS里的LWIP协议栈是如何调用底层网卡驱动里的这两个成员函数的. 2.1      网卡发送函数的调用 整个网卡驱动发送函数的调用关系如图 21所示. 网卡驱动在向SylixOS注册网卡驱动时,需要调用netdev

SylixOS网卡驱动实现篇

1. 开发环境  操作系统:SylixOS 编程环境:RealEvo-IDE3.1 硬件平台:IMX6Q实验箱 2. 技术实现 网卡驱动的收发功能,是通过管理收发描述符的方式实现的.因此,在MAC初始化的时候需要对描述符也进行相应的初始化操作.初始化内容会因CPU的不同而有所区别.当描述符初始化完毕之后,就可以用他们来进行网络报文的收发. 2.1 网络发送函数的实现 网络驱动的发送函数通过enetCoreTx函数实现,具体实现如程序清单 2-1. 程序清单 2-1 发送函数  /********

Linux 网卡驱动学习(六)(应用层、tcp 层、ip 层、设备层和驱动层作用解析)

本文将介绍网络连接建立的过程.收发包流程,以及当中应用层.tcp层.ip层.设备层和驱动层各层发挥的作用. 1.应用层 对于使用socket进行网络连接的server端程序.我们会先调用socket函数创建一个套接字: fd = socket(AF_INET, SOCK_STREAM, 0); 以上指定了连接协议,socket调用返回一个文件句柄,与socket文件相应的inode不在磁盘上,而是存在于内存. 之后我们指定监听的port.同意与哪些ip建立连接,并调用bind完毕port绑定:

linux下安装编译网卡驱动的方法

安装linux操作系统后发现没有网卡驱动,表现为 system → Administration → Network下Hardware列表为空. 以下为安装编译网卡驱动的过程,本人是菜鸟,以下是我从网上找的资料进行整理,并实际操作的过程,仅供借鉴.  一.检测linux系统内核版本和网卡类型,相关命令如下: uname -r                    查看linux内核版本 (uname -a 可显示所有信息)lsmod                        设备加载情况 l

VMware 升级esxi网卡驱动的几个相关命令

1.将下载的驱动上传到要升级的esxi storage 2.开启esxi主机的SSH功能 3. 列出当前ESXi主机上所有NICs的状态 esxcli network nic list 4.查看网卡驱动版本及固件版本 esxcli network nic get -n vmnic2 Advertised Auto Negotiation: false Advertised Link Modes: 10000baseT/Full Auto Negotiation: false Cable Type

ubuntu16.04安装I219-V网卡驱动问题解决方法

安装ubuntu16.04 LTS后无网络连接的解决方法: 1.查看是否安装网卡驱动 打开终端,输入ifconfig –a,如果出现"本地环回"字样,说明网卡驱动未安装. 2.查看网卡型号 终端输入lspci,查看网卡型号,本文只针对I219-V网卡驱动. 3.下载e1000e网卡驱动,下载地址https://downloadcenter.intel.com/zh-cn/download/15817?_ga=1.159975677.114505945.1484457019 因官网i21

linux enc28j60网卡驱动移植(硬件spi和模拟spi)

本来想移植DM9000网卡的驱动,无奈硬件出了点问题,通过杜邦线链接开发板和DM9000网卡模块,系统上电,还没加载网卡驱动就直接崩溃了,找不到原因...刚好手上有一个enc28j60的网卡模块,于是就着手移植enc28j60的驱动. 其实移植enc28j60的驱动也十分简单,网上有现成的,只需要分配一些硬件资源即可. 由于我的内核版本老到掉牙,没有自带enc28j60的驱动,只能在网上找一个: enc28j60.c http://git.ti.com/ti-linux-kernel/ti-li

linux网卡驱动移植

这里重要的是物理层PHY receiver,MAC(media access control)层,这里与软件中的协议栈不同,在硬件上MAC是PHY的下一层.DM9000A将MAC和PHY做到一起,也可以像IIS设备那样,SOC内有IIS的控制器,而声卡UDA1341放在片外.网卡当然也有这种设计,它是把PHY的下层MAC放入SOC内,片外的是PHY,当然我暂时还没见过这种的.DM9000A的输入是并行的总线,可以和CPU直接IO.而IIS那种需要通过:CPU CORE BUS->I2S控制器->

【ESXI6.0】 ESXI6.0安装时无法安装网卡驱动的解决方法及将网卡驱动加载进ISO

若安装时提示如下图所示 之后安装无法完成,会提示没有检测到网络适配器,如下图. 这时候需要将网卡驱动加载进ISO中才能在安装时候识别网卡驱动. 网卡驱动从这里下载: https://vibsdepot.v-front.de/wiki/index.php/List_of_currently_available_ESXi_packages 找到对应的型号.点击进入下一页下载. 需要使用如下工具: ESXi-Customizer-v2.7.2 http://pan.baidu.com/s/1eQ2f8