问答

汇集网友智慧,解决技术难题

21ic问答首页 - TAG - stm32f407vgt6
  • tcpip线程被mu0锁住导致网络线程无法使用问题 赏300家园币

    各位好,我使用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(); } else if(ch == 0x02) { for(int i=0;i < 8; i ++) { if(lock[i]->owner != RT_NULL) { rt_kprintf("Mutex %s held by thread: %s\n", lock[i]->parent.parent.name, lock[i]->owner->name); }else { rt_kprintf("Mutex %s is free\n", lock[i]->parent.parent.name); } } } else if(ch == 0x03) { msh_close_sockets(); } 这里的msh_close_sockets()作用是关闭所有的socket,函数的代码如下,: // MSH 命令实现 void msh_close_sockets(void) { for (int var = 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 %d successs! =====",var); sock[var] = -1; } else { LOG_D("===== close %d fail! =====",var); } } else { LOG_D("===== shutdown %d fail! =====",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,我估计问题就是这个情况导致的,但是我不知道该怎么查了,请问有没有人能够提供一些帮助的。。。

    lwIP rtthread stm32f407vgt6 使用 网络 线程

    4113浏览量 2回复量 关注量