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

相关推荐
意法半导体STM327 小时前
【官方原创】使用GPDMA进行SPI LCD整屏传输 LAT1435
网络·stm32·单片机·嵌入式硬件·mcu·网络协议·stm32开发
姜太公钓鲸2338 小时前
时钟周期是什么?
单片机·嵌入式硬件
bing_feilong8 小时前
Jetson Orin Nano(3): Button Header
嵌入式硬件
悠哉悠哉愿意8 小时前
【物联网学习笔记】中断
笔记·单片机·嵌入式硬件·物联网·学习
是大强8 小时前
RS-232和RS-485区别
嵌入式硬件
古译汉书8 小时前
【IoT死磕系列】Day 6:工业控制底层大动脉—CAN总线
linux·网络·arm开发·单片机·物联网·tcp/ip
LCMICRO-133108477468 小时前
长芯微LSC3490完全P2P替代MAX3490,3.3V 高静电防护 10M 全双工 RS485/RS422 收发器
单片机·嵌入式硬件·fpga开发·硬件工程·dsp开发
2501_918126918 小时前
stm32是用杜邦线母头接核心板和调试器吗
stm32·单片机·嵌入式硬件·学习·个人开发
二十画~书生9 小时前
攻克BGA扇出+高速信号难题—逻辑派FPGA-G1开发板6层PCB全流程设计总结
嵌入式硬件·fpga开发·硬件工程·pcb工艺
Yyq130208696829 小时前
实时时钟和日历电路-MS85163-替PCF8563等
单片机·嵌入式硬件·fpga开发