SylixOS网卡驱动优化
来源:互联网 发布:centos squid安装配置 编辑:程序博客网 时间:2024/05/22 16:06
1.开发环境
- 操作系统:SylixOS
- 编程环境:RealEvo-IDE3.1
- 硬件平台:AT9x25开发板
2. 技术实现
在编写完成了网卡驱动,可以实现基本的发送与接收功能之后,本篇文章将简要介绍一下如何优化网卡驱动的发送功能,提高发送的吞吐量和实时性。
2.1 网卡发送吞吐量优化
网卡驱动可以通过零拷贝的方式来提升发送吞吐量。驱动里调用enetCoreTx发送函数来实现以太网报文的发送。这个函数接收两个参数,分别是netdev结构体类型指针和pbuf类型指针。enetCoreTx会将pbuf指向的内容拷贝到发送描述符指向的DMA发送buffer中。这次拷贝对发送吞吐量造成一定影响。
因此,在优化时,可以将DMA描述符指向的buffer地址改为pbuf结构体成员payload指向真正需要发送报文的地址。具体实现如程序清单 2-1。
> 程序清单 2-1 零拷贝优化
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函数释放信号量。
具体实现如程序清单 2-2 ,程序清单 2-3所示。
程序清单 2-2 获取信号量
#if AT_TX_REALTIME > 0 API_SemaphoreCPend(pEnet->NET_hTxRdyCnt, LW_OPTION_WAIT_INFINITE);#else
> 程序清单 2-3 释放信号量
#if AT_TX_REALTIME > 0 API_SemaphoreCPost(pEnet->NET_hTxRdyCnt);#endif
3. 参考资料
无
- SylixOS网卡驱动优化
- SylixOS网卡驱动框架
- SylixOS网卡驱动浅析
- SylixOS网卡驱动实现篇
- SylixOS网卡驱动调用篇
- SylixOS 网卡驱动netdev_notify函数分析
- SylixOS适配MPC8377网卡驱动(etsec)编写总结
- SylixOS音频驱动移植
- SylixOS USB虚拟网卡框架
- SylixOS I2C驱动框架浅析
- SylixOS I2C驱动框架概述
- SylixOS nand驱动框架理解
- SylixOS I2C驱动框架图
- SylixOS BSP tick驱动流程
- SylixOS CAN驱动框架之一
- SylixOS的LCD驱动移植
- SylixOS SPI Flash驱动移植
- SylixOS块设备驱动模型
- ssh互信详细步骤
- 如果您觉得文章有帮助,不妨请她喝杯水
- Ionic2 环境搭建 windows平台
- java编程思想读书笔记----第十五章 泛型
- Java NIO 与IO的区别
- SylixOS网卡驱动优化
- Java中的动态代理
- Json字符串对象解析
- 计算机文化学习笔记3
- 编程实战の计蒜客 自由之翼
- 写高质量OC代码52建议总结:34.以“自动释放池块”降低内存峰值
- 第一次项目开发之遇到问题及流程总结
- CF Educational Codeforces Round 20 D. Magazine Ad
- Java文档注释,