硬件连线就是将dp83848的INT脚连到STM32的某个中断脚上,这里是PB14

PB14的中断处理函数中,会释放一个信号量,这里只是发生链路状态改变中断(网线插上或拔下)

  1. void EXTI15_10_IRQHandler(void)
  2. {
  3. portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
  4.  
  5. if(EXTI_GetITStatus(ETH_LINK_EXTI_LINE) != RESET)
  6. {
  7. /* Give the semaphore to wakeup LwIP task */
  8. xSemaphoreGiveFromISR( ETH_link_xSemaphore, &xHigherPriorityTaskWoken );
  9. }
  10. /* Clear interrupt pending bit */
  11. EXTI_ClearITPendingBit(ETH_LINK_EXTI_LINE);
  12.  
  13. /* Switch tasks if necessary. */
  14. if( xHigherPriorityTaskWoken != pdFALSE )
  15. {
  16. portEND_SWITCHING_ISR( xHigherPriorityTaskWoken );
  17. }
  18. }

该信号量在eth_bsp.c中定义,在ETH_BSP_Config中创建,同时,启动一个Eth_Link_IT_task任务,阻塞在信号量上,侦听链路状态,

  1. xSemaphoreHandle ETH_link_xSemaphore = NULL;

  2. void ETH_BSP_Config(void)
  3. {
  4.  
  5. if (ETH_link_xSemaphore == NULL)
  6. {
  7. /* create binary semaphore used for ETH_link handling */
  8. vSemaphoreCreateBinary( ETH_link_xSemaphore );
  9. }
  10.  
  11. /* create the task that handles the ETH_link */
  12. xTaskCreate(Eth_Link_IT_task, (signed char*) "E_link", ETH_LINK_TASK_STACK_SIZE, (void *)DP83848_PHY_ADDRESS,
  13. ETH_LINK_TASK_PRIORITY,NULL);
  14. }

在Eth_Link_IT_task任务中,会读取以太网寄存器,进一步判断链路状态变化的类型,是通还是断,网线插上了还是拔下了,

然后,将网络接口的链路状态设置为up或down。此处,在eth_bsp中引用xnetif有点别扭。。。由于需要读取PHY寄存器,所以,放在这儿了,是不是可以封装一下,由上面调用。。。

  1. void Eth_Link_IT_task( void * pvParameters )
  2. {
  3. uint32_t pcPHYAddress;
  4.  
  5. pcPHYAddress = ( uint32_t ) pvParameters;
  6.  
  7. for(;;)
  8. {
  9. if (xSemaphoreTake( ETH_link_xSemaphore, emacBLOCK_TIME_WAITING_ETH_LINK_IT)==pdTRUE)
  10. {
  11. /* Check whether the link interrupt has occurred or not */
  12. if(((ETH_ReadPHYRegister((uint16_t) pcPHYAddress, PHY_MISR)) & PHY_LINK_STATUS) != )
  13. {
  14. if((ETH_ReadPHYRegister((uint16_t) pcPHYAddress, PHY_SR) & ))
  15. {
  16. netif_set_link_up(&xnetif);
  17. }
  18. else
  19. {
  20. netif_set_link_down(&xnetif);
  21. }
  22. }
  23. }
  24. }
  25. }

之后,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。

  1. void ETH_link_callback(struct netif *netif)
  2. {
  3. if(netif_is_link_up(netif))
  4. {
  5. /* Restart MAC interface */
  6. ETH_Start();
  7.  
  8. /* When the netif is fully configured this function must be called.*/
  9. netif_set_up(&xnetif); }
  10. else
  11. {
  12. ETH_Stop();
  13.  
  14. /* When the netif link is down this function must be called.*/
  15. netif_set_down(&xnetif); }
  16. }

上面的注释提到,link up down之后,netif up down必须调用,

因为,有些协议,比如arp和nd6,都是在netif down之后,清理arp缓存,nd的前缀、邻居信息的。

lwip eth插拔网线自动维护接口状态的更多相关文章

  1. 带卡扣的网卡接口使用小Tips,大家注意插拔网线的手法啊!

    最近入手了一台X401,因为机器本身比较薄,它的网卡接口是有卡扣的,插网线的时候卡扣往下沉,这种设计应该有很多机型都采用了.但是大家有没有发现啊,这种接口的卡扣,时间长了,可能会有点松动.为了保护爱机 ...

  2. win7插着网线开机卡死,拔下网线开机正常

    公司的部分win7电脑插着网线开机,进到桌面后网络图标转圈圈卡住.控制面板,启动项,任务管理器等都打不开.把网线拔下后再开机,电脑正常进入系统,后再插上网线就能正常上网了.被这个问题困扰了很久,百度也 ...

  3. ARM上的linux如何实现无线网卡的冷插拔和热插拔

    ARM上的linux如何实现无线网卡的冷插拔和热插拔 fulinux 凌云实验室 1. 冷插拔 如果在系统上电之前就将RT2070/RT3070芯片的无线网卡(以下简称wlan)插上,即冷插拔.我们通 ...

  4. 在.NET Core中三种实现“可插拔”AOP编程方式(附源码)

    一看标题肯定会联想到使用动态编织的方式实现AOP编程,不过这不是作者本文讨论的重点. 本文讨论另外三种在netcore中可实现的方式,Filter(过滤器,严格意义上它算是AOP方式),Dynamic ...

  5. Django中间件-跨站请求伪造-django请求生命周期-Auth模块-seettings实现可插拔配置(设计思想)

    Django中间件 一.什么是中间件 django中间件就是类似于django的保安;请求来的时候需要先经过中间件,才能到达django后端(url,views,models,templates), ...

  6. 我心中的核心组件(可插拔的AOP)~第二回 缓存拦截器

    回到目录 AOP面向切面的编程,也称面向方面的编程,我更青睐于前面的叫法,将一个大系统切成多个独立的部分,而这个独立的部分又可以方便的插拔在其它领域的系统之中,这种编程的方式我们叫它面向切面,而这些独 ...

  7. Oracle12c中多宿主容器数据库(CDBs)和可插拔数据库(PDBs)新特性之运行脚本

    对开发者和DBA们来说,对shell脚本批量任务的影响成了多宿主选项带来的最大改变之一.因为多宿主环境通过服务来连接到可插拔数据库,因此,依靠CRON和OS认证成了换成多宿主环境后的一个最大问题.本文 ...

  8. Spring Boot(九)Swagger2自动生成接口文档和Mock模拟数据

    一.简介 在当下这个前后端分离的技术趋势下,前端工程师过度依赖后端工程师的接口和数据,给开发带来了两大问题: 问题一.后端接口查看难:要怎么调用?参数怎么传递?有几个参数?参数都代表什么含义? 问题二 ...

  9. 如何在Windows服务程序中添加U盘插拔的消息

    研究了下这个问题,主要要在一般的windows服务程序中修改两个地方: 一.调用RegisterServiceCtrlHandlerEx VOID WINAPI SvcMain( DWORD dwAr ...

随机推荐

  1. Unity 基于Cinemachine计算透视摄像机在地图中的移动范围

    Unity中Cinemachine的基础功能介绍可详见之前写的博客: https://www.cnblogs.com/koshio0219/p/11820654.html 本篇的重点是讨论,在给定规则 ...

  2. C++数值计算

    1.序 (1)程序设计分两种: 1.结构化设计(面向过程)——分解算法为模块,将算法的步骤分解为模块. 2.面向对象程序设计——主要是“类”与“对象”. (2)进制的转换 1.二进制转十进制 整数部分 ...

  3. 关于爬虫的日常复习(6)—— pyquery库

  4. 头条一面竟然问我Maven?

    maven package和maven install 有什么区别? 你常用的maven命令有哪些? <dependencyManagement> 是干什么的? 还有用过其它构建工具吗? ...

  5. SqlServer分页存储过程(多表查询,多条件排序),Repeater控件呈现数据以及分页

        存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,存储在数据库中,经过第一次编译后再次调用不需要再次编译,用户通过指定存储过程的名字并给出 ...

  6. Android studio 连接真机

    首先用数据线连接真机 1.打开开发者模式(小米手机mix2s为例 设置->我的设备->全部参数->连续点击MIUI版本——开启成功) 2.在更多设置中找到系统安全设置——允许安装未知 ...

  7. Qt Installer Framework翻译(5-4)

    自定义安装程序 您可以使用脚本通过以下方式来自定义安装程序: > 添加Qt Installer Framework操作,该操作由脚本提供,并由安装程序执行. > 添加新页面,该页面由您在p ...

  8. 在eclipse里用jdbc连接MySQL

    进入MySQL控制台, 输入密码, 新建数据库test1并给用户授权,用户名“jaovo”, 创建表,id主键自增, 下载jdbc驱动包(jar文件) 把它放进tomcat的安装目录lib文件夹下(我 ...

  9. 【Oracle】复制表结构和表数据

    1.既复制表结构也复制表数据:CREATE TABLE tab_new AS SELECT * FROM tab_old; 2.只复制表结构:CREATE TABLE tab_new AS SELEC ...

  10. git recommend(alive)

    初始化并跟踪远程分支: echo "# test" >> README.mdgit initgit add README.mdgit commit -m "f ...