Cyclone V FPGA DDR3存储器的以太网传输速度很慢

时间:2019-05-20 13:06:29

标签: c linux sockets fpga ethernet

我们在项目中使用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;
}

0 个答案:

没有答案