|
这个是单网线的:
【实战经验分享】一劳永逸的解决网线随意热插拔问题
http://www.armbbs.cn/forum.php?mod=viewthread&tid=95386
下面是双网线的:
- /*
- *********************************************************************************************************
- * 函 数 名: AppTaskEthCheck
- * 功能说明: 检查网线插拔状态。
- * 形 参: 无
- * 返 回 值: 无
- * 优 先 级: osPriorityNormal3
- *********************************************************************************************************
- */
- void AppTaskEthCheck(void *argument)
- {
- uint8_t ip4_dm9000addr[NET_ADDR_IP4_LEN];
- uint8_t ip4_dm9162addr[NET_ADDR_IP4_LEN];
- uint32_t *ip4_dm9000 = (uint32_t *)ip4_dm9000addr;
- uint32_t *ip4_dm9162 = (uint32_t *)ip4_dm9162addr;
- uint8_t ucDM9000Link = 0, ucDM9162Link = 0; /* 变量标志,方便任务处理*/
- uint8_t ucDM9000LinkStatus = 0, ucDM9162LinkStatus = 0; /* 变量标志,方便任务处理*/
- /* 初始化变量 */
- ThreadIdTaskDM9162Pro = NULL;
- ThreadIdTaskDM9000Pro = NULL;
- g_ucDM9162LinkStatus = 0;
- g_ucDM9000LinkStatus = 0;
- /* 初始化网络 */
- netInitialize();
- while(1)
- {
- /* 网线插拔处理,方便移植,大家也可以根据需要发送任务事件标志做处理 */
- switch (g_ucDM9162LinkStatus)
- {
- /* 插拔临时状态,无需处理 */
- case 0:
- case 1:
- break;
- /* 网线插入,创应用任务 */
- case 2:
- if(ucDM9162Link == 0)
- {
- netIF_GetOption (NET_IF_CLASS_ETH | 0, netIF_OptionIP4_Address, ip4_dm9162addr, sizeof (ip4_dm9162addr));
- printf_taskdbg("DM9162网线插入,等待获取IP地址....\r\n");
- /* 从DHCP服务器获取了IP地址 */
- if(*ip4_dm9162 != 0)
- {
- printf("DM9162的IP地址:%d.%d.%d.%d\r\n", ip4_dm9162addr[0],ip4_dm9162addr[1],
- ip4_dm9162addr[2], ip4_dm9162addr[3]);
- printf_taskdbg("DM9162创建应用任务\r\n");
- if(ThreadIdTaskDM9162Pro == NULL)
- {
- ThreadIdTaskDM9162Pro = osThreadNew(AppTaskDM9162Pro, NULL, &ThreadDM9162Pro_Attr);
- }
- ucDM9162Link = 2;
- ucDM9162LinkStatus = 2;
- }
- }
- break;
- /* 网线拔掉,复位网络,删除应用任务 */
- case 3:
- printf_taskdbg("DM9162网线拔掉\r\n");
- g_ucDM9162LinkStatus = 0;
- ucDM9162Link = 0;
- ucDM9162LinkStatus = 3;
- break;
- /* 其他的键值不处理 */
- default:
- break;
- }
- switch (g_ucDM9000LinkStatus)
- {
- /* 插拔临时状态,无需处理 */
- case 0:
- case 1:
- break;
- /* 网线插入,创应用任务 */
- case 2:
- if(ucDM9000Link == 0)
- {
- netIF_GetOption (NET_IF_CLASS_ETH | 1, netIF_OptionIP4_Address, ip4_dm9000addr, sizeof (ip4_dm9000addr));
- printf_taskdbg("DM9000网线插入,等待获取IP地址....\r\n");
- /* 从DHCP服务器获取了IP地址 */
- if(*ip4_dm9000 != 0)
- {
- printf("DM9000的IP地址:%d.%d.%d.%d\r\n", ip4_dm9000addr[0],ip4_dm9000addr[1],
- ip4_dm9000addr[2], ip4_dm9000addr[3]);
- printf_taskdbg("DM9000创建应用任务\r\n");
- if(ThreadIdTaskDM9000Pro == NULL)
- {
- ThreadIdTaskDM9000Pro = osThreadNew(AppTaskDM9000Pro, NULL, &ThreadDM9000Pro_Attr);
- }
- ucDM9000Link = 2;
- ucDM9000LinkStatus = 2;
- }
- }
- break;
- /* 网线拔掉,复位网络,删除应用任务 */
- case 3:
- printf_taskdbg("DM9000网线拔掉\r\n");
- g_ucDM9000LinkStatus = 0;
- ucDM9000Link = 0;
- ucDM9000LinkStatus = 3;
- break;
- /* 其他的键值不处理 */
- default:
- break;
- }
- /* 网线拔掉,复位网络,删除应用任务 */
- if((ucDM9000LinkStatus == 3)&&(ucDM9162LinkStatus == 3))
- {
- printf_taskdbg("网线都被拔掉,复位网络,删除应用任务\r\n");
- /* 释放所有网络资源,含TCPnet内核任务和ETH接口任务 */
- netUninitialize();
- printf_taskdbg("netUninitialize\r\n");
- /* 删除TCPnet应用任务 */
- if(ThreadIdTaskDM9162Pro != NULL)
- {
- ThreadIdTaskDM9162Pro = NULL;
- osThreadTerminate(ThreadIdTaskDM9162Pro);
- }
- if(ThreadIdTaskDM9000Pro != NULL)
- {
- ThreadIdTaskDM9000Pro = NULL;
- osThreadTerminate(ThreadIdTaskDM9000Pro);
- }
- g_ucDM9162LinkStatus = 0;
- g_ucDM9000LinkStatus = 0;
- ucDM9162LinkStatus = 0;
- ucDM9000LinkStatus = 0;
- ucDM9162Link = 0;
- ucDM9000Link = 0;
- /* 重新初始化 */
- netInitialize();
- printf_taskdbg("netInitialize\r\n");
- }
- osDelay(100);
- }
- }
复制代码 |
|