【ZYNQ MPSoC开发】双核数据采集系统AXI DMA传输,LWIP TCP发送的调试记录

问题背景

       项目需求是使用ZU3EG实现一个汇集板的功能。具体而言,PL端接收来自前级的来的带有时间戳的ADC数据,先在PL端进行数据对齐,再通过AXI DMA传输到PS端,由PS端通过lwip实现TCP 客户端。在成功连接到PC后,通过AXI GPIO给PL端一个信号,开始产生模拟数据(还未上前级,只是模拟),并开始AXI DMA简单传输,每次传输完成后,如果lwip的发送buffer足够,则立刻把数据发出,否则先把数据存入FIFO,buffer足够时再发出去,保证数据的连续性。系统只算数据的测试带宽为853.3mbps(不包括TCP帧头帧尾),实际传输带宽要大于这个数,PS使用裸机,不跑系统。

单核尝试

       1,首先测试TCP客户端的传输性能,使用Xilinx提供的lwip_tcp_perf_client示例进行测试,通过串口打印出来的数据带宽能达到940mbps+,性能满足要求。

       2,测试AXI DMA的传输性能,在DMA接收数据中断中计数,通过tcp_perf得到每5s的DMA数据量,平均为533.3MB,符合理论计算值。

       3,把DMA与TCP发送结合起来,测试结果为,在整体数据带宽较小时(如460mbps),最后的发送数据带宽能符合理论值,但随着带宽的增大,最后的发送数据带宽会比理论值小,下面给出一些数据:理论值为633.6mbps时,发送的带宽平均为632mbps;理论值为768mbps时,发送的带宽平均为760mbps;理论值为853.3mbps时,发送的带宽平均为820mbps

       发送的带宽会随着数据带宽的增大而增大,说明发送的带宽没有达到瓶颈,而实际值与理论值的差距随着理论值的增大不断增大,有说明存在着某一个瓶颈,考虑到单独的TCP发送性能和AXI DMA传输性能都能满足需求,所以想到用双核实现!

双核尝试

       1,cpu0实现AXI DMA的数据接收,在收到数据后,经过处理再放到共享内存中,再给cpu1一个软件中断

       2,cpu1只需要在开始时不断尝试连接PC服务端,在连接上后,告诉cpu0,让它开始简单传输,并给出PL的使能信号。在cpu1的软件中断中,把数据放入FIFO,而在while(1)中不断判断lwip的发送buffer是否足够,如果足够,且FIFO中存在数据,就把数据发送出去。

       最后测试,发送带宽与理论带宽相符,达到了853.3mbps,这里合理反推单核性能为什么不够,应该是lwip的发送机制占用cpu使用权过多。虽然带宽达到了需求,但是也出现了新的问题,即系统会在运行一段时间后(随机不定时,长了可能将近两小时,短则几分钟),突然间就不向电脑发送数据了,但从板子和电脑看,连接都是没有断开的,用wireshark抓取的话,也是发完最后一包后,又开始ARP的广播了,并且ping不通板子,但是两个核都还在正常运行,可以打印出相应的信息,并没有卡死在某个地方,目前尝试了很多办法,包括完全隔绝两者的memory分配,尝试改变lwip的参数等,暂时还没有解决,先埋个坑。

你可能感兴趣的:(FPGA/嵌入式网络开发,ZYNQ,MPSoC,tcp/ip,网络,嵌入式硬件,fpga)