如题,设备做TCP Server,通过调试助手连接设备,连接两次之后再次发起连接无法连接到设备。
其中,设备端之前使用stm32f207,之后改用GD32F407,网络使用DM9000,软件方案采用RTT+LWIP,使用st芯片无此现象,而GD有此问题。甚至出现网络无法初始化情况,之后通过增加上电复位延时时间,初始化无问题:
但出现新问题就是TCP连接两次之后连接不上,而单步却可以,通过wireshark抓包发现:
问题出在第三次握手,返回的报文却是挥手应答报文。
单步可以而全速运行不行的情况一般出现在时序上,而DM9000通过FSMC并行传输,之后通过在发送数据任务,通过加入一小段延时,问题得以解决。
据个人理解,应该是上一帧数据还没发送出去,下一帧就来了,然后下一帧数据未能发送出,保存在发送缓冲区中,之后经过下次触发发送时,将数据发送出。通过加入延时之后,确保上一帧数据发送出。
volatile void tx_ack_delay(void)
{
volatile uint32_t i = 0xef;
uint8_t a = 0;
while(i--)
{
a++;a++;a++;a++;a++;a++;
}
}
static void eth_tx_thread_entry(void* parameter)
{
struct eth_tx_msg* msg;
rt_base_t temp_isr;
while(1)
{
if(rt_mb_recv(ð_tx_thread_mb, (rt_uint32_t*)&msg, RT_WAITING_FOREVER) == RT_EOK)
{
struct eth_device* enetif;
RT_ASSERT(msg->netif != RT_NULL);
RT_ASSERT(msg->buf != RT_NULL);
enetif = (struct eth_device*)msg->netif->state;
if(enetif != RT_NULL)
{
/* call driver's interface */
if(enetif->eth_tx(&(enetif->parent), msg->buf) != RT_EOK)
{
rt_kprintf("transmit eth packet failed\n");
}
}
/********************加入发送延时***************************/
rt_enter_critical(); //关闭调度器
tx_ack_delay(); //延时小段时间
rt_exit_critical(); //开调度器
/* send ACK */
rt_sem_release(&(enetif->tx_ack));
}
}
}