下面的文章转自STM8/STM32 社区(http://www.stmcu.org.cn/module/forum/thread-611925-1-1.html)。和我最近测试的结果大致相同,STM32F7 上TCP 速率3Mbps左右。而之前我测试UDP,可以到30Mbps 以上。
1、测试目的
在尽量保持硬件和软件一致的前提下,测试LWIP和DJYIP两个协议栈的TCP接收不同包的速度。
2、测试方法
用一块STM32F7的发送板,应用层无延迟调用TCP发送函数send(),不断发送不同大小的数据包,数据包大小范围64 ~ 1460byte,接收端每1秒统计接收到的数据包,交终端上显示接收的速度。(当然,运行LWIP和DJYIP的两块接收板,运行在相同的主频,协议栈的pbuf缓冲、TCP接收窗口大小、优先级等一致。)
3、软硬件平台
硬件平台
LWIP DJYIP
运行板件 ST官方板STM32756G-EVAL2 STM32F7核心板
运行主频 200MHz 200MHz
连接方式 与发送板直连 与发送板直连
编译调试 MDK eclipse
软件平台
LWIP DJYIP
网络驱动接收方式 中断 中断
pbuf大小 16kbytes 16kbytes
TCP窗口
2048
2048
其中,运行在STM32756G-EVAL2的LWIP的软件代码,是直接从ST官方下载的STM32Cube_FW_F7_V1.6.0版本固件库,
编译运行在MDK5.12.
4、测试步骤
(1)源码编写及修改
主要是比较基础的socket编程,发送板作为TCP客户端,两块接收板作为TCP服务器,客户端板建立TCP连接后,一直
发送程序,服务器一直接收TCP数据,并统计接收速度。
对STM32Cube_FW_F7_V1.6.0源码中LWIP的配置,需要修改lwipopts.h,主要修改了如下两行代码
#define PBUF_POOL_SIZE 11//8
#define TCP_WND 2048//(2*TCP_MSS)
(2)客户端发送
while(1)
{
byMsgBuf[0] = byMsgBuf[0] + 1;
if(ClientSndRand)
{
iMsgLen = (int)(drand48() * TCP_PKG_LEN_MAX);
}
else
{
iMsgLen = ClientSndLen;
}
if(iMsgLen)
iMsgLen = send(sockfd, byMsgBuf, iMsgLen, 0);
}
(3)服务器接收
while(1)
{
iMsgLen = recv( sFd, byMsgBuf, SvrRcvLen, 0);
iMsgCnt += iMsgLen;
}
5、测试结果
测试结果如下表所示
发送包(byte) LWIP(Mbytes/s) DJYIP(Mbytes/s)
1400 3.02 3.18
1024 4.22 3.16
512 3.07 3
256 2.02 2.5
128 0.2±0.2 1.76
64 0.2±0.2 1.12
rand*1460 1M内变动 2.52
其中,rand是产生0~1的随机数。LWIP这组数据中,1024的速度大于1400,有可能是
因为1024是2的整数次幂的原因(可能猜测)。