一种处理LWIP在正常通讯时断线重连的方法

2020-02-29 10:44发布

本帖最后由 纪国圣 于 2020-2-26 11:37 编辑

硬件平台为STM32F429-Nucleo

软件平台为STM32CubeMXv5.5+keilv5(采用零级优化
                HAL库版本为V1.24.2
                FreeRTOS版本为10.0.1
                CMSIS-RTOS版本为1.02
                LWIP版本为2.0.3
在按板卡选择且外设一切都是默认情况下,勾选了FreeRTOS和LWIP,参数是默认值。生成代码。按下图中所示修改配置。并移植一份下位机作为服务器的回环测试程序。
1.png
2.png
3.png
如果回环测试功能正常,则可以按下图继续修改:
1. 1_1.png
LWIP_NETIF_LINK_CALLBACK用于使能网络连接状态变化回调函数的调用。使能后ethernetif.c文件中的void ethernetif_update_config(struct netif *netif)起作用,用于网络连接状态变化时底层的操作。
LWIP_SO_RCVTIMEO使能接收超时。
2. 1_2.png
1_3.png
在lwip.c文件中屏蔽dhcp_start是因为在后续的程序中会专门开一个线程去处理DHCP的事物;netif_set_link_callback用于注册回调函数;之后为网络状态监测开一个线程,线程名称为ethernetif_set_link。
3. 1_4.png
4. 1_5.png
void ethernetif_notify_conn_changed(struct netif *netif)被void ethernetif_update_config(struct netif *netif)调用,一般可以添加用户所需的特定代码。这里主要改变DHCP的状态码。
5. 1_6.png
void User_notification(struct netif *netif)用于在进入WaitDHCPTask线程时根据网络状态初始化DHCP的状态码。
6. 1_7.png
void ethernetif_set_link(void const *argument)线程通过周期性的读取PHY的PHY_LINKED_STATUS | PHY_AUTONEGO_COMPLETE,获知网络连接情况。当断线重连时,通过PHY的寄存器可以感知到网络的这些变换,并通过netif_set_link_up/netif_set_link_down来触发ethernetif_update_config这个回调函数。可以通过下图的调用关系看出。
netif_set_link_callback实例.png ----------------------> netif_set_link_callback.png
netif_set_link_up.png ----------------------> NETIF_LINK_CALLBACK.png
之间的关系图也可以如下图表示:
调用关系.png
继续配置LWIP:
7. 1_8.png
1_9.png
1_10.png
void WaitDHCPTask(void const * argument)线程用于获取IP地址。操作过程通过状态码执行形影的程序。
8. 1_11.png
在测试程序中添加超时等待时间,当在规定的时间内未接收到数据时,服务器可以断开连接,同时从源代码分析可以知道这样也是有益的。
1_13.png
1_12.png
从源码中可以看出,netconn_recv中通过调用sys_arch_mbox_fetch来获取接受到的消息,而sys_arch_mbox_fetch又是通过osMessageGet来获取消息的。如果超时时间为0,则程序会执行event = osMessageGet (*mbox, osWaitForever)语句,这时候程序一直等待而不能及时释放网络资源,造成重连后通讯失败。
同理不开启LWIP_SO_RCVTIMEO,程序也会执行sys_arch_mbox_fetch(&conn->recvmbox, &buf, 0),最终还是会跳到event = osMessageGet (*mbox, osWaitForever)语句。
按照上述修改之后,LWIP就有在正常通讯下断线自动重连的功能了。
对于因为初始化时未连接网线导致初始化失败,不能联网的情况,本例子没有做处理。这种情况可以通过设置初始化成功/失败标志位记录状态,再通过ethernetif_set_link线程根据标志位和网络状态决定是否重新执行初始化操作。
FreeRTOS_LWIP DHCP 断线检测.zip (2.24 MB, 下载次数: 2) 2020-2-26 11:35 上传 点击文件名下载附件




友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。