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)那么就会出现内存溢出(我试过了,进错误中断),使用了申请之外的内存。
那么就得这么改:
于是: