基于ZYNQ的千兆网项目(2)

基于ZYNQ的TCP Server实现

项目描述

上一篇文章我们讲解了ZYNQ做Client来进行与PC机进行通信,那么相应的ZYNQ就可以做Server来进行与PC机得通信,此时PC机就是Client。这种通信方式在板卡与板卡之间得通信中还是比较常见,所以就用这篇文章来进行相应得讲解。

工程描述:讲ZYNQ当作Server来进行与上位机通信,实现千兆网的循环测试。

本次实验所用到的软硬件环境如下:
1、VIVADO 2019.1
2、米联客MZ7015FA开发板
3、NetAssist网络调试助手

PL端设计

这里与上一篇文章相同,我们也没有在PL端进行相应的设计。所以我们PL端的设计没有任何代码只是例化了一个ZYNQ的IP,如下:
在这里插入图片描述

PS端设计

与前面ZYNQ做从机的文章相同,这篇文章也用到了开源的系统框架,所以我们也需要设置BSP文件。
首先右击相应工程的bsp文件,选择Board Support Package Setting
在这里插入图片描述
然后点击相应的lwip
在这里插入图片描述
然后重新生成相应的bsp文件即可。

本例程使用 RAW API,即函数调用不依赖操作系统。传输效率也比 SOCKET API 高, (具体可参考 xapp1026)。
将 use_axieth_on_zynq 和 use_emaclite_on_zynq 设为 0。如下图所示。
在这里插入图片描述
修改 lwip_memory_options 设置,将 mem_size, memp_n_pbuf, mem_n_tcp_pcb, memp_n_tcp_seg 这 4 个参数
值设大,这样会提高 TCP 传输效率。如下图所示。
在这里插入图片描述
修改 pbuf_options 设置,将 pbuf_pool_size 设大,增加可用的 pbuf 数量,这样同样会提高 TCP 传输效率。如下
图所示。
在这里插入图片描述
修改 tcp_options 设置,将 tcp_snd_buf, tcp_wnd 参数设大,这样同样会提高 TCP 传输效率。如下图所示。
在这里插入图片描述
修改 temac_adapter_options 设置,将 n_rx_descriptors 和 n_tx_descriptors 参数设大。这样可以提高 zynq 内部 emac
dma 的数据迁移效率,同样能提高 TCP 传输效率。如下图所示。
在这里插入图片描述
所以需要手动修改 LWIP 库让网口芯片工作于 1000Mbps。
在这里插入图片描述
其余选项的参数默认即可,不用修改。点击 OK,重建 bsp。 一般情况下,修改完会自动更新,如果没有更新,手动更新一下,选中 bsp—>右键—> Re-generate BSP Sources。重新生成一下 BSP 包。上面进行这样设置的原因是为了增加lwip的缓存,进而提高千兆网的通信速度。
main.c函数

#include <stdio.h>
#include "xscugic.h"
#include "xparameters.h"
#include "sleep.h"
#include "xscutimer.h"
#include "lwip/err.h"
#include "lwip/tcp.h"
#include "lwip/init.h"
#include "lwipopts.h"
#include "netif/xadapter.h"
#include "lwipopts.h"
#include "lwip/priv/tcp_priv.h"
#include "tcp_transmission.h"

#define GIC_ID 						XPAR_PS7_SCUGIC_0_DEVICE_ID
#define TIMER_IRPT_INTR     		XPAR_SCUTIMER_INTR
#define TIMER_DEVICE_ID     		XPAR_XSCUTIMER_0_DEVICE_ID
#define TIMER_LOAD_VALUE    		0x13D92D3F/8 //1S

#define TCP_RXBUFFER_BASE_ADDR  	0x10000000
#define PC_TCP_SERVER_PORT     		5001

void TimerIntrHandler(void *CallBackRef);
int initimer();
int initSwIntr();
int inittcp(struct netif *netif);
int tcp_recv_init();
err_t tcp_connected_callback(void *arg, struct tcp_pcb *tpcb, err_t err);
err_t tcp_recv_callback(void *arg, struct tcp_pcb *tpcb, struct pbuf *p, err_t err);
static err_t tcp_sent_callback(void *arg, struct tcp_pcb *tpcb, u16_t len);
void send_received_data();


static XScuGic ScuGic;
static XScuGic_Config * ScuGicCfgPtr;

XScuTimer Timer;
XScuTimer_Config  *Config;

volatile int TcpTmrFlag;
int flag;
int rec_cnt;


int main()
{
   
   
	int status;
	err_t err;
	struct netif *netif, server_netif;
	netif = &server_netif;
	status = initSwIntr();
	status = initimer();
	status = inittcp(netif);
	if(status != XST_SUCCESS){
   
   </
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值