OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 7395|回复: 19

LWIP+UCOSIII连续多次调用netconn_write导致协议栈卡死

[复制链接]

27

主题

118

帖子

0

精华

高级会员

Rank: 4

积分
845
金钱
845
注册时间
2015-12-8
在线时间
175 小时
发表于 2017-12-27 20:08:21 | 显示全部楼层 |阅读模式
5金钱
[mw_shl_code=c,true]while(1)
                                                        {
                                                                //OSSemPend(&MY_SERVER_SEM,0,OS_OPT_PEND_BLOCKING,0,&os_err);
                                                                f_read(http_file,tcp_server_sendbuf,3500,&br);
                                                                printf("%dsending\r\n",i);
                                                                write_err=netconn_write(conn,tcp_server_sendbuf ,br,NETCONN_COPY);
                                                                if(br<3500)break;
                                                        }[/mw_shl_code]我做的是一个多线程的WEBSERVER服务器,在子线程中连续多次调用netconn_write()发送数据时,LWIP会卡在netconn_write()中,没有数据返回,ping也不通,不知道是什么原因,有人遇到过这种情况吗?顺便问一下,如果任务堆栈设置过小,程序会直接进入硬件错误中断里吗?还是会继续运行,只是运行的结果会出错?因为我设置LWIP内核任务的堆栈大小为250,原子的是1000,不知道会有什么影响。求大神解答

最佳答案

查看完整内容[请看2#楼]

如果内存够用,任务堆栈设置大些更好,不过你这的问题不是堆栈,如果是栈溢出就不单单是lwip协议栈卡死,而是运行一段时间进入hardfault才对,你这能恢复,就肯定不是这个问题,而是协议栈的配置有问题,这主要原因是协议栈内部的配置的内存池数量,允许的最大tcp链接数,还有各种缓冲区的配置是默认的,在应用中如果http包接收过于频繁,就会导致协议栈卡死(默认配置是不会考虑这些情况的),这个需要对协议栈深入了解重新配置 ...
为自己掌握新的知识感到快乐
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

400

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1746
金钱
1746
注册时间
2015-6-11
在线时间
308 小时
发表于 2017-12-27 20:08:22 | 显示全部楼层
   如果内存够用,任务堆栈设置大些更好,不过你这的问题不是堆栈,如果是栈溢出就不单单是lwip协议栈卡死,而是运行一段时间进入hardfault才对,你这能恢复,就肯定不是这个问题,而是协议栈的配置有问题,这主要原因是协议栈内部的配置的内存池数量,允许的最大tcp链接数,还有各种缓冲区的配置是默认的,在应用中如果http包接收过于频繁,就会导致协议栈卡死(默认配置是不会考虑这些情况的),这个需要对协议栈深入了解重新配置才能解决(附件中有我之前项目调试的配置信息),
   另外还要从设计上减少http的链接数和数据大小,这个主要方法有压缩文件(如html,css,js压缩) , 合并请求(将图片以base64字串存放在http中) , 利用ajax取代cgi模式实现数据通讯,这些都是可行的方案, 不过需要对http和前端那一块比较熟悉,上述两个是可以同时进行优化的,建议你都了解学习下。

lwipopts.rar

4.67 KB, 下载次数: 141

回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165352
金钱
165352
注册时间
2010-12-1
在线时间
2108 小时
发表于 2017-12-28 00:47:22 | 显示全部楼层
过小可能hardfault
回复

使用道具 举报

27

主题

118

帖子

0

精华

高级会员

Rank: 4

积分
845
金钱
845
注册时间
2015-12-8
在线时间
175 小时
 楼主| 发表于 2017-12-28 09:00:36 | 显示全部楼层
有人遇到过在这种情况下卡死的现象吗
回复

使用道具 举报

4

主题

346

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3657
金钱
3657
注册时间
2016-2-21
在线时间
542 小时
发表于 2017-12-28 09:11:16 | 显示全部楼层
是否使用了大的局部变量,比如一个1024大小的数组。这样调度的时候,任务栈肯定直接爆了,因为局部变量是要被压到任务栈里去的
回复

使用道具 举报

30

主题

1170

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1993
金钱
1993
注册时间
2016-2-16
在线时间
527 小时
发表于 2017-12-28 09:14:01 | 显示全部楼层
所谓卡死,要是是进入hardfault,要么是死循环,或者某几个任务把时间占用满了,原因得自己查,鬼知道他为什么卡死。
回复

使用道具 举报

27

主题

118

帖子

0

精华

高级会员

Rank: 4

积分
845
金钱
845
注册时间
2015-12-8
在线时间
175 小时
 楼主| 发表于 2017-12-28 09:55:16 | 显示全部楼层
憨厚诚实大叔 发表于 2017-12-28 09:14
所谓卡死,要是是进入hardfault,要么是死循环,或者某几个任务把时间占用满了,原因得自己查,鬼知道他为 ...

其他的任务还是能够正常调度和运行,LWIP ping不通,收发不了数据了
为自己掌握新的知识感到快乐
回复

使用道具 举报

27

主题

118

帖子

0

精华

高级会员

Rank: 4

积分
845
金钱
845
注册时间
2015-12-8
在线时间
175 小时
 楼主| 发表于 2017-12-28 09:57:14 | 显示全部楼层
shikihane 发表于 2017-12-28 09:11
是否使用了大的局部变量,比如一个1024大小的数组。这样调度的时候,任务栈肯定直接爆了,因为局部变量是要 ...

没有使用大的局部变量,大数组使用动态内存方式分配的
为自己掌握新的知识感到快乐
回复

使用道具 举报

27

主题

118

帖子

0

精华

高级会员

Rank: 4

积分
845
金钱
845
注册时间
2015-12-8
在线时间
175 小时
 楼主| 发表于 2017-12-28 10:10:19 | 显示全部楼层
补充一下:我需要打开的网页的HTTP请求会比较多,浏览器会频繁的发送请求,LWIP卡死后,我试着关闭浏览器,一段时间后LWIP又自己好了
回复

使用道具 举报

27

主题

118

帖子

0

精华

高级会员

Rank: 4

积分
845
金钱
845
注册时间
2015-12-8
在线时间
175 小时
 楼主| 发表于 2017-12-28 13:51:14 | 显示全部楼层
zc123 发表于 2017-12-28 12:24
如果内存够用,任务堆栈设置大些更好,不过你这的问题不是堆栈,如果是栈溢出就不单单是lwip协议栈卡死 ...

感谢回复,我跟踪发现是卡在了等待一个信号量那里,附件是我的配置,可以帮我看看那里需要改的吗?

lwipopts.zip

1.49 KB, 下载次数: 70

为自己掌握新的知识感到快乐
回复

使用道具 举报

3

主题

400

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1746
金钱
1746
注册时间
2015-6-11
在线时间
308 小时
发表于 2017-12-28 14:34:43 | 显示全部楼层
本帖最后由 zc123 于 2017-12-28 15:02 编辑

#define MEM_SIZE                        8*1024  //堆内存大小
#define MEMP_NUM_PBUF                   60         //来自memp的PBUF_ROM(ROM内存池)和PBUF_REF(RAM内存池)数目最大总和
#define MEMP_NUM_TCPIP_MSG_API                 40          //tcpip_msg结构的最大数目,用于callback和API的通讯 by zc
#define MEMP_NUM_TCPIP_MSG_INPKT        40          //tcpip_msg接受数据包结构的最大数目 by zc
#define TCP_WND                         6*TCP_MSS   //tcp窗口大小
#define TCP_SND_BUF                     (8*TCP_MSS)   //TCP发送缓冲区  
#define TCP_SND_QUEUELEN                (4*(TCP_SND_BUF/TCP_MSS))        //TCP发送队列长度
#define PBUF_POOL_BUFSIZE                     256          //单个内存池长度,要考虑到4字节对齐和最佳大小  
#define        PBUF_POOL_SIZE                  64        //内存池数量   
//#define LWIP_DEBUG                        0      //正常运行是这个调试代码一定要关,可以硬件仿真或者在协议栈中自己添加打印信息调试,这个十分影响性能(这个是要注释掉,因为开启的宏是#ifdef,)
回复

使用道具 举报

27

主题

118

帖子

0

精华

高级会员

Rank: 4

积分
845
金钱
845
注册时间
2015-12-8
在线时间
175 小时
 楼主| 发表于 2017-12-28 15:09:46 | 显示全部楼层
zc123 发表于 2017-12-28 14:34
#define MEM_SIZE                        8*1024  //堆内存大小
#define MEMP_NUM_PBUF                  ...

确实将内存池改大就好了,感谢指点!!
为自己掌握新的知识感到快乐
回复

使用道具 举报

4

主题

346

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3657
金钱
3657
注册时间
2016-2-21
在线时间
542 小时
发表于 2017-12-29 09:03:47 | 显示全部楼层
可以用系统的钩子,追踪一下内存的使用情况看看,才不会内存快没了都不知道
回复

使用道具 举报

27

主题

118

帖子

0

精华

高级会员

Rank: 4

积分
845
金钱
845
注册时间
2015-12-8
在线时间
175 小时
 楼主| 发表于 2017-12-29 16:33:27 | 显示全部楼层
shikihane 发表于 2017-12-29 09:03
可以用系统的钩子,追踪一下内存的使用情况看看,才不会内存快没了都不知道

系统的钩子是什么?是UCOS的钩子函数吗?
为自己掌握新的知识感到快乐
回复

使用道具 举报

5

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
157
金钱
157
注册时间
2014-8-4
在线时间
34 小时
发表于 2018-4-20 09:31:23 | 显示全部楼层
@Jundodo 你好,问题解决了吗?我也遇到相同的问题
回复

使用道具 举报

27

主题

118

帖子

0

精华

高级会员

Rank: 4

积分
845
金钱
845
注册时间
2015-12-8
在线时间
175 小时
 楼主| 发表于 2018-4-23 11:55:42 | 显示全部楼层
bgphone 发表于 2018-4-20 09:31
@Jundodo 你好,问题解决了吗?我也遇到相同的问题

你的是什么情况?
为自己掌握新的知识感到快乐
回复

使用道具 举报

5

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
157
金钱
157
注册时间
2014-8-4
在线时间
34 小时
发表于 2018-4-24 11:24:54 | 显示全部楼层
Jundodo 发表于 2018-4-23 11:55
你的是什么情况?

我是ucosIII作为服务器端,不断的发送数据到客户端,运行几十分钟就会断开,而且再也连不上了,其他的任务还在正常运行。
回复

使用道具 举报

27

主题

118

帖子

0

精华

高级会员

Rank: 4

积分
845
金钱
845
注册时间
2015-12-8
在线时间
175 小时
 楼主| 发表于 2018-4-26 11:57:05 | 显示全部楼层
bgphone 发表于 2018-4-24 11:24
我是ucosIII作为服务器端,不断的发送数据到客户端,运行几十分钟就会断开,而且再也连不上了,其他的任 ...

只给一个客户端发送吗?连不上还能ping吗?你的断开是你服务器主动断开的,还是客户端那边关闭连接的?如果连接断开了,你还会一直发送吗?如果在连接断开的情况下,还一直发的话,LWIP会因为数据发不出去,内存耗光,就会卡在netconn_write()里面等待。这时候也ping不通了。(好像是这样,你可以参考一下)
为自己掌握新的知识感到快乐
回复

使用道具 举报

9

主题

53

帖子

0

精华

初级会员

Rank: 2

积分
152
金钱
152
注册时间
2016-11-4
在线时间
47 小时
发表于 2019-11-6 21:51:43 | 显示全部楼层
Jundodo 发表于 2018-4-26 11:57
只给一个客户端发送吗?连不上还能ping吗?你的断开是你服务器主动断开的,还是客户端那边关闭连接的?如 ...

你好,如果是这种情况的话怎么解决,发送卡死在netconn_write里?  现在跳不出来了~~
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-24 17:01

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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