最近调试LWIP(uCos下运行),发现一个问题:
在一个任务内不断进行发送(发送后任务挂起1s),用netconn_write来发送,然后在某一个时刻把网线拔掉,netconn_write还能执行几次,我的是还能执行9次,第10次执行netconn_write,就被阻塞了,仿真,发现最后是在tcpip_apimsg()里面阻塞掉了,因为这个函数里面会等待一个信号量:sys_arch_sem_wait(apimsg->msg.conn->op_completed, 0);
而这个信号量好像是在(我的理解)tcpip_thread这个线程里面发出的,而tcpip_thread又一直在等待一个邮箱:sys_mbox_fetch(mbox, (void *)&msg);
在刚刚tcpip_apimsg()里面,调用sys_arch_sem_wait之前,确实是发了邮箱的,
我就不明白为什么拔网线会造成这样的问题。
我现在是改了lwip内核的tcpip_apimsg()这个函数,让他在等待信号量的时候这样sys_arch_sem_wait(apimsg->msg.conn->op_completed, 100);
也就是超时返回了,我也不知道将来会出现什么问题,至少拔网线不会让任务阻塞掉。