-
tcpip线程被mu0锁住导致网络线程无法使用问题
各位好,我使用rtthread开发STM32F407VGT6芯片,程序有多个线程,每个线程都会创建一个socket,建立tcp连接或者udp连接,现在出现一个问题,程序长时间运行有概率死机,但是没有任何hardfault打印,我加入了cmbacktrace也没有输出任何信息,我在串口的msh里输入任何数据都不会相应,多次输入会提示接收字符缓存区满了。后来根据检查发现,我的CAN接收发送线程和RS485接收发送线程没死,我在程序里添加了一个接收指定字符后,打印一些函数结果的代码,代码如下:ch=uart_sample_get_char();//LOG_D("ch=%d",ch);if(ch==0x01){mem_monitor2(NULL);list_thread();list_sem();list_msgqueue();list_mutex();list_timer();}elseif(ch==0x02){for(inti=0;i<8;i++){if(lock->owner!=RT_NULL){rt_kprintf("Mutex%sheldbythread:%s\n",lock->parent.parent.name,lock->owner->name);}else{rt_kprintf("Mutex%sisfree\n",lock->parent.parent.name);}}}elseif(ch==0x03){msh_close_sockets();}这里的msh_close_sockets()作用是关闭所有的socket,函数的代码如下,://MSH命令实现voidmsh_close_sockets(void){for(intvar=0;var<8;++var){rt_mutex_take(lock[var],RT_WAITING_FOREVER);if(sock[var]!=server_cfg_num&&sock[var]!=server_execute_num&&sock[var]!=server_udp_num&&sock[var]>=0){if(shutdown(sock[var],SHUT_RDWR)>=0){if(closesocket(sock[var])>=0){LOG_D("=====close%dsuccesss!=====",var);sock[var]=-1;}else{LOG_D("=====close%dfail!=====",var);}}else{LOG_D("=====shutdown%dfail!=====",var);}}rt_mutex_release(lock[var]);}rt_pin_write(ETH_RESET,0);rt_thread_mdelay(1000);rt_pin_write(ETH_RESET,1);}根据测试发现,list_mutex()函数,打印了一些线程锁,我看到一个tcpip线程被一个mu0锁住了,后面有4个线程在等待mu0,我估计问题就是这个情况导致的,但是我不知道该怎么查了,请问有没有人能够提供
2025-03-12 2