完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
电子发烧友论坛|
[C] 纯文本查看 复制代码
while(1){//OSSemPend(&MY_SERVER_SEM,0,OS_OPT_PEND_BLOCKING,0,&os_err);f_read(http_file,tcp_server_sendbuf,3500,&br);printf("%dsendingrn",i);write_err=netconn_write(conn,tcp_server_sendbuf ,br,NETCONN_COPY);if(br<3500)break;}我做的是一个多线程的WEBSERVER服务器,在子线程中连续多次调用netconn_write()发送数据时,LWIP会卡在netconn_write()中,没有数据返回,ping也不通,不知道是什么原因,有人遇到过这种情况吗?顺便问一下,如果任务堆栈设置过小,程序会直接进入硬件错误中断里吗?还是会继续运行,只是运行的结果会出错?因为我设置LWIP内核任务的堆栈大小为250,原子的是1000,不知道会有什么影响。求大神解答 |
|
相关推荐
17个回答
|
|
|
如果内存够用,任务堆栈设置大些更好,不过你这的问题不是堆栈,如果是栈溢出就不单单是lwip协议栈卡死,而是运行一段时间进入hardfault才对,你这能恢复,就肯定不是这个问题,而是协议栈的配置有问题,这主要原因是协议栈内部的配置的内存池数量,允许的最大tcp链接数,还有各种缓冲区的配置是默认的,在应用中如果http包接收过于频繁,就会导致协议栈卡死(默认配置是不会考虑这些情况的),这个需要对协议栈深入了解重新配置才能解决(附件中有我之前项目调试的配置信息),
另外还要从设计上减少http的链接数和数据大小,这个主要方法有压缩文件(如html,css,js压缩) , 合并请求(将图片以base64字串存放在http中) , 利用ajax取代cgi模式实现数据通讯,这些都是可行的方案, 不过需要对http和前端那一块比较熟悉,上述两个是可以同时进行优化的,建议你都了解学习下。 lwipopts.rar (4.67 KB ) |
|
|
|
|
|
过小可能hardfault
|
|
|
|
|
|
有人遇到过在这种情况下卡死的现象吗
|
|
|
|
|
|
是否使用了大的局部变量,比如一个1024大小的数组。这样调度的时候,任务栈肯定直接爆了,因为局部变量是要被压到任务栈里去的
|
|
|
|
|
|
所谓卡死,要是是进入hardfault,要么是死循环,或者某几个任务把时间占用满了,原因得自己查,鬼知道他为什么卡死。
|
|
|
|
|
|
其他的任务还是能够正常调度和运行,LWIP ping不通,收发不了数据了
|
|
|
|
|
|
没有使用大的局部变量,大数组使用动态内存方式分配的
|
|
|
|
|
|
补充一下:我需要打开的网页的HTTP请求会比较多,浏览器会频繁的发送请求,LWIP卡死后,我试着关闭浏览器,一段时间后LWIP又自己好了
|
|
|
|
|
|
|
|
|
|
|
|
#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,) |
|
|
|
|
|
确实将内存池改大就好了,感谢指点!!
|
|
|
|
|
|
可以用系统的钩子,追踪一下内存的使用情况看看,才不会内存快没了都不知道
|
|
|
|
|
|
系统的钩子是什么?是UCOS的钩子函数吗?
|
|
|
|
|
|
@Jundodo 你好,问题解决了吗?我也遇到相同的问题
|
|
|
|
|
|
你的是什么情况?
|
|
|
|
|
|
我是ucosIII作为服务器端,不断的发送数据到客户端,运行几十分钟就会断开,而且再也连不上了,其他的任务还在正常运行。
|
|
|
|
|
|
只给一个客户端发送吗?连不上还能ping吗?你的断开是你服务器主动断开的,还是客户端那边关闭连接的?如果连接断开了,你还会一直发送吗?如果在连接断开的情况下,还一直发的话,LWIP会因为数据发不出去,内存耗光,就会卡在netconn_write()里面等待。这时候也ping不通了。(好像是这样,你可以参考一下)
|
|
|
|
|
只有小组成员才能发言,加入小组>>
926 浏览 0 评论
如何使用STM32+nrf24l01架构把有线USB设备无线化?
3087 浏览 7 评论
请问能利用51单片机和nRF24L01模块实现实时语音无线传输吗?
2987 浏览 5 评论
3846 浏览 3 评论
3311 浏览 8 评论
请教各位大咖:有没有接收频率32M左右的芯片推荐的?先感谢啦!
1266浏览 1评论
1212浏览 0评论
882浏览 0评论
973浏览 0评论
926浏览 0评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-2 02:25 , Processed in 0.918414 second(s), Total 76, Slave 69 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
429