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为接收数据缓冲区,addr和port表示发送方信息。
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,验证网络是否正常,这一步通了,基本上就没问题了。