硬汉嵌入式论坛

 找回密码
 立即注册
查看: 2805|回复: 1
收起左侧

[以太网] 双网口的网线插拔状态处理(2020-11-22)

[复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107396
QQ
发表于 2020-11-22 15:51:06 | 显示全部楼层 |阅读模式

这个是单网线的:

【实战经验分享】一劳永逸的解决网线随意热插拔问题
http://www.armbbs.cn/forum.php?mod=viewthread&tid=95386


下面是双网线的:

  1. /*
  2. *********************************************************************************************************
  3. *        函 数 名: AppTaskEthCheck
  4. *        功能说明: 检查网线插拔状态。
  5. *        形    参: 无
  6. *        返 回 值: 无
  7. *   优 先 级: osPriorityNormal3  
  8. *********************************************************************************************************
  9. */
  10. void AppTaskEthCheck(void *argument)
  11. {
  12.     uint8_t ip4_dm9000addr[NET_ADDR_IP4_LEN];
  13.     uint8_t ip4_dm9162addr[NET_ADDR_IP4_LEN];
  14.     uint32_t *ip4_dm9000 = (uint32_t *)ip4_dm9000addr;
  15.     uint32_t *ip4_dm9162 = (uint32_t *)ip4_dm9162addr;
  16.     uint8_t ucDM9000Link = 0, ucDM9162Link = 0;             /* 变量标志,方便任务处理*/
  17.     uint8_t ucDM9000LinkStatus = 0, ucDM9162LinkStatus = 0; /* 变量标志,方便任务处理*/

  18.     /* 初始化变量 */
  19.     ThreadIdTaskDM9162Pro = NULL;
  20.     ThreadIdTaskDM9000Pro = NULL;
  21.     g_ucDM9162LinkStatus = 0;
  22.     g_ucDM9000LinkStatus = 0;

  23.     /* 初始化网络 */
  24.     netInitialize();

  25.     while(1)
  26.     {
  27.         /* 网线插拔处理,方便移植,大家也可以根据需要发送任务事件标志做处理 */
  28.         switch (g_ucDM9162LinkStatus)
  29.         {
  30.             /* 插拔临时状态,无需处理 */
  31.             case 0:
  32.             case 1:       
  33.             break;       

  34.             /* 网线插入,创应用任务 */
  35.             case 2:
  36.                 if(ucDM9162Link == 0)
  37.                 {
  38.                 netIF_GetOption (NET_IF_CLASS_ETH | 0, netIF_OptionIP4_Address, ip4_dm9162addr, sizeof (ip4_dm9162addr));

  39.                 printf_taskdbg("DM9162网线插入,等待获取IP地址....\r\n");
  40.                 /* 从DHCP服务器获取了IP地址 */
  41.                 if(*ip4_dm9162 != 0)
  42.                 {
  43.                     printf("DM9162的IP地址:%d.%d.%d.%d\r\n", ip4_dm9162addr[0],ip4_dm9162addr[1],
  44.                     ip4_dm9162addr[2], ip4_dm9162addr[3]);

  45.                     printf_taskdbg("DM9162创建应用任务\r\n");

  46.                     if(ThreadIdTaskDM9162Pro == NULL)
  47.                     {
  48.                         ThreadIdTaskDM9162Pro = osThreadNew(AppTaskDM9162Pro, NULL, &ThreadDM9162Pro_Attr);
  49.                     }
  50.                     ucDM9162Link = 2;
  51.                     ucDM9162LinkStatus = 2;
  52.                 }
  53.                 }
  54.                 break;       

  55.             /* 网线拔掉,复位网络,删除应用任务 */
  56.             case 3:
  57.                 printf_taskdbg("DM9162网线拔掉\r\n");
  58.                 g_ucDM9162LinkStatus = 0;
  59.                 ucDM9162Link = 0;
  60.                 ucDM9162LinkStatus = 3;            
  61.                 break;

  62.             /* 其他的键值不处理 */
  63.             default:                     
  64.                 break;
  65.         }

  66.         switch (g_ucDM9000LinkStatus)
  67.         {
  68.             /* 插拔临时状态,无需处理 */
  69.             case 0:
  70.             case 1:       
  71.             break;       

  72.             /* 网线插入,创应用任务 */
  73.             case 2:
  74.                 if(ucDM9000Link == 0)
  75.                 {       
  76.                     netIF_GetOption (NET_IF_CLASS_ETH | 1, netIF_OptionIP4_Address, ip4_dm9000addr, sizeof (ip4_dm9000addr));

  77.                     printf_taskdbg("DM9000网线插入,等待获取IP地址....\r\n");
  78.                     /* 从DHCP服务器获取了IP地址 */
  79.                     if(*ip4_dm9000 != 0)
  80.                     {
  81.                         printf("DM9000的IP地址:%d.%d.%d.%d\r\n", ip4_dm9000addr[0],ip4_dm9000addr[1],
  82.                         ip4_dm9000addr[2], ip4_dm9000addr[3]);


  83.                         printf_taskdbg("DM9000创建应用任务\r\n");
  84.                         if(ThreadIdTaskDM9000Pro == NULL)
  85.                         {
  86.                             ThreadIdTaskDM9000Pro = osThreadNew(AppTaskDM9000Pro, NULL, &ThreadDM9000Pro_Attr);
  87.                         }
  88.                         ucDM9000Link = 2;
  89.                         ucDM9000LinkStatus = 2;
  90.                     }
  91.                 }
  92.                 break;       

  93.             /* 网线拔掉,复位网络,删除应用任务 */
  94.             case 3:
  95.                 printf_taskdbg("DM9000网线拔掉\r\n");
  96.                 g_ucDM9000LinkStatus = 0;
  97.                 ucDM9000Link = 0;
  98.                 ucDM9000LinkStatus = 3;
  99.                 break;

  100.             /* 其他的键值不处理 */
  101.             default:                     
  102.                 break;
  103.         }

  104.         /* 网线拔掉,复位网络,删除应用任务 */
  105.         if((ucDM9000LinkStatus == 3)&&(ucDM9162LinkStatus == 3))
  106.             {
  107.             printf_taskdbg("网线都被拔掉,复位网络,删除应用任务\r\n");

  108.             /* 释放所有网络资源,含TCPnet内核任务和ETH接口任务 */       
  109.             netUninitialize();

  110.             printf_taskdbg("netUninitialize\r\n");

  111.             /* 删除TCPnet应用任务 */
  112.             if(ThreadIdTaskDM9162Pro != NULL)
  113.             {
  114.                 ThreadIdTaskDM9162Pro = NULL;
  115.                 osThreadTerminate(ThreadIdTaskDM9162Pro);
  116.             }

  117.             if(ThreadIdTaskDM9000Pro != NULL)
  118.             {
  119.                 ThreadIdTaskDM9000Pro = NULL;
  120.                 osThreadTerminate(ThreadIdTaskDM9000Pro);
  121.             }

  122.             g_ucDM9162LinkStatus = 0;
  123.             g_ucDM9000LinkStatus = 0;
  124.             ucDM9162LinkStatus = 0;
  125.             ucDM9000LinkStatus = 0;
  126.             ucDM9162Link = 0;
  127.             ucDM9000Link = 0;

  128.             /* 重新初始化 */
  129.             netInitialize();

  130.             printf_taskdbg("netInitialize\r\n");
  131.         }

  132.         osDelay(100);
  133.     }       
  134. }
复制代码
回复

使用道具 举报

3

主题

1244

回帖

1253

积分

至尊会员

积分
1253
发表于 2020-11-22 20:49:30 | 显示全部楼层
下周发布了,对吧?硬汉大哥
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-30 00:26 , Processed in 0.164859 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表