1.问题描述:
使用xilinx官方SDK生成的freertos实时操作系统下的UDP服务端的工程代码时,当设备没有插网线而进行初始化会报自动协商错误,从而会将该线程的程序锁死,网口功能就无法正常使用。
如果插上网口进行初始化或者将自协商设置为100Mbps或者1000Mbps时,也不会出现上述问题。并且,如果网口初始化完成之后,是能够支持网口热拔插功能的。
2.解决方案:
(1) 将自动协商强制改为100Mbps或者1000Mbps:需要明确知道设备的网口的工作环境。
(2) 创建一个线程监控网口link状态:改动幅度较大,如果对协议栈不清楚不建议轻易修改。
(3) 在自动协商机制启动之前先判断网口link状态:较为简单,具体的修改流程如下:
① 打开”xemacpsif.c”文件:
② 找到”static err_t low_level_init(struct netif *netif)”函数:
③ 找到网口初始化:
④ 在网口初始化之后添加如下代码:
/* ============ start:新增代码:定时检测链路状态 ============*/
while(1)
{
u16_t status;
u32_t phy_addr = 0; /* 定义PHY地址 */
u32_t RegNum = 1; /* 定义寄存器数量*/
XEmacPs_PhyRead(&xemacpsif->emacps,phy_addr,1,&status);
xil_printf("IEEE_STATUS_REG_OFFSET=%d\r\n",status);
if(status & (0x01<<2)){
xil_printf("IEEE_STATUS_REG_OFFSET=%d\r\n",status);
break;
}else{
vTaskDelay(100);
}
}
/* ============ end:新增代码:定时检测链路状态 ============*/
⑤ 注意:如果重新设置了bsp包中的参数,那么这个代码会被系统覆盖掉。需要再一次手动添加。