前言
最近在学习zynq中的lwip协议族,找不到很好的记笔记的地方,所以就用csdn记录一下自己的学习过程。现在对lwip不熟悉,只是把官方的lwip echo server例程跑了一下,能跑通就一点点的照着学了,笔记都是根据自己的理解写的,而且部分内容可能也只针对lwip echo server例程有效,笔记可以供有缘人参考,但不敢保证全对,有不对的地方也期待有高人指点一二。
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/weixin_40356705/article/details/136824649
一、概述
前面的笔记主要写了pbuf中有数据时cpu的处理过程,包括接收函数是怎么注册的,接收函数是在哪里被调用的,和各接收函数之间的关系是如何嵌套起来的。现在看数据是怎么从端口转移到内存的。首先前面介绍了xemac_add函数,该函数主要作用就是注册一个网络端口,包括ip地址,网关,mac地址,接收函数,还有初始化函数。其中初始化函数就包括了取数据的函数。在zynq echo server实验中,程序实际执行的是第三个case语句也就是其初始化函数为xemacpsif_init。今天就看一下xemacpsif_init函数中有什么内容。
- 原型
err_t xemacpsif_init(struct netif *netif)
- 参数
struct netif *netif :结构体的指针,该结构体包含了网络接口的各种信息,如名称、输出函数、链路层输出函数等。 - 作用
这个函数主要完成了网络接口的基本设置和底层硬件的初始化,为后续的网络通信做准备
二、函数体
/*
* xemacpsif_init():
*
* 这个函数应该在程序开始时调用,以设置网络接口。
* 它调用 low_level_init() 函数来完成硬件的实际设置。
*/
err_t xemacpsif_init(struct netif *netif)
{
#if LWIP_SNMP
/* 设置网络接口类型为以太网(RFC 1213 中的 ethernetCsmacd),值为6 */
/* ifType ethernetCsmacd(6) @see RFC1213 */
netif->link_type = 6;
/* 设置链接速度,这里需要填写具体的速度值,例如10000000表示100Mbps */
/* your link speed here */
netif->link_speed = ; /* 这里应该填写具体的速度值 */
/* SNMP 时间戳初始化 */
netif->ts = 0;
/* SNMP 接收方向的统计信息初始化 */
netif->ifinoctets = 0; /* 接收的字节数 */
netif->ifinucastpkts = 0; /* 接收的单播数据包数 */
netif->ifinnucastpkts = 0; /* 接收的非单播数据包数 */
netif->ifindiscards = 0; /* 接收时丢弃的数据包数 */
/* SNMP 发送方向的统计信息初始化 */
netif->ifoutoctets = 0; /* 发送的字节数 */
netif->ifoutucastpkts = 0; /* 发送的单播数据包数 */
netif->ifoutnucastpkts = 0; /* 发送的非单播数据包数 */
netif->ifoutdiscards = 0; /* 发送时丢弃的数据包数 */
#endif /* LWIP_SNMP */
/* 设置网络接口的名称,由 IFNAME0 和 IFNAME1 定义 */
netif->name[0] = IFNAME0;
netif->name[1] = IFNAME1;
/* 设置用于处理网络数据包输出的函数 */
netif->output = xemacpsif_output;
/* 设置用于链路层数据发送的函数 */
netif->linkoutput = low_level_output;
#if LWIP_IPV6
/* 如果支持 IPv6,则设置网络接口用于 IPv6 数据包输出的函数 */
netif->output_ip6 = ethip6_output;
#endif /* LWIP_IPV6 */
/* 调用底层初始化函数,完成网络接口硬件的初始化 */
low_level_init(netif);
/* 返回初始化成功的标志 */
return ERR_OK;
}
可以看出,这个函数主要就是调用了low_level_init函数
三、调用关系
被xemac_add调用,调用了low_level_init函数。