|
RT-Thread官网的wiki页面上说:
在网口驱动中,最好添加上PHY中断相关通知,这样当网线因为松动或被断开时,lwIP能够知道网口已经断开。
我使用的是LWIP 1.0.3 版本,在代码中是按照如下方式添加了PHY中断
void PHY_IRQ(void)
{
/* enter interrupt */
rt_interrupt_enter();
//检查中断源
//清除中断标志
...
if (链路状态发生变化,比如网线拔出或者插上)
{
if (netif_is_link_up(netif))
{
tcpip_callback((void (*)(void *))netif_set_link_down, netif);
}
else
{
tcpip_callback((void (*)(void *))netif_set_link_up, netif);
}
}
/* leave interrupt */
rt_interrupt_leave();
}
上面的代码经过了一番简化,netif_is_link_up、netif_set_link_down、netif_set_link_up是lwip/tcpip.h中声明的函数。
我遇到的问题是:程序第一次进入中断后,就在中断中永远无法跳出了。
经过debug,发现问题出在tcpip_callback(这是一个宏,实际的函数是tcpip_callback_with_block,这个函数最终会调用内存分配函数rt_malloc),而rt_malloc是不能在中断中调用的(在rt-malloc函数中会执行RT_DEBUG_NOT_IN_INTERRUPT),然后程序就死在这了。
请问PHY中断的添加是应该按照这种方式还是有其他的方法,比如直接调用netif_set_link_up而不是tcpip_callback(netif_set_link_up)? |
阿莫论坛20周年了!感谢大家的支持与爱护!!
你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。
|