搜索
bottom↓
回复: 12

简单的web服务器,时间长之后会死机

[复制链接]

出0入0汤圆

发表于 2011-4-20 16:36:10 | 显示全部楼层 |阅读模式
在编程指南上简单的利用API编写的web服务器基础上做了修改,主要是将API换成socket,修改完全按照tcpserv例子修改,然后增加了网页自动刷新。

增加了一个线程,就是这个webserv程序,里面的流程如同tcpserv例程,先建立socket,然后绑定,然后监听,如果收到GET请求,就发送网页。

在一直刷新过程中,有时能刷几十次,有时能刷几百次甚至1千次,然后就没响应了,ping也无法ping通。程序一直停留在idle.c里的re_thread_idle_hook != RT_NULL这里, 或者在cmd.c里的rt_list_isempty这里。  我是一个刚学习的新手,不知道可能的原因是什么,请大家帮忙啊!

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2011-4-21 07:01:48 | 显示全部楼层
回复【楼主位】shpan_111  
程序一直停留在idle.c里的re_thread_idle_hook != rt_null这里, 或者在cmd.c里的rt_list_isempty这里。  
-----------------------------------------------------------------------

说明系统是正常的,调度器工作完好,系统处于idle线程中运行。

回复【楼主位】shpan_111  
然后就没响应了,ping也无法ping通。
-----------------------------------------------------------------------
说明驱动工作不正常,需要检查驱动代码。

出0入0汤圆

 楼主| 发表于 2011-4-21 09:26:42 | 显示全部楼层
回复【1楼】ffxz
-----------------------------------------------------------------------

-----------------------------------------------------------------------
说明驱动工作不正常,需要检查驱动代码。

多谢老大的回复。我想问下,你说的驱动是指哪部分呢? 是enc28j60还是什么? 使用的平台是stm32103RBT6 + enc28j60模块;是在project_lwip下面直接修改。其他的都没动,只是增加了一个web服务器线程。系统处于idle线程中运行,这时enc28j60的中断服务函数也能进去,能收到数据。但是web服务器线程的recv后面就是进不去。

出0入0汤圆

发表于 2011-4-21 10:21:42 | 显示全部楼层
你再关注下 中断服务程序确实能够进入?如果能够接收,那么再看看,发送是否有问题

如果ping不通了,驱动问题居多。

出0入0汤圆

 楼主| 发表于 2011-4-21 11:02:40 | 显示全部楼层
回复【3楼】ffxz
-----------------------------------------------------------------------
你再关注下 中断服务程序确实能够进入?如果能够接收,那么再看看,发送是否有问题

-------------------------------------------------------------------------------


中断程序确实能够进入,我跟踪了一下,enc28j60中断接受到了数据,然后调用rt_mb_send函数,这个函数返回的是一个邮箱满的值,是不是就是这个原因,邮箱已满导致消息无法传递,线程就无法响应了。我如果想让邮箱满了之后就覆盖最早未被处理的邮箱,该在哪里如何修改呢?

出0入0汤圆

 楼主| 发表于 2011-4-21 11:43:00 | 显示全部楼层
再次感谢大大的耐心解答啊。还是木有解决问题。

现在发现又不是邮箱满的原因。为了减小数据量,我将电脑直接与28j60连接,并且在邮箱满那里设置断点,发现死机的时候就没有达到过断点处。程序停留在idle线程,我ping命令,断点能够进入enc28j60_ISR();然后进入eth_device_ready;

再进入rt_mb_send,并且进入了线程调度函数rt_schedule();在这个调度里跟踪,计算出highest_ready_priority为15,与rtconfig.h设置的RT_LWIP_ETHTHREAD_PRIORITY优先级一致。

在跟踪eth_rx_thread_entry函数时设置断点,确实能够进入。也能够进入eth_tx_thread_entry函数,并到达enetif-eth_tx()而没有返回错误。按理说,能执行到这里,说明网口已经发送出来数据啊,可是结果ping回来的结果是timeout,这是为什么啊?

出0入0汤圆

发表于 2011-4-21 12:10:18 | 显示全部楼层
你用wiresharp等这类以太网抓包工具看看,是否数据已经发送出来,但数据有些问题?

出0入0汤圆

 楼主| 发表于 2011-4-21 15:03:06 | 显示全部楼层
回复【6楼】ffxz 你用wiresharp等这类以太网抓包工具看看,是否数据已经发送出来,但数据有些问题?
-----------------------------------------------------------------------


在enc28j60的发送函数里设置断点看数据,数据也没有问题。ping无法响应之后,程序收到了数据,然后发送数据,观察payload指向的数据,也是符合icmp协议的,mac和ip也是对的,也可以看出发送的类型是icmp的0类型,即echo应答。但是wiresharp就是没有,开始怀疑是不是买的enc28j60模块是坏的,但是它也不是完全不能发送。所以我觉得还是nec28j60的发送函数有问题。

    想起这样一个现象,死机都是在同时进行ping命令和网页刷新时产生的。所以怀疑这样一个问题,当收到网页请求时,由于网页内容很多,数据没有发送完,又要执行ping的发送请求,这个时候是不是就会产生问题。也就是说,enc28j60的发送buffer中还有web服务器数据时,ping的数据也写入了发送buffer,这会不会导致enc芯片无法发送??实验情况是,在执行发送命令后,增加了一个while,等待发送完成再往下执行,目前为止,1000次的数据传输还没有死机,更长时间的测试将继续。所以感觉是这里有问题。

出0入0汤圆

发表于 2011-4-22 14:13:06 | 显示全部楼层
自动刷新如何实现啊?

出0入0汤圆

发表于 2011-5-3 14:04:06 | 显示全部楼层
我是裸奔 LWIP  遇到同样的问题  协议版本lwip 1.4.0 RC2(测试版)  硬件IC ENC28J60

同时PING 与自动刷新 网页的时候   刷新几次页面就死机了(刷新时间 1秒钟一次)

自己通过浏览器刷新数据很多次数才死机  如果给外省的刷新数据2次就死机了(做了端口映射)

想跟楼主交流下 QQ 群:8753696

出0入0汤圆

发表于 2011-5-13 23:13:48 | 显示全部楼层
【9楼】 twd3621576
我想问的是你看过你的接收缓冲区是不是满了,如果是满了也是这样子,不在接收任何数据,直接给你扔掉。

出0入0汤圆

发表于 2011-12-16 16:39:28 | 显示全部楼层
我碰到了一样的问题,收数据没有问题,发送到达enetif-eth_tx()也没有问题,但这数据确实没发出去。
也不是每次都这样,但一旦出现这问题,不管多久都是ping不通了。抓图也看不到j60发出的数据。

出0入0汤圆

发表于 2011-12-17 00:05:29 | 显示全部楼层
可能是LWIP本身的问题。

在lwip的opt.h文件中,有个LWIP_TCPIP_CORE_LOCKING开关,使能试试看。我碰到的发送被阻塞的问题用这个办法解决了。

不过注释里面写有非LWIP项目组人员禁用的字样,应该是还在调试阶段,估计他们也意识到这类问题了。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-6-11 06:27

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表