wellda 发表于 2010-7-27 12:35:59

长时间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 之类的,删不干净的话 怕内存泄漏 整个系统崩溃。

期待高手解答,谢谢!

ffxz 发表于 2010-7-27 14:09:00

中断进不了,把中断线引出来看看是否有触发。

另外就是你的硬件平台,驱动情况,需要你自行检查下。STM32 Radio在我这边测试可以达到7、8个小时连续播放。

wellda 发表于 2010-7-27 15:44:51

回复【1楼】ffxz
-----------------------------------------------------------------------


有触发的。
原先的驱动 没有检查连接状态,网线连续插拔 几次(不确定)就连不上了。ping不通


我想假如 重启动 lwip协议栈 可以吗?

ffxz 发表于 2010-7-27 15:57:02

有触发中断应该能够进入。驱动中应该是要加入PHY中断处理的,可以自行加入,这样就可以检测网线拔插的情况。

重启lwip不太现实。

wellda 发表于 2010-7-27 16:24:46

恩,我已经加了 phy 中断处理。 不过还是很感谢, 我要把 lwip 好好看一下。 检查以下网络崩掉的具体原因。

ffxz 发表于 2010-7-27 16:27:20

回复【4楼】wellda
恩,我已经加了 phy 中断处理。 不过还是很感谢, 我要把 lwip 好好看一下。 检查以下网络崩掉的具体原因。
-----------------------------------------------------------------------

从以往的经验来看,通常这个并不是lwip的原因,建议好好看看驱动的代码,还有硬件(最好拿示波器量量)。

fengzi2003 发表于 2010-7-27 17:51:25

这两天测试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老大再看看

ffxz 发表于 2010-7-27 18:16:31

加了这个?
while(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4))

是的,这个确实得加,因为DM9000AE外设是和STM32F103ZE之间是异步的,加这个会比较保险些。

BTW: 加这个后是否就不需要执行finsh下的手动复位了?

ffxz 发表于 2010-7-27 18:18:45

回复【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上吧,你有权限的。

eworker 发表于 2010-7-27 20:03:59

关注

fengzi2003 发表于 2010-7-27 21:02:31

回复【7楼】ffxz
加了这个?
while(gpio_readinputdatabit(gpioe,gpio_pin_4))
是的,这个确实得加,因为dm9000ae外设是和stm32f103ze之间是异步的,加这个会比较保险些。
btw: 加这个后是否就不需要执行finsh下的手动复位了?
-----------------------------------------------------------------------

rt_dm9000_isr();中有清寄存器ISR操作

wellda 发表于 2010-7-27 21:42:02

我明天试试顺便哪位 长时间 ping -t测试一下 过程中可以 不定期拔掉网线 再插上去看看有没有问题

shaolin 发表于 2010-7-28 06:55:00

我这边用radio的板子加网络例程试了下ping -t
从昨晚上十点开始ping的,中间不定期拔掉网线,拔网线后pc端会提示hardward error,重新插上网线后ping又正常了。
到现在为止没发现有异常,还在继续,准备再ping它一天看看。

ffxz 发表于 2010-7-28 19:20:55

等待shaolin的结果。

fengzi2003 发表于 2010-7-28 23:18:54

SVN代码昨天已经提交(R814),忘记添加信息说明了:(

今天测试了8个小时
*两个1024bytes ping
*加载udpecho,每5ms发送415bytes
*不定期拔插网线约十几次
*加载udpclient,不定期发包,每次8000个,每包间隔10ms
网络依然存活
(ps: UDP例程是直接加载到radio固件运行的,radio未进行任何操作)


另shaolin的测试是按照加“while(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4))”之后测试的吗?

shaolin 发表于 2010-7-29 00:26:24

我现在是直接用的stm32 radio网络例程,还没有加while(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4))
到现在为止还在运行,没有发现异常。算下来,有三十多小时了吧。

wellda 发表于 2010-7-29 11:06:54

多谢各位,就像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;”比较好    因为有可能一个机器 一开始没插网线或没启动,可能会错过初始化网络的机会。

anailson 发表于 2013-10-12 13:18:54

关注了。{:loveliness:}

lvyecc 发表于 2014-1-27 23:37:05

wellda 发表于 2010-7-29 11:06
多谢各位,就像ffxz所述,是驱动问题,改为stm32 radio 版本就可以了




楼主,您好,请问您现在的系统跑的稳定吗,除了ping,发TCP连接会死机吗?
我用s3c2440+dm9000+ucos也是经常死机,我看上面讨论说是硬件驱动程序问题,
请问能把DM9000驱动源码我参考下么,lvyecc@gmail.com,谢谢。

tomyqg 发表于 2014-3-26 08:54:52

加入linK change中断,根据LinK状态重新初始化网卡就好
页: [1]
查看完整版本: 长时间ping lwip会崩掉