lwip eth插拔网线自动维护接口状态
硬件连线就是将dp83848的INT脚连到STM32的某个中断脚上,这里是PB14
PB14的中断处理函数中,会释放一个信号量,这里只是发生链路状态改变中断(网线插上或拔下)
void EXTI15_10_IRQHandler(void)
{
portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE; if(EXTI_GetITStatus(ETH_LINK_EXTI_LINE) != RESET)
{
/* Give the semaphore to wakeup LwIP task */
xSemaphoreGiveFromISR( ETH_link_xSemaphore, &xHigherPriorityTaskWoken );
}
/* Clear interrupt pending bit */
EXTI_ClearITPendingBit(ETH_LINK_EXTI_LINE); /* Switch tasks if necessary. */
if( xHigherPriorityTaskWoken != pdFALSE )
{
portEND_SWITCHING_ISR( xHigherPriorityTaskWoken );
}
}
该信号量在eth_bsp.c中定义,在ETH_BSP_Config中创建,同时,启动一个Eth_Link_IT_task任务,阻塞在信号量上,侦听链路状态,
xSemaphoreHandle ETH_link_xSemaphore = NULL;
void ETH_BSP_Config(void)
{ if (ETH_link_xSemaphore == NULL)
{
/* create binary semaphore used for ETH_link handling */
vSemaphoreCreateBinary( ETH_link_xSemaphore );
} /* create the task that handles the ETH_link */
xTaskCreate(Eth_Link_IT_task, (signed char*) "E_link", ETH_LINK_TASK_STACK_SIZE, (void *)DP83848_PHY_ADDRESS,
ETH_LINK_TASK_PRIORITY,NULL);
}
在Eth_Link_IT_task任务中,会读取以太网寄存器,进一步判断链路状态变化的类型,是通还是断,网线插上了还是拔下了,
然后,将网络接口的链路状态设置为up或down。此处,在eth_bsp中引用xnetif有点别扭。。。由于需要读取PHY寄存器,所以,放在这儿了,是不是可以封装一下,由上面调用。。。
void Eth_Link_IT_task( void * pvParameters )
{
uint32_t pcPHYAddress; pcPHYAddress = ( uint32_t ) pvParameters; for(;;)
{
if (xSemaphoreTake( ETH_link_xSemaphore, emacBLOCK_TIME_WAITING_ETH_LINK_IT)==pdTRUE)
{
/* Check whether the link interrupt has occurred or not */
if(((ETH_ReadPHYRegister((uint16_t) pcPHYAddress, PHY_MISR)) & PHY_LINK_STATUS) != )
{
if((ETH_ReadPHYRegister((uint16_t) pcPHYAddress, PHY_SR) & ))
{
netif_set_link_up(&xnetif);
}
else
{
netif_set_link_down(&xnetif);
}
}
}
}
}
之后,netif_set_link_up里会调用用户挂接的link up down回调函数,该函数也在eth_bsp中,是ETH_link_callback,挂接是在netconf中创建xnetif的时候。
在ETH_link_callback中,
如果是up,会启动MAC(不知道启动的什么?),设置netif up(是接口up,不是link up);
如果是down,会停止MAC,设置netif down。
void ETH_link_callback(struct netif *netif)
{
if(netif_is_link_up(netif))
{
/* Restart MAC interface */
ETH_Start(); /* When the netif is fully configured this function must be called.*/
netif_set_up(&xnetif); }
else
{
ETH_Stop(); /* When the netif link is down this function must be called.*/
netif_set_down(&xnetif); }
}
上面的注释提到,link up down之后,netif up down必须调用,
因为,有些协议,比如arp和nd6,都是在netif down之后,清理arp缓存,nd的前缀、邻居信息的。
lwip eth插拔网线自动维护接口状态的更多相关文章
- 带卡扣的网卡接口使用小Tips,大家注意插拔网线的手法啊!
最近入手了一台X401,因为机器本身比较薄,它的网卡接口是有卡扣的,插网线的时候卡扣往下沉,这种设计应该有很多机型都采用了.但是大家有没有发现啊,这种接口的卡扣,时间长了,可能会有点松动.为了保护爱机 ...
- win7插着网线开机卡死,拔下网线开机正常
公司的部分win7电脑插着网线开机,进到桌面后网络图标转圈圈卡住.控制面板,启动项,任务管理器等都打不开.把网线拔下后再开机,电脑正常进入系统,后再插上网线就能正常上网了.被这个问题困扰了很久,百度也 ...
- ARM上的linux如何实现无线网卡的冷插拔和热插拔
ARM上的linux如何实现无线网卡的冷插拔和热插拔 fulinux 凌云实验室 1. 冷插拔 如果在系统上电之前就将RT2070/RT3070芯片的无线网卡(以下简称wlan)插上,即冷插拔.我们通 ...
- 在.NET Core中三种实现“可插拔”AOP编程方式(附源码)
一看标题肯定会联想到使用动态编织的方式实现AOP编程,不过这不是作者本文讨论的重点. 本文讨论另外三种在netcore中可实现的方式,Filter(过滤器,严格意义上它算是AOP方式),Dynamic ...
- Django中间件-跨站请求伪造-django请求生命周期-Auth模块-seettings实现可插拔配置(设计思想)
Django中间件 一.什么是中间件 django中间件就是类似于django的保安;请求来的时候需要先经过中间件,才能到达django后端(url,views,models,templates), ...
- 我心中的核心组件(可插拔的AOP)~第二回 缓存拦截器
回到目录 AOP面向切面的编程,也称面向方面的编程,我更青睐于前面的叫法,将一个大系统切成多个独立的部分,而这个独立的部分又可以方便的插拔在其它领域的系统之中,这种编程的方式我们叫它面向切面,而这些独 ...
- Oracle12c中多宿主容器数据库(CDBs)和可插拔数据库(PDBs)新特性之运行脚本
对开发者和DBA们来说,对shell脚本批量任务的影响成了多宿主选项带来的最大改变之一.因为多宿主环境通过服务来连接到可插拔数据库,因此,依靠CRON和OS认证成了换成多宿主环境后的一个最大问题.本文 ...
- Spring Boot(九)Swagger2自动生成接口文档和Mock模拟数据
一.简介 在当下这个前后端分离的技术趋势下,前端工程师过度依赖后端工程师的接口和数据,给开发带来了两大问题: 问题一.后端接口查看难:要怎么调用?参数怎么传递?有几个参数?参数都代表什么含义? 问题二 ...
- 如何在Windows服务程序中添加U盘插拔的消息
研究了下这个问题,主要要在一般的windows服务程序中修改两个地方: 一.调用RegisterServiceCtrlHandlerEx VOID WINAPI SvcMain( DWORD dwAr ...
随机推荐
- Vue中echarts的基本用法
前言:同大多数的前端框架一样,先读官网的使用方法.学会基本使用后,在实例中找到自己想要demo.拿过来改一改,一个echarts图表就形成,毕竟人家做就是为了方便使用. 我是在vue中下面直接使用的e ...
- JDBC超时设置【转】
恰当的JDBC超时设置能够有效地减少服务失效的时间.本文将对数据库的各种超时设置及其设置方法做介绍. 真实案例:应用服务器在遭到DDos攻击后无法响应 在遭到DDos攻击后,整个服务都垮掉了.由于第四 ...
- Centos 7.2 Jenkins+Ansible+Gitlab 基础配置
注意:首先准备jenkins服务器 如何搭建jenkins 由于上篇文章中jenkins是采用war并部署在tomcat中来完成的安装,所以这里隆重介绍下启动tomcat的用户:tomcat,下面会 ...
- 想玩转JAVA高并发,这些概念你必须懂!
我们在找工作时,经常在招聘信息上看到有这么一条:有构建大型互联网服务及高并发等经验,你第一时间想到的是媒体常说的双十一吗?带着问题,我们一起思考技术…. 高并发高并发 它是互联网分布式系统架构设计中必 ...
- url的分发
一.分发 补充:通过查看源码:可以通过二级路由include进行二次分发 位置:urls.py urlpatterns = [ path('admin/', admin.site.urls), pat ...
- Java入门 - 语言基础 - 13.Character类
原文地址:http://www.work100.net/training/java-character.html 更多教程:光束云 - 免费课程 Character类 序号 文内章节 视频 1 概述 ...
- Thematic002.字符串专题
目录 Trie字典树 KMP AC自动机 Manacher 回文自动机 后缀数组 后缀自动机 Trie字典树 概念 我们先来看看什么是Trie字典树 可以发现,这棵树的每一条边都有一个字符 有一些点是 ...
- MySQL 相关规约(v1.0) (转)
0)前言 a. 基本规约 [强制]表存储引擎必须使用InnoDB(针对主库一般是强制要求的) [强制]表字符集默认使用utf8,必要时候使用utf8mb4(个人踩坑:emoji表情存储问题)•说明:• ...
- Commvault Oracle备份常用命令
在进行Oracle数据库备份的配置.发起和恢复的过程中,需要用到许多Oracle数据库本身的命令.在此章节中进行命令的梳理,供大家参考. Oracle用户和实例相关命令 Linux/Unix平台 # ...
- Git详解之分支使用
前言 几乎每一种版本控制系统都以某种形式支持分支.使用分支意味着你可以从开发主线上分离开来,然后在不影响主线的同时继续工作.在很多版本控制系统中,这是个昂贵的过程,常常需要创建一个源代码目录的完整副本 ...