最新消息: USBMI致力于为网友们分享Windows、安卓、IOS等主流手机系统相关的资讯以及评测、同时提供相关教程、应用、软件下载等服务。

LWIP

互联网 admin 3浏览 0评论

LWIP

如题,设备做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(&eth_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));}}
}

LWIP

如题,设备做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(&eth_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));}}
}
发布评论

评论列表 (0)

  1. 暂无评论