LWIP原理
LWIp基于以太网实现。
①以太网传输最大数据包不多于1500字节
②STM32的以太网(网络层)利用DMA机制来收发数据(STM32以太网拥有2kb大小的RX FIFO和TX FIFO,足够容纳以太网最大传输数据包大小)。
PHY芯片和STM32数据的收发(MAC内核--数据链路层)通过介质RMII/MII来实现的(一般使用RMII)。H7参考中文手册P2574
①MII/RMII(物理层。将MAC内核的信号转换为光电信号,反之亦然。)的不同:
1·参考时钟不同(MII为TX_CLK、RX_CLK两条时钟线,RMII为REF_CLK一条时钟线。
2·引脚数量不同(MII有16位引脚,RMII有9位引脚)
3·收发位宽不同(MII是4位,RMII是两位)。等等,具体查看芯片中文参考手册。
②MAC内核和外部PHY芯片管理方式(SMI站管理)类似IIC,用一根时钟线(MDC)和一根数据线(MDIO)来进行通信。
数据帧结构为:
PHY芯片简介(物理层)
知识补充:
”自动翻转“——指的是TX和RX这两对线自适应,也叫Auto MDI/MDI-X。
”自动极性变换“——指的是TX(或RX)里面差分对的自适应。
①PHY寄存器 (32个寄存器,每个寄存器都是16位?)
类似的寄存器:0~15寄存器重点是BCR寄存器(设置PHY双工和网速)和BSR寄存器(获取PHY双工和网速)
自由定义寄存器:16~31寄存器。用于实现额外功能。
以太网DMA描述符 P2596
作用:以太网描述符用于管理接收和发送缓冲区。
①描述符
1·常规描述符:管理缓冲区。
2·增强描述符:在常规描述符基础上开启时间戳和IPV4校验和减荷。
②一个DMA描述符对应一个以太网数据包。DMA描述符链表中的最后一个描述符指向第一个描述符的地址形成一个循环链表。
LWIP启动流程(需补充)
1·tcpip_init() 用于初始化LWIP->创建邮箱->创建互斥锁(防止优先级反转)->创建tcpip线程。
①LWIP会在网络层来判断数据包是IP数据包还是ARP数据包。收发邮箱由freertos中消息队列来表示。(网络层为IP和ARP)
LWIP内存管理
简介
1·内存堆管理---heap (由控制块和可用内存块组成。申请内存块时返回的地址是可用内存块地址而不是控制块地址(与可用内存块相比就是低地址位置))
一·内存堆简介
相当于操作一块大数组,分割成若干块,在其中自动分配与用户申请的内存相同大小的空间,若有剩余则会合并在相邻的内存块中(产生内存碎片的主要原因也是因为这个)。由低地址空间向高地址空间查找,保证高地址空间足够大,适用于小内存管理。
PS:①分配最小值为12字节空间②好处是用户申请的内存利用率高,但是使用内存堆容易产生内存碎片!③分配与释放都是从低地址开始查找,运行效率较低。
二·内存堆常用函数
- mem_init() 内存堆初始化。
- mem_malloc() 申请内存块。---->一般指向pbuffer。
- mem_free() 释放内存块。---->一般指向pbuffer。
2·内存池管理---pool (LWIP一般选用内存池)
也是操作一块大数组,分成若干块,使用时是固定内存大小,即使用户申请的内存小于内存块大小,也不会返回剩余内存。一般用于储存内核中固定大小的数据结构(TCP\UDP控制块等)。
PS:能有效防止内存碎片,但是利用率可能不及于内存堆管理以及申请大内存时可能申请失败 。
3·C库
不建议使用。
LWIP内存堆和内存池应用
1·接收数据
MAC内核的数据 --->内存池/内存堆都适用。
2·发送数据
用户调用LWIP的API函数 --->LWIP一般选用内存堆申请内存。
3·用户调用
可调用LWIP的内存池和内存堆API来申请内存。
4·接口控制块
netconn、socket、raw接口。一般为内存池。
5·构建消息
API消息、数据包消息。一般为内存池。
PS:数据包消息:DMA描述符指向的缓冲区数据拷贝到pbuffer里面,在把pbuffer发送到应用层、网络层、传输层中去。
******以上数据依据STM32H7列写。******