LWIP______

本文介绍了STM32F4使用LAN8720A和LWIP库进行以太网通讯的实例,并深入解析了LWIP内存管理的动态内存池初始化。通过分析内存池结构和数组偏移计算,展示了如何创建内存池。此外,还探讨了在UDP通信中遇到的限制及解决方案,包括自定义回调函数实现数据收发。
摘要由CSDN通过智能技术生成

1. 参考资料

STM32F4+LAN8720A+STM32CubeMX+Lwip 网络通讯(以太网通讯)小实例

2. LWIP内存管理

动态内存池初始化分析

在这里插入图片描述
在这里插入图片描述
NOTE: 注意箭头方向,要反过来看这个链表。

根据代码我们知道,初始化好的内存池都会被放到mem_pools中(注意那个逗号,精髓)
在这里插入图片描述
这里不得不提一下memp_t和MEMP_MAX的由来(👍)
在这里插入图片描述

理论分析完,看仿真情况:
在这里插入图片描述
这里就不一 一画线了

如下图所示,数组偏移时为什么是这样计算的?

在这里插入图片描述
那就要从数组的初始化源头说起,如下图所示:
在这里插入图片描述
那么通过这样一个过程,就会创建这样的结构体变量:

const struct memp_desc memp_UDP_PCB = {
	size,
	num,
	memp_memory_UDP_PCB_base, //u8_t *base
	&memp_tab_UDP_PCB //struct memp **tab
};
所以memp_memory_UDP_PCB_base可以理解为下面这张图:

在这里插入图片描述

NOTE: memp_memory_UDP_PCB_base总共131个字节
memp_memory_UDP_PCB_base看似是u8_t类型的数组但是放到并不是单个字节的数据,而是4个
struct udp_pcb var

通过仿真验证理论

在这里插入图片描述

3. udp_rev_callback()自定义函数测试

在这里插入图片描述

这个回调函数很简单,收到udp数据后回复一句"This is reply!",无论我发什么都只会回这一句,于是我改了一下,如下图所示:
在这里插入图片描述
将收到的数据再发回来,于是:

在这里插入图片描述
但是
在这里插入图片描述
这是因为q->payload在申请内存的时候只申请了16个字节,所以最多也只能发16个字节数据。那么这时候是要改 (1) 还是 (2) ?
在这里插入图片描述
如果只改(2)不改(1)且(2)> (1)那么就会出现内存溢出(我试过了,进错误中断),使用了申请之外的内存。
那么就得这么改:
在这里插入图片描述
于是:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值