LWIP热插拔功能实现
0 工具准备
1.lwip 1.4.1
2.RTOS(本文使用rt-thread)
1 使能连接变化回调功能
打开lwipopts.h,将宏定义LWIP_NETIF_LINK_CALLBACK的值设为1,如下:
#define LWIP_NETIF_LINK_CALLBACK 1
这个宏定义被使能后会将void ethernetif_update_config(struct netif *netif)函数加入工程中进行编译。这个函数的功能就是检查当前连接情况,进行不同的处理。
该函数如下:
void ethernetif_update_config(struct netif *netif)
{__IO uint32_t tickstart = 0;uint32_t regvalue = 0;if (netif_is_link_up(netif)){/* Restart the auto-negotiation */if (heth.Init.AutoNegotiation != ETH_AUTONEGOTIATION_DISABLE){/* Enable Auto-Negotiation */HAL_ETH_WritePHYRegister(&heth, PHY_BCR, PHY_AUTONEGOTIATION);/* Get tick */tickstart = HAL_GetTick();/* Wait until the auto-negotiation will be completed */do{HAL_ETH_ReadPHYRegister(&heth, PHY_BSR, ®value);/* Check for the Timeout ( 1s ) */if ((HAL_GetTick() - tickstart) > 1000){/* In case of timeout */goto error;}} while (((regvalue & PHY_AUTONEGO_COMPLETE) != PHY_AUTONEGO_COMPLETE));/* Read the result of the auto-negotiation */HAL_ETH_ReadPHYRegister(&heth, PHY_SR, ®value);if ((regvalue & PHY_DUPLEX_STATUS) != (uint32_t)RESET){heth.Init.DuplexMode = ETH_MODE_FULLDUPLEX;}else{heth.Init.DuplexMode = ETH_MODE_HALFDUPLEX;}if (regvalue & PHY_SPEED_STATUS){/* Set Ethernet speed to 10M following the auto-negotiation */heth.Init.Speed = ETH_SPEED_10M;}else{/* Set Ethernet speed to 100M following the auto-negotiation */heth.Init.Speed = ETH_SPEED_100M;}}else /* AutoNegotiation Disable */{error:/* Check parameters */assert_param(IS_ETH_SPEED(heth.Init.Speed));assert_param(IS_ETH_DUPLEX_MODE(heth.Init.DuplexMode));/* Set MAC Speed and Duplex Mode to PHY */HAL_ETH_WritePHYRegister(&heth, PHY_BCR,((uint16_t)(heth.Init.DuplexMode >> 3) |(uint16_t)(heth.Init.Speed >> 1)));}/* ETHERNET MAC Re-Configuration */HAL_ETH_ConfigMAC(&heth, (ETH_MACInitTypeDef *)NULL);/* Restart MAC interface */HAL_ETH_Start(&heth);}else{/* Stop MAC interface */HAL_ETH_Stop(&heth);}ethernetif_notify_conn_changed(netif);
}
2 完善连接状态变化回调函数
在ethernetif_update_config函数的最后有一个名为ethernetif_notify_conn_changed的函数需要用户自定义功能,由于我们这里使用的是固定IP,因此自定义的状态变化回调函数如下:
void ethernetif_notify_conn_changed(struct netif *netif)
{if(netif_is_link_up(netif)){printf("\r\nLan link up!\r\n");netif_set_up(netif);}else{printf("\r\nLan link down!\r\n");netif_set_down(netif);}
}
如果需要启用了DHCP功能,可以在发现网线插上后等待路由器分配IP。
3 绑定回调函数
前面我们已经编辑好了自定义的回调函数,接下来需要绑定回调函数,在我们的网线连接状态改变时执行回调函数。绑定回调函数只需要添加netif_set_link_callback(&gnetif, ethernetif_update_config)语句到LWIP初始化函数内即可。如下:
netif_set_default(&gnetif);if (netif_is_link_up(&gnetif)){/* When the netif is fully configured this function must be called */netif_set_up(&gnetif);}else{/* When the netif link is down this function must be called */netif_set_down(&gnetif);}netif_set_link_callback(&gnetif, ethernetif_update_config);
4 轮询网口连接状态
前面我们已经完成了回调函数编写,同时绑定了回调函数。由于lwip 1.4.1原生没有轮询网口连接状态,因此这部分需要我们来编写。这里我们使用RTOS,将轮询网口连接状态的函数放到软件定时器内执行:
void lan_state_check(void)
{uint32_t regvalue = 0;HAL_ETH_ReadPHYRegister(&heth, PHY_BSR, ®value);if ((regvalue & PHY_LINKED_STATUS) == PHY_LINKED_STATUS){netif_set_flags(&gnetif, NETIF_FLAG_LINK_UP);if (netif_is_up(&gnetif) != 1){gnetif.link_callback(&gnetif);}}else{netif_clear_flags(&gnetif, NETIF_FLAG_LINK_UP);if (netif_is_up(&gnetif) != 0){gnetif.link_callback(&gnetif);}}
}
这个函数主要功能就是读取PHY的BSR寄存器查看连接状态,如果当前连接状态的物理状态和LWIP软件连接状态不一致则执行回调函数。
其中物理连接状态由软件定时器周期性设置,设置的bit为NETIF_FLAG_LINK_UP,软件连接状态由LWIP内核设置,设置的bit为NETIF_FLAG_UP。
5 优化启动速度
上电阶段有时网卡还未建立有效连接,ETH初始化函数会一直阻塞等待连接建立直至超时,默认的超时时间为5000ms,也就是说如果上电后网卡没有建立有效连接会一直阻塞等待5000ms,体验感非常差。为了解决这一问题,将以下2个宏定义修改成2000即可:
#define ETH_TIMEOUT_LINKED_STATE 2000U
#define ETH_TIMEOUT_AUTONEGO_COMPLETED 2000U
6 插拔测试
(1)上电后再插上网线,随后ping路由器

可以看到打印了“Lan link up!”,程序识别到了这一变化同时执行了回调函数,ping路由器正常。
(2)将网线拔下

可以看到打印了“Lan link down!”,程序识别到了这一变化同时执行了回调函数。
(3)反复执行(1)(2)查看是否正常。

反复执行也能保证稳定,测试结果正常。
7 总结
(1)LWIP实现热插拔的关键在于识别物理网口连接状态和软件连接状态是否一致,当二者不一致时则将软件连接状态设置为和物理网口连接状态一致。
(2)需要根据实际情况自定义回调函数。
(3)超时时间不要设置太短,实测2000ms有效。
相关文章:
LWIP热插拔功能实现
0 工具准备 1.lwip 1.4.1 2.RTOS(本文使用rt-thread)1 使能连接变化回调功能 打开lwipopts.h,将宏定义LWIP_NETIF_LINK_CALLBACK的值设为1,如下: #define LWIP_NETIF_LINK_CALLBACK 1这个宏定义被使能后会将…...
android下的app性能测试应主要针对那些方面,如何开展?
如何开展安卓手机下的App性能测试,对于优秀的测试人员而言,除了要懂得性能测试的步骤流程外,还应该懂的性能测试的一些其他知识,比如性能测试指标、各指标的意义,常用的性能测试工具、如何查看结果分析等等知识。所以本…...
【深度学习】注意力机制(二)
本文介绍一些注意力机制的实现,包括EA/MHSA/SK/DA/EPSA。 【深度学习】注意力机制(一) 【深度学习】注意力机制(三) 目录 一、EA(External Attention) 二、Multi Head Self Attention 三、…...
学习黑马vue
项目分析 项目下载地址:vue-admin-template-master: 学习黑马vue 项目下载后没有环境可参考我的篇文章,算是比较详细:vue安装与配置-CSDN博客 安装这两个插件可格式化代码,vscode这个软件是免费的,官网:…...
gdb本地调试版本移植至ARM-Linux系统
移植ncurses库 本文使用的ncurses版本为ncurses-5.9.tar.gz 下载地址:https://ftp.gnu.org/gnu/ncurses/ncurses-5.9.tar.gz 1. 将ncurses压缩包拷贝至Linux主机或使用wget命令下载并解压 tar-zxvf ncurses-5.9.tar.gz 2. 解压后进入到ncurses-5.9目录…...
《Linux C编程实战》笔记:实现自己的ls命令
关键函数的功能及说明 1.void display_attribute(struct stat buf,char *name) 函数功能:打印文件名为name的文件信息,如 含义分别为:文件的类型和访问权限,文件的链接数,文件的所有者,文件所有者所属的组…...
Python个人代码随笔(观看无益,请跳过)
异常抛错:一般来说,在程序中,遇到异常时,会从这一层逐层往外抛错,一直抛到最外层,由最外层把错误显示在用户终端。 try:raise ValueError("A value error...") except ValueError:print("V…...
Unity中实现ShaderToy卡通火(总结篇)
文章目录 前言一、把卡通火修改为后处理效果1、在Shader属性面板定义属性接收帧缓存纹理2、在片元着色器对其纹理采样后,与卡通火相加输出请添加图片描述 二、我们自定义卡通火1、修改 _CUTOFF 使卡通火显示在屏幕两侧2、使火附近屏幕偏红色 前言 在之前的文章中&a…...
等保2.0的变化
1法律地位得到确认 《中华人民共和国网络安全法》第21条规定“国家实行网络安全等级保护制度”,要求“网络运营者应当按照网络安全等级保护制度要求,履行安全保护义务”;第31条规定“对于国家关键信息基础设施,在网络安全等级保护…...
漏洞复现-网神SecGate3600防火墙敏感信息泄露漏洞(附漏洞检测脚本)
免责声明 文章中涉及的漏洞均已修复,敏感信息均已做打码处理,文章仅做经验分享用途,切勿当真,未授权的攻击属于非法行为!文章中敏感信息均已做多层打马处理。传播、利用本文章所提供的信息而造成的任何直接或者间接的…...
ArkTS入门
代码结构分析 struct Index{ } 「自定义组件:可复用的UI单元」 xxx 「装饰器:用来装饰类结构、方法、变量」 Entry 标记当前组件是入口组件(该组件可被独立访问,通俗来讲:它自己就是一个页面)Component 用…...
JS中for循环之退出循环
我为大家介绍一下退出循环的两种方法 1.continue 退出本次循环,一般用于排除或者跳过某一个选项的时候,可以使用continue for(let i 0;i<5;i){if(i 3){continue}// 跳过了3console.log(i) //0 1 2 4}2.break 退出整个for循环,一般用于…...
《Global illumination with radiance regression functions》
总结一下最近看的这篇结合神经网络的全局光照论文。 论文的主要思想是利用了神经网络的非线性特性去拟合全局光照中的间接光照部分,采用了基础的2层MLP去训练,最终能实现一些点光源、glossy材质的光照渲染。为了更好的理解、其输入输出表示如下。 首先…...
华南理工C++试卷
诚信应考 , 考试作弊将带来严重后果! 《C程序设计试卷》 注意事项:1. 考前请将密封线内填写清楚; 2. 所有答案请答在试卷的答案栏上; 3.考试形式:闭卷 4. 本试卷共 五 大题,满分100分ÿ…...
0001.WIN7(64位)安装ADS1.2出现L6218错误
用了十多年的笔记本电脑系统出现问题,硬件升级重装以后安装ADS1.2。在编译代码的时候出现L6218错误。如下: 图片是从网上找的,我编译出错的界面没有保留下来。 首先,代码本身没有任何问题 ,代码在win7(32位)下编译没有…...
HBuilderX 配置 夜神模拟器 详细图文教程
在电脑端查看App的效果,不用真机调试,下载一个模拟器就可以了 --- Nox Player,夜神模拟器,是一款 Android 模拟器。他的使用非常安全,最重要的是完全免费。 一. 安装模拟器 官网地址: (yeshen.com) 二.配…...
10、神秘的“位移主题”
神秘的“位移主题” 1、什么是位移主题2、位移主题的消息格式3、位移主题是怎么被创建的4、什么地方会用到位移主题5、位移主题的删除机制 本章主题是:Kafka 中的内部主题(Internal Topic)__consumer_offsets。 __consumer_offsets 在 Kafka …...
【Linux】dump命令使用
dump命令 dump命令用于备份文件系统。使用dump命令可以检查ext2/3/4文件系统上的文件,并确定哪些文件需要备份。这些文件复制到指定的磁盘、磁带或其他存储介质保管。 语法 dump [选项] [目录|文件系统] bash: dump: 未找到命令... 安装dump yum -y install …...
使用 TensorFlow 创建生产级机器学习模型(基于数据流编程的符号数学系统)——学习笔记
资源出处:初学者的 TensorFlow 2.0 教程 | TensorFlow Core (google.cn) 前言 对于新框架的学习,阅读官方文档是一种非常有效的方法。官方文档通常提供了关于框架的详细信息、使用方法和示例代码,可以帮助你快速了解和掌握框架的使用。 如…...
vue实现悬浮窗拖动的自定义指令
首先在自己的项目根目录下建一个 src --> config --> drag.js 然后在main.js中全局引入 //鼠标拖动 import drag from /config/drag; Vue.use(drag); drag.js文件相关代码 import Vue from vue; //使用Vue.directive()定义一个全局指令 //1.参数一:指令的…...
业务系统对接大模型的基础方案:架构设计与关键步骤
业务系统对接大模型:架构设计与关键步骤 在当今数字化转型的浪潮中,大语言模型(LLM)已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中,不仅可以优化用户体验,还能为业务决策提供…...
CTF show Web 红包题第六弹
提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框,很难让人不联想到SQL注入,但提示都说了不是SQL注入,所以就不往这方面想了 先查看一下网页源码,发现一段JavaScript代码,有一个关键类ctfs…...
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南 在数字化营销时代,邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天,我们将深入解析邮件打开率、网站可用性、页面参与时…...
有限自动机到正规文法转换器v1.0
1 项目简介 这是一个功能强大的有限自动机(Finite Automaton, FA)到正规文法(Regular Grammar)转换器,它配备了一个直观且完整的图形用户界面,使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...
Python ROS2【机器人中间件框架】 简介
销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...
HarmonyOS运动开发:如何用mpchart绘制运动配速图表
##鸿蒙核心技术##运动开发##Sensor Service Kit(传感器服务)# 前言 在运动类应用中,运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据,如配速、距离、卡路里消耗等,用户可以更清晰…...
Spring Security 认证流程——补充
一、认证流程概述 Spring Security 的认证流程基于 过滤器链(Filter Chain),核心组件包括 UsernamePasswordAuthenticationFilter、AuthenticationManager、UserDetailsService 等。整个流程可分为以下步骤: 用户提交登录请求拦…...
ubuntu22.04有线网络无法连接,图标也没了
今天突然无法有线网络无法连接任何设备,并且图标都没了 错误案例 往上一顿搜索,试了很多博客都不行,比如 Ubuntu22.04右上角网络图标消失 最后解决的办法 下载网卡驱动,重新安装 操作步骤 查看自己网卡的型号 lspci | gre…...
【iOS】 Block再学习
iOS Block再学习 文章目录 iOS Block再学习前言Block的三种类型__ NSGlobalBlock____ NSMallocBlock____ NSStackBlock__小结 Block底层分析Block的结构捕获自由变量捕获全局(静态)变量捕获静态变量__block修饰符forwarding指针 Block的copy时机block作为函数返回值将block赋给…...
Qt学习及使用_第1部分_认识Qt---Qt开发基本流程
前言 学以致用,通过QT框架的学习,一边实践,一边探索编程的方方面面. 参考书:<Qt 6 C开发指南>(以下称"本书") 标识说明:概念用粗体倾斜.重点内容用(加粗黑体)---重点内容(红字)---重点内容(加粗红字), 本书原话内容用深蓝色标识,比较重要的内容用加粗倾…...
