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 ...
随机推荐
- python列表的方法(改变原列表)
xxx.append() 末尾添加一个元素效果图: 代码: # append() 末尾添加一个元素 my_list = ['] print('原列表:',my_list) my_list.a ...
- 阿里云Centos7.X 如何对外开放端口
一句话:如果你是买的各大厂商的云服务器,去安全组配置对应需要使用到的端口就可以啦! 因为博主用的是阿里云,所以这里就只介绍下阿里云如何开放端口,按着下面三张图来操作就行嘞 这个时候有同学就说了,不通过 ...
- SPSS 相关性的选择
在SPSS中导入数据,analyze-correlate-bivariate-选择变量 OK 输出的是相关系数矩阵 相关系数下面的Sig.是显著性检验结果的P值,越接近0越显著. 同样的数据,我们接着 ...
- Activiti工作流引擎开发系列
Activiti工作流引擎开发系列-01 作者:Jesai 没有伞的孩子,只能光脚奔跑! 前言: 初次接触工作流这个概念是自从2014年11月份开始,当时是由于我的毕业设计需要,还记得当时我毕业设计的 ...
- MongoDB数据库备份和恢复
1.数据库备份 mogodbdump -h dbhost -d dbname -o dbdirectory -h: 服务器地址,也可以指定端口号 -d: 需要备份的数据库的名称 -o: 备份的数据库存 ...
- ancconda创建爬虫项目
# 安装 conda env list conda create -n <envname> conda activate <envname> conda install scr ...
- 机器学习环境配置系列一之CUDA
本文配置的环境为redhat6.9+cuda10.0+cudnn7.3.1+anaonda6.7+theano1.0.0+keras2.2.0+jupyter远程,其中cuda的版本为10.0. 第一 ...
- mysql5.7的基本使用
mysql的基本使用:最简单的增删改查 (建议用类似记事本的东西写代码,错了容易改) 以下就是这篇文章的代码 一,增和查 CREATE DATABASE one; 新建了一个名为one的数据库 S ...
- Thumb.db看不到的问题
今天读取数据集的时候总是会读到一个Thumb.db的缩略图文件,点开查看选项里面的显示隐藏文件.文件夹处于勾选状态,此时文件夹中并不存在此文件. 解决方案: 勾选掉隐藏受保护的操作系统文件即可.
- Nginx配置及负载均衡
转载:http://www.cnblogs.com/jingmoxukong/p/5945200.html nginx简易教程 目录 Nginx 概述 安装与使用 nginx 配置实战 参 ...