我正在ST Cortex M3设备上创建服务器。我正在使用lwip API和FreeRTOS。一切正常,但响应时间已经过去了。我目前正在使用lwip 1.3.2和FreeRTOS 7.3。
单个客户端连接到服务器,并且必须经常发送一些时间关键型数据。这些数据包大约为6个字节。其他时候,我发送的是20K以上。
我遇到的问题是这些较小的数据包似乎永远需要发送。我认为这是因为lwip正在等待更多数据排队以进行更高效的传输。我不能等待2或3秒钟才能发送数据;客户希望数据名义上只有几微秒或毫秒。
我尝试过使用lwip_send和lwip_write。 (我知道一个与另一个相同,最后传递了一个标志。只需要尝试...)我已经尝试在套接字上设置TCP_NODELAY无济于事。我试图将SO_SNDLOWAT设置为'1',但这总是返回-1,所以我认为它不受支持。
我不想使用TCP RAW重做所有代码。有没有办法在TCP RAW模式之外调用tcp_output()函数?有什么方法可以加快速度,或者这只是带有小数据包的lwip TCP有多慢?
欢迎任何和所有建议。谢谢。
- EDIT-- 我还想补充一点,一旦我准备好传输,我确保FreeRTOS中的TX任务处于最高优先级。没有其他任务可以运行到我调用lwip_send / write的位置。
答案 0 :(得分:0)
我对xilinx上的裸机lwIP非常有经验,而且lwip不等待发送消息。它将根据以太网硬件确认中断的速度将数据包抽出。我一直在使用UDP。但是,我想到的是,您的问题可能出在接收端。如果您正在使用TCP,那么这些小数据包可能会因为您遇到问题而迟到。你需要做的是在代码中找到以太网传输的最低级别点,在其上放置一个通用输出切换。然后在接收到以太网数据包时也打开通用输出切换。查看示波器上的信号。如果它确认了您的假设,则移动输出切换以缩小问题范围。洗涤,冲洗并重复,直到您遇到问题为止。它粗暴而耗时,但这种强力方法通常会解决许多“不可能”的问题。嵌入式软件问题,由于纯粹的决心。祝你好运!