长时间ping lwip会崩掉
通过ping-t 192.168.0.30 ("192.168.0.30 "为目标机地址)dm9000 rx: status 4001 len 64
dm9000 rx: status 4001 len 64
dm9000 rx: status 4001 len 96
dm9000 rx: status 4001 len 96
dm9000 rx: status 4001 len 64
dm9000 rx: status 4001 len 96
dm9000 rx: status 0001 len 78
dm9000 tx: 74
dm9000 tx: first packet
dm9000 tx done
dm9000 rx: status 4001 len 96
时间长就死掉了
dm9000中断也进不去了
finsh>>dm9000()
NCR (0x00): 08
NSR (0x01): 4e
TCR (0x02): 00
TSRI(0x03): 00
TSRII (0x04): 00
RCR (0x05): 31
RSR (0x06): 40
ORCR(0x07): 80
CRR (0x2C): 19
CSCR(0x31): 00
RCSSR (0x32): 00
ISR (0xFE): 0f
IMR (0xFF): af
1, 0x00000001
finsh>>
cpu是stm32f103zet6
实在解决不了把协议栈杀掉该怎么做?因为里面有创建任务 和 mbox 之类的,删不干净的话 怕内存泄漏 整个系统崩溃。
期待高手解答,谢谢! 中断进不了,把中断线引出来看看是否有触发。
另外就是你的硬件平台,驱动情况,需要你自行检查下。STM32 Radio在我这边测试可以达到7、8个小时连续播放。 回复【1楼】ffxz
-----------------------------------------------------------------------
有触发的。
原先的驱动 没有检查连接状态,网线连续插拔 几次(不确定)就连不上了。ping不通
我想假如 重启动 lwip协议栈 可以吗? 有触发中断应该能够进入。驱动中应该是要加入PHY中断处理的,可以自行加入,这样就可以检测网线拔插的情况。
重启lwip不太现实。 恩,我已经加了 phy 中断处理。 不过还是很感谢, 我要把 lwip 好好看一下。 检查以下网络崩掉的具体原因。 回复【4楼】wellda
恩,我已经加了 phy 中断处理。 不过还是很感谢, 我要把 lwip 好好看一下。 检查以下网络崩掉的具体原因。
-----------------------------------------------------------------------
从以往的经验来看,通常这个并不是lwip的原因,建议好好看看驱动的代码,还有硬件(最好拿示波器量量)。 这两天测试radio板网络(radio 20100720新固件 加载 udpecho)的结果
网络一旦当掉(dm9000a中断输出持续为高)
手工复位DM9000的ISR(添加一个finsh函数),可以恢复网络。
将EXTI4中断服务函数改为
void EXTI4_IRQHandler(void)
{
#ifdef RT_USING_LWIP
extern void rt_dm9000_isr(void);
/* Clear the EXTI4 line pending bit */
EXTI_ClearITPendingBit(EXTI_Line4);
/* enter interrupt */
rt_interrupt_enter();
while(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4))
{
rt_dm9000_isr();
}
/* leave interrupt */
rt_interrupt_leave();
#endif
}
经测试比较长一段时间,暂时没有当掉
请ffxz老大再看看 加了这个?
while(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4))
是的,这个确实得加,因为DM9000AE外设是和STM32F103ZE之间是异步的,加这个会比较保险些。
BTW: 加这个后是否就不需要执行finsh下的手动复位了? 回复【6楼】fengzi2003枫孜
这两天测试radio板网络(radio 20100720新固件 加载 udpecho)的结果
网络一旦当掉(dm9000a中断输出持续为高)
手工复位dm9000的isr(添加一个finsh函数),可以恢复网络。
将exti4中断服务函数改为
void exti4_irqhandler(void)
{
#ifdef rt_using_lwip
extern void rt_dm9000_isr(void);
/* clear the exti4 line pending bit */
exti_clearitpendingbit(exti_line4);
/* enter interrupt */
rt_interrupt_enter();
while(gpio_readinputdatabit(gpioe,gpio_pin_4))
{
rt_dm9000_isr();
......
-----------------------------------------------------------------------
枫孜,这个while(gpio_readinputdatabit(gpioe,gpio_pin_4))你直接提交到svn上吧,你有权限的。 关注 回复【7楼】ffxz
加了这个?
while(gpio_readinputdatabit(gpioe,gpio_pin_4))
是的,这个确实得加,因为dm9000ae外设是和stm32f103ze之间是异步的,加这个会比较保险些。
btw: 加这个后是否就不需要执行finsh下的手动复位了?
-----------------------------------------------------------------------
rt_dm9000_isr();中有清寄存器ISR操作 我明天试试顺便哪位 长时间 ping -t测试一下 过程中可以 不定期拔掉网线 再插上去看看有没有问题 我这边用radio的板子加网络例程试了下ping -t
从昨晚上十点开始ping的,中间不定期拔掉网线,拔网线后pc端会提示hardward error,重新插上网线后ping又正常了。
到现在为止没发现有异常,还在继续,准备再ping它一天看看。 等待shaolin的结果。 SVN代码昨天已经提交(R814),忘记添加信息说明了:(
今天测试了8个小时
*两个1024bytes ping
*加载udpecho,每5ms发送415bytes
*不定期拔插网线约十几次
*加载udpclient,不定期发包,每次8000个,每包间隔10ms
网络依然存活
(ps: UDP例程是直接加载到radio固件运行的,radio未进行任何操作)
另shaolin的测试是按照加“while(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4))”之后测试的吗? 我现在是直接用的stm32 radio网络例程,还没有加while(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4))
到现在为止还在运行,没有发现异常。算下来,有三十多小时了吧。 多谢各位,就像ffxz所述,是驱动问题,改为stm32 radio 版本就可以了
if (dm9000_device.mode == DM9000_AUTO)
{
while (!(phy_read(1) & 0x20))
{
/* autonegation complete bit */
rt_thread_delay( RT_TICK_PER_SECOND/2 );
i++;
if (i > 20)
{
rt_kprintf("could not establish link\n");
return 0;
}
}
}
“return 0;”改为 “ return -RT_ERROR;”比较好 因为有可能一个机器 一开始没插网线或没启动,可能会错过初始化网络的机会。 关注了。{:loveliness:} wellda 发表于 2010-7-29 11:06
多谢各位,就像ffxz所述,是驱动问题,改为stm32 radio 版本就可以了
楼主,您好,请问您现在的系统跑的稳定吗,除了ping,发TCP连接会死机吗?
我用s3c2440+dm9000+ucos也是经常死机,我看上面讨论说是硬件驱动程序问题,
请问能把DM9000驱动源码我参考下么,lvyecc@gmail.com,谢谢。 加入linK change中断,根据LinK状态重新初始化网卡就好
页:
[1]