zynq上的裸机lwip网络性能测试iperf使用心得

1 工程建立

vivado端

在zynq核中配置uart,ethernet以及DDR接口

将 QSPI 的引脚速度全部改为 fast。 配置 DDR3 控制器。配置完成点击"OK"。

在 Diagram 界面点击 Run Block Automation,在弹出的对话框中选择全部接 口,然后点击"OK"。

SDK端

导出硬件描述文件后,在打开的 SDK 软件中,新建一个工程并命名为 "ps_lwip"。

选择UDP Perf server模板

在zyng板卡上运行后,需要在电脑端(以windows为例,也可以使用linux四)使用iperf工具配合测试。

根据工程中readme四.xt文件描述,

===对应的工具是lperf2.0.5,请注意版本对应,使用过程中发现如果使用最新版本的iper3无法正常完成测试过程。也就是iperf3与iperf2是不兼容的。

工具下载地址:iperf2.0.5

直接运行程序

如果出现网络协商失败,则关闭带宽自动协商功能,选择1000M,修改BSP设置如下

zynq运行起来,通过串口打印出

在windows下的cmd终端中(perf工具所在地址运行cmd),运行指令:

复制代码
iperf -c 192.168.1.10 -i 5 -t 30 -u -b 1G

会出现如下信息

2 关键代码说明

性能优化配置

为实现千兆网速率(实测UDP可达950Mbps+),需调整以下关键参数:

配置完成后需重建BSP工程,确保参数生效。这些优化可使TCP速率从70Mbps提升至650Mbps以上,对于UDP通信同样能显著降低处理延迟。

1 创建UDP协议控制块 udp_new()

创建UDP协议控制块(PCB),返回struct udp_pcb*类型指针。这是UDP通信的句柄,需检查返回值是否为NULL以确认内存分配成功:

cpp 复制代码
struct udp_pcb *udp_pcb = udp_new();
if (!udp_pcb) {
    xil_printf("Failed to create UDP PCB\r\n");
    return -1;
}

2 绑定本地IP与端口 udp_bind()

cpp 复制代码
err_t err = udp_bind(udp_pcb, IP_ADDR_ANY, 5000); // 绑定5000端口
if (err != ERR_OK) {
    udp_remove(udp_pcb); // 绑定失败时释放资源
    return -2;
}

使用IP_ADDR_ANY表示监听所有本地网络接口。

3 数据接收--udp_recv()

设置接收回调函数,当UDP数据到达时自动触发:

cpp 复制代码
udp_recv(udp_pcb, udp_receive_callback, NULL);

回调函数原型必须符合以下格式:

cpp 复制代码
void udp_receive_callback(void *arg, struct udp_pcb *pcb, 
                         struct pbuf *p, const ip_addr_t *addr, u16_t port)

其中p为接收数据缓冲区,addrport表示发送方信息。

4 发送数据到指定IP地址 -- udp_sendto()

cpp 复制代码
struct pbuf *p = pbuf_alloc(PBUF_TRANSPORT, data_len, PBUF_RAM);
memcpy(p->payload, data, data_len);
err_t err = udp_sendto(udp_pcb, p, remote_ip, remote_port);
pbuf_free(p); // 必须释放pbuf

对于未连接的PCB(未调用udp_connect),需使用此函数指定目标地址;已连接的PCB可使用udp_send()简化调用。

关键注意事项

1 中断与轮询结合

裸机环境中需在主循环定期调用xemacif_input(netif),该函数负责将MAC硬件接收队列中的数据传递给LWIP协议栈。对于高吞吐量场景,可通过定时器中断触发该函数调用,推荐间隔不超过10ms。

2 pbuf管理

接收回调函数中必须使用pbuf_free(p)释放缓冲区,否则会导致内存泄漏。发送数据时,pbuf_alloc()的第三个参数建议使用PBUF_RAM(从RAM分配连续缓冲区),避免使用PBUF_REF(可能引发对齐问题)。

3 速率优化

若需提升UDP吞吐量,除BSP参数优化外,还可:

  • 增大PBUF_POOL_SIZE至8192字节
  • 使用pbuf_alloc(PBUF_RAW, size, PBUF_POOL)分配大缓冲区
  • 减少调试信息输出(xil_printf会显著降低吞吐量)

常见问题:

网络不通,需要先使用ping,验证网络是否正常,这一步通了,基本上就没问题了。

相关推荐
DLGXY2 小时前
STM32——DMA数据转换、DMA+AD多通道(十五)
stm32·单片机·嵌入式硬件
爱学嵌入式的小刘2 小时前
小白学UDP编程:从基础代码到优化实战(附完整可运行代码)
单片机·嵌入式硬件
来自晴朗的明天2 小时前
7、PCF8574 I2C 接口 GPIO 扩展电路
单片机·嵌入式硬件·硬件工程
qq_401700412 小时前
单片机调试进阶:IDE中的Register与Memory窗口以及断点与观察点 (Watchpoint)
单片机
繁星丶992 小时前
串口通信、TCP/UDP 通信和 MQTT 通信的概念与调试工具应用
单片机·tcp/ip·udp
傻童:CPU3 小时前
STM320F28377D的时钟配置
stm32·单片机·嵌入式硬件
小龙报3 小时前
【51单片机】串口通讯从入门到精通:原理拆解 + 参数详解 + 51 单片机实战指南
c语言·驱动开发·stm32·单片机·嵌入式硬件·物联网·51单片机
2023自学中3 小时前
imx6ull , 4.3寸800*480屏幕,触摸芯片型号 gt9147,显示触摸点的坐标数据
linux·嵌入式硬件
仰望星空的凡人3 小时前
探秘MCU最小系统中的晶振部分是如何工作的?
单片机·嵌入式硬件