最近在学习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)
/*
* 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函数。
文章浏览阅读1w次,点赞2次,收藏35次。动态规划之车间调度问题真言哎呀,大家好。憋了我久了,终于回校了,回校以后真不想说我的大学了,你说我回来这么早来准备面试,你给供暖不行呀,暖气冰凉冰凉的,你想冻死学生呀,学生回来早点好找工作,找个世界500强也不是给你争脸麽。如果不是好好学习的同学,他会回校这么早么?你咋不知道好歹呢?还不如上班呢,呜呜呜。回到正题,代码一年前写的,自己感觉真烂,各种不满意,注释,异常,优_动态规划求解车间调度
文章浏览阅读7.8k次,点赞2次,收藏8次。之前已经写了关于java项目和前端react项目自动化构建的文章,有没有发现,在项目的构建历史中,只能看到项目的构建号和构建时间。终于,开发人员在使用的过程中提出了新需求:在项目的构建历史中能直接看到某次构建是谁发布的,发布的是什么分支,而不用去某次构建的"控制台输出"中查看。其实这个需求实现起来并不难,毕竟Jenkins的插件社区这么强大。下面的两个插件,就很好的解决了这个需求。user..._jenkins 构建名 #1
文章浏览阅读1.3k次。1.condaconda update name2.pippip install --upgrade name_pip update conda
文章浏览阅读5.4k次,点赞3次,收藏42次。esp32cam 使用 webcam 摄像头实时查看视频_库管理中找不到camera_pins.h
文章浏览阅读145次。【腾讯云 云社区】python学习之旅_python获取网站收录
文章浏览阅读1k次。(1)下载镜像 docker pull gogs/gogs (2)创建容器 docker run ‐di ‐‐name=gogs ‐p 10022:22 ‐p 3000:3000 ‐v /var/gogsdata:/data gogs/gogs下载镜像 docker pull gogs/gogs创建容器创建对应的文件 mkdir -p /var/jenkins_home创建容器 docker run ‐di ‐‐name=gogs ‐p 10022:_gogs 管理员关闭注册
文章浏览阅读924次。matlab工具箱toolbox_calib单目相机标定_calib_gui文件
文章浏览阅读3.9k次,点赞6次,收藏11次。片上总线Wishbone 学习(零)前言 为了更加升入的理解片上系统,比如S3C2440等,今天开始学习片上总线。首先学习Silicon的Wishbone,之后学习ARM的AMBA。之所以先学习Wishbone,主要是因为Wishbone是一个轻量级规范,适合入门学习。_wishbone架构
文章浏览阅读7k次,点赞4次,收藏6次。一个新建的URP项目,里面只有几个测试模型,结果在3070的笔记本电脑上,只能运行到20帧!Gfx.WaitForPresentOnGfxThread 这个东西,是CPU已经准备好绘制下一帧,但是GPU还没准备好,应用程序等待 GPU 所花费的时间。那就说明,卡在GPU的性能上了。(6) 笔记本电脑的系统设置。有些笔记本电脑,是有系统设置的,可以直接影响GPU的渲染能力。切换为【性能】设置,释放GPU能力。关闭了所有URP耗性能相关的设置,情况未有好转。死磕了一下午,终于找到原因,解决了。_gfx.waitforpresentongfxthread
文章浏览阅读649次。在完成这次实验之前,我对数据库管理和SQL语言都只有一些基础的概念和知识。通过这次实验,我深入了解了数据库的概念和原理,学习了SQL语言的基本操作和语法规则,并通过实践掌握了SQL语句的定义、查询和更新等功能。同时,我还学习了如何使用Navicat等可视化数据库管理工具,更加方便地进行数据库的创建、维护和管理。在实验过程中,我遇到了一些问题,如SQL语句的语法错误、表格的定义不完整等等,但通过查阅相关资料和调试,我逐渐解决了这些问题,并加深了对数据库和SQL语言的理解。
文章浏览阅读5.8k次,点赞5次,收藏9次。http-equiv="Content-Type" content="text/html; charset=utf-8"/> 原生JS实现购物车结算功能代码 *{margin:0;padding:0;list-style-type:none;}a{color:#666;text-decoration:none;}table{border-coll_"div class=\"fr closing\">结 算 合计:¥
文章浏览阅读699次。DHCP简单的来说,DHCP是一个局域网协议,使用UDP协议进行工作,它的作用就是动态的分配IP地址,Gateway地址,DNS服务器地址等信息,一旦租约到期,那么路由器就会把当前的这个ip分配给其他设备使用,所以,对于设备而言要定期请求DHCP Server来更新ip地址信息,保证ip地址有效可用DHCP租约到期,设备不会自动进行续租而仍然使用旧的ip地址DHCP租约到期,设备向DHCP Ser..._安卓设备ip租期