发 帖  
原厂入驻New
[问答] lwip udp接收问题
214 xilinx LwIP API
分享
大家好,
我正在使用Raw API处理lwip-udp。
我的应用代码是服务器。
在固定间隔内长时间执行接收时,我面临以下问题。
在从客户端接收连续数据包时,服务器仅处理256个数据包。
处理完某些数据包后,服务器和客户端之间的连接就会丢失。
在调试过程中,我观察了所有Mac寄存器。
我发现接收状态寄存器保持为1.这意味着没有接收缓冲区。
并且接收资源错误寄存器正在维护未处理的数据包。
这个问题是否与BD的记忆有关?
要么
接待有限制吗?
任何人都可以建议确切的问题在哪里?
附加信息:
客户端计时间隔:每10毫秒。
以太网通信模式:基于EMIO的实现。
处理器:Zynq702
0
2020-4-14 08:49:10   评论 分享淘帖 邀请回答

相关问题

8个回答
嗨雅阁,
我在这里遇到了同样的问题。
打开服务请求后,我了解到,Vivado 2015.4将会有一个修复。
RX DMA例程中似乎存在错误。
让我们等待并希望最好。
在此期间,您可以尝试一个丑陋的修复,这对我来说对Vivado 2015.3有用
在文件工作区\ zc702_bsp \ ps7_cortexa9_0 \ libsrc \ lwip141_v1_2 \ src \ contrib \ ports \ xilinx \ netif \ xemacpsif_dma.c
在355行
更改 
* temp = 0;
if(bdindex ==(XLWIP_CONFIG_N_RX_DESC - 1)){* temp = 0x00000002;
}
成 
if(bdindex ==(XLWIP_CONFIG_N_RX_DESC - 1)){* temp = 0x00000002;
} else {* temp = 0;
}
有趣的是,这两个代码段应该做同样的事情,但事实并非如此。
请注意,只要您更改了BSP的设置,SDK就会从您的安装文件中加载原始资源,您必须再次更改该文件。
问候,塞巴斯蒂安
2020-4-14 08:59:21 评论

举报

嗨sgeorgi_sen,
非常感谢你的回复。
我使用的是Vivado 2014.4版本。
尽管如此,根据你的建议,我做了修改
setup_rx_bds(XEmacPs_BdRing * rxring)函数。
但是性能没有变化。
仍然代码只接收256个数据包。
Lwip版本:1.4.0-v2.3
问候
萨卡尼亚
2020-4-14 09:10:54 评论

举报

嗨Sukanya,
然后问题出在Vivado 2014.4的其他地方。
调试这种问题花了我几天。
您可以从激活LWIP的调试选项开始。
但在那之后它只是硬打印调试。
也许转换到2015.3可能会有所帮助?
祝你好运!
塞巴斯蒂安
2020-4-14 09:18:49 评论

举报

2020-4-14 09:36:22 评论

举报

嗨塞巴斯蒂安,
我在2015年尝试了上述修改。
在调试代码后,我已经看到了以下观察结果;
1.)当以1秒周期发送7个字节的数据时,服务器响应并在长时间测试期间继续响应。
2.)当以1秒周期发送大小为48字节的数据包时,服务器仅处理第一个211(appx)数据包。
在长时间测试期间,它不响应剩余的数据包。
3.)当包的周期改变为10ms时,进行相同的观察。
即使在修改队列大小,队列长度和缓冲区大小之后,观察到的性能也没有变化。
但我对改变临时变量的重要性并不是很清楚。
您是否观察或更改了任何其他参数或功能?
请求您,解决调试udp代码的任何其他建议。
我在bsp中做过的修改:
xemacpsif_dma.c文件和void setup_rx_bds(xemacpsif_s * xemacpsif,XEmacPs_BdRing * rxring)函数;
bdindex = XEMACPS_BD_TO_INDEX(rxring,rxbd);
temp =(UINTPTR *)rxbd;
if(bdindex ==(XLWIP_CONFIG_N_RX_DESC - 1)){* temp = 0x00000002;
} else {* temp = 0;
} temp ++;
// * temp = 0;
2020-4-14 09:43:44 评论

举报

嗨,
这些代码修改在2015.4中不再是必需的。
Xilinx为Zynq修复了LWIP DMA例程。
也许您可以使用lwip echo服务器示例来确认您的主板是否正常工作?
问候,塞巴斯蒂安
2020-4-14 09:55:20 评论

举报

嗨,
是的,我的董事会(Zedboad)工作正常。
因为我能够在发送7个字节的数据时看到长时间运行。
但是,当我以1秒的间隔发送48字节的数据时,服务器代码仅处理211(大约)数据包。
后来它没有响应剩余的数据包。
2020-4-14 10:02:31 评论

举报

大家好,
在某种程度上,我们已经解决了上述udp接收问题,但在进行长期测试时仍然保留了性能问题。
服务器应用程序代码以1毫秒的周期处理客户端数据包。
最多2小时,服务器代码响应客户端数据包。
在一些实例代码被Xil_DataAbortHandler(void * CallBackRef)或Xil_Assert(const char8 * File,s32 Line)函数暂停后,反之亦然。
对Xil_DataAbortHandler的观察(void * CallBackRef):
每次DataAbort处理程序给出不同的“DataAbortAddr”值(FaultStatus为NULL,PrefetchAbortAddr为零)。
有时它指向udp_sendto_if()函数,其中pcb变为NULL。
在某些情况下,它指向XEmacPs_BdSetAddressTx(txbd,(UINTPTR)q-> payload)函数,该函数从emacps_sgsend(xemacpsif_s * xemacpsif,struct pbuf * p)调用。
等等,。
由于各种值无法进一步调试。
观察或Xil_Assert(const char8 *文件,s32行):
通过使用Xil_Assert函数参数,跟踪文件名和行号。
即xemacps_intr.c和第161行(Xil_AssertVoid(InstancePtr-> IsReady ==(u32)XIL_COMPONENT_IS_READY);)
在上面的行InstancePtr-> IsReady为零。
在整个BSP中,除初始化外,InstancePtr-> IsReady参数不会为零,因此无法确切地将其更改为零。
请求解决此问题并帮助调试问题。
2020-4-14 10:22:02 评论

举报

只有小组成员才能发言,加入小组>>

98个成员聚集在这个小组

加入小组

创建小组步骤

关闭

站长推荐 上一条 /7 下一条

快速回复 返回顶部 返回列表