Zachary唷 发表于 2022-11-10 20:44:49

FreeRTOS LwIP TCP服务器线程跑飞

FreeRTOS v10.3.0 LwIP 2.1.2
STM32F407芯片
坛友们,我使用Netconn创建tcp服务器,通过网络调试助手的tcp客户端与tcp服务器连接,网络调试助手发送数据给tcp服务器,服务器收到数据后,再通过串口经485发送出去;
在实际操作中发现,tcp调试助手发送数据给创建的服务器发送数据是正常的,但是每隔50ms发送数据的话,会导致tcp连接断开,然后tcp服务器任务并没有返回到侦听状态,而是一直在等待数据接收,一直在执行这句话if( ( err = netconn_recv( newconn485_1, &recvbuf ) ) == ERR_OK ),且返回的err = ERR_TIMEOUT。上位机客户端也无法再连接这个服务器。但是别的任务能运行,系统并没有卡死,开启了stackoverflow检测,也没问题。
以下是我的TCP服务器源码:

串口波特率2400时,出问题时的数据量比9600时的少,所以是不是因为串口速度太慢了,网络数据太快了,导致服务器任务卡死了。但是,当服务器只接收数据,不处理的时候(服务器中不通过串口转发数据),上位机无论发多块,都没有问题,服务器正常。
我加大任务的任务栈也不管用,增加MEM_SIZE和MEMP_NUM_NETBUF也不管用,查不出卡死在那里。
在此,请教下硬汉和坛友们,有没有遇到过。

eric2013 发表于 2022-11-11 10:09:06

你测下这个函数的溢出问题,我看源码是只要溢出时间内没有收到就进入,这样的话,你的应用处理就不太合理,这样就成了每10ms就执行一次了。

Zachary唷 发表于 2022-11-23 09:45:10

感谢硬汉,我这里tcp连接后,就不会vtaskdelay( 10 )啦。最后问题找到了,是因为tcp_thread的线程优先级TCPIP_THREAD_PRIO我设置的太低了,DM9000网络数据来的太快,导致来不及处理,我把它设成最高,问题解决了,抱歉这么晚才来回帖。
sys_thread_new( TCPIP_THREAD_NAME,tcpip_thread,NULL, TCPIP_THREAD_STACKSIZE,TCPIP_THREAD_PRIO );

eric2013 发表于 2022-11-23 16:48:25

Zachary唷 发表于 2022-11-23 09:45
感谢硬汉,我这里tcp连接后,就不会vtaskdelay( 10 )啦。最后问题找到了,是因为tcp_thread的线程优先级TCP ...

谢谢告知最终问题原因。
页: [1]
查看完整版本: FreeRTOS LwIP TCP服务器线程跑飞