本例中使用的是 stm32f429-fire-challenger开发板,所以需要下载 BSP的LWIP驱动,将下载的LWIP驱动源码 drv_etc.c 和 drv_etc.h 文件添加到自己工程驱动文件所在的路径。

了解协议栈的相关概念

将drv_etc.c代码做一下更动:

将#include 《drv_log.h》改为#include 《rtdbg.h》

删除extern void phy_reset(void);和 phy_reset();

添加ETH外设配置:

打开stm32f429-fire-challenger的BSP,在board目录下找到stm32f4xx_hal_msp.c文件,移植到工程中。

然后改动stm32f4xx_hal_msp.c里的代码:

把#include “main.h”改为#include “board.h”

删除多余的配置,只保留void HAL_ETH_MspInit(ETH_HandleTypeDef* heth)和void HAL_ETH_MspDeInit(ETH_HandleTypeDef* heth)

打开include “board.h”,添加#define PHY_USING_LAN8720A

了解协议栈的相关概念

移植完成,编译。

4.2.3 网络设备层和LAN8720驱动解析

4.2.3.1 网络设备层解析

RT-Thread 的 lwIP 移植在原版的基础上,添加了网络设备层以替换原来的驱动层。和原来的驱动层不同的是,对于以太网数据的收发采用了独立的双线程结构,erx 线程和 etx 线程在正常情况下,两者的优先级设置成相同,用户可以根据自身实际要求进行微调以侧重接收或发送。

数据接收流程:

了解协议栈的相关概念

当以太网硬件设备收到网络报文产生中断时,接收到的数据会被存放到接收缓冲区,然后以太网中断程序会发送邮件来唤醒 erx 线程,erx 线程会按照接收到的数据长度来申请 pbuf,并将数据放入 pbuf 的 payload 中,然后将 pbuf 通过邮件发送给 去处理。

数据发送流程:

了解协议栈的相关概念

当有数据需要发送时,LwIP 会将数据通过邮件发送给 etx 线程,然后永久等待在 tx_ack 信号量上。etx 线程接收到邮件后,通过调用驱动中的 rt_stm32_eth_tx() 函数发送数据,发送完成之后再发送一次 tx_ack 信号量唤醒 LwIP

网络设备介绍:

RT-Thread 网络设备继承了标准设备,由 eth_device 结构体定义:

1struct eth_device

2{

3 /* 标准设备 */

4 struct rt_device parent;