我们在项目中使用CycloneV,FPGA将使用AXI总线将数据写入DDR,而我们的应用程序需要使用以太网将数据发送出去。我们使用iperf对以太网吞吐量进行基准测试,它可以达到约700Mbps的速度。当我们测试应用程序吞吐量时,我们得到的结果仅为300Mbps。我们需要知道为什么与iperf基准测试相比,我们的传输速度慢。
DDR3内存在启动时被保留用于FPGA直接访问
您能建议为什么我的以太网传输比iperf基准数据(〜700Mbps)慢吗?如何增加吞吐量?
if ((fd = open("/dev/mem", (O_RDWR | O_SYNC))) == -1)
{
printf("ERROR: could not open /dev/mem/ \n");
}
pMem = mmap(NULL, SDRAM_64_SPAN, (PROT_READ | PROT_WRITE), MAP_SHARED, fd, SDRAM_64_BASE);
if (pMem == MAP_FAILED)
{
printf("ERROR: mmap failed\n");
}
运行在SoC中的客户端套接字发送大约1 MB的数据,而服务器在PC上,PC不断接收数据
仅调用一次的客户代码
sock = socket(AF_INET, SOCK_STREAM, 0);
int n = 1024*2*1024;
unsigned int m = sizeof(n);
if ((setsockopt(sock, SOL_SOCKET, SO_SNDBUF, &n, m) < 0)
{
printf("ERROR: Setting socket send buffer size\n");
}
int opt = 1;
if (setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, &opt, sizeof(opt)) > 0)
{
printf("ERROR: Unable to set TCP no delay\n");
}
if (connect(sock, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0)
{
printf("ERROR: connecting to server\n");
}
int flags = fcntl(sock, F_GETFL, 0);
int newflags = flags | (int) O_NONBLOCK;
if (fcntl(sock, F_SETFL, newflags) < 0)
{
printf("ERROR: setting non blocking mode\n");
}
在每次数据传输中,客户端都会按以下方式继续发送数据
int len = 128*256*4*8;
int r = sendall(sock, (char *)pMem, &len);
if (r == -1)
{
printf("ERROR: sending data\n");
}
int sendall(int s, char *buf, int *len)
{
int total = 0;
int bytesleft = *len;
int n;
while (total < *len)
{
n = 0;
n = send(s, buf + total, bytesleft, 0);
if ((n == -1) && ((errno == EWOULDBLOCK) || (errno == EAGAIN)))
{
n = 0;
usleep(5);
}
else
{
if (n < 0)
{
printf("ERROR: sending data\n");
break;
}
}
total += n;
bytesleft -= n;
}
*len = total;
return n==-1?-1:0;
}