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,验证网络是否正常,这一步通了,基本上就没问题了。

相关推荐
唐山韩雅电气设备有限公司4 小时前
EOCR电动机保护器靠谱的厂家
python·单片机·嵌入式硬件
逐步前行5 小时前
STM32_EXTI_外部中断
stm32·单片机·嵌入式硬件
悠哉悠哉愿意5 小时前
【物联网学习笔记】RTC
笔记·单片机·嵌入式硬件·物联网·学习·实时音视频
YY_Share5 小时前
Console 接口介绍及电路设计
嵌入式硬件·硬件工程
工控小机6 小时前
STM32远程下载、调试终端介绍
stm32·单片机·嵌入式硬件·物联网
YY_Share6 小时前
主板调速风扇电路设计
单片机·嵌入式硬件·硬件工程
学嵌入式的小杨同学6 小时前
STM32 进阶封神之路(十四):语音交互实战 ——SU03T 语音识别模块从固件制作到 STM32 控制(串口通信 + 命令响应)
c++·stm32·单片机·嵌入式硬件·架构·硬件架构·ux
科技前瞻观察6 小时前
赋能智算升级|基于极海G32R501实时控制DSP MCU的AI服务器电源应用方案
服务器·人工智能·单片机
程序员杰森6 小时前
ESP32开发板+TB6612 x 2 四电机小车笔记
笔记·单片机·嵌入式硬件
阿拉斯攀登6 小时前
第 10 篇 RK 平台安卓驱动实战 3:PWM 驱动开发,实现 LED 呼吸灯 + 电机调速
驱动开发·嵌入式硬件·pwm·瑞芯微·嵌入式驱动·rk3576·嵌入式安卓