前言
最近在学习zynq中的lwip协议族,找不到很好的记笔记的地方,所以就用csdn记录一下自己的学习过程。现在对lwip不熟悉,只是把官方的lwip echo server例程跑了一下,能跑通就一点点的照着学了,笔记都是根据自己的理解写的,而且部分内容可能也只针对lwip echo server例程有效,笔记可以供有缘人参考,但不敢保证全对,有不对的地方也期待有高人指点一二。
随着前面文章对lwip echo server例程中部分函数的理解,对整个lwip echo server例程也有了一个阶段性的理解,将前面的内容串联起来,可以看出来该例程的部分工作流程,所以打算记录一下。
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/weixin_40356705/article/details/136966406
一、xemacif_input函数
数据是通过main函数中的for循环来接受的,准确的说是在for循环里不断地查看lwip协议栈所使用的接收数据的空间里有没有数据。也就是说实际上数据接收动作并不是main函数来完成而是dma来完成的,这条线后续再说,先把最直接的数据提取+回传讲完,本次只对起关键作用的语句注释,需要逐句注释的话可以参考之前的文章。
数据是通过main函数中的xemacif_input函数完成的数据的接收与回传。函数段如下
while (1) {
if (TcpFastTmrFlag) {
tcp_fasttmr();
TcpFastTmrFlag = 0;
}
if (TcpSlowTmrFlag) {
tcp_slowtmr();
TcpSlowTmrFlag = 0;
}
xemacif_input(echo_netif);//通过该函数完成数据接收和回传
transfer_data();
}
该函数的函数体如下
int
xemacif_input(struct netif *netif)
{
struct xemac_s *emac = (struct xemac_s *)netif->state;
int n_packets = 0;
switch (emac->type) {
case xemac_type_xps_emaclite:
#ifdef XLWIP_CONFIG_INCLUDE_EMACLITE
n_packets = xemacliteif_input(netif);
break;
#else
print("incorrect configuration: xps_ethernetlite drivers not present?");
while(1);
return 0;
#endif
case xemac_type_axi_ethernet:
#ifdef XLWIP_CONFIG_INCLUDE_AXI_ETHERNET
n_packets = xaxiemacif_input(netif);
break;
#else
print("incorrect configuration: axi_ethernet drivers not present?");
while(1);
return 0;
#endif
#if defined (__arm__) ||