使用lwip API立即发送小的lwip数据包时遇到困难

3
我正在使用lwip API和FreeRTOS在ST Cortex M3设备上创建服务器。一切正常,但响应时间严重偏差。我目前使用的是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处理小数据包的速度就是这样慢?
欢迎任何建议。谢谢。
- 编辑 - 我还想补充一点,即一旦我准备好传输,我确保FreeRTOS中的TX任务处于最高优先级。在我调用lwip_send / write之前没有其他任务运行。
1个回答

0

我在xilinx上使用裸机lwIP有一定的经验,lwip不会等待发送数据。它会根据以太网硬件确认中断的速度快速地将数据包传输出去。我一直只使用UDP。但是,你的问题可能出现在接收端。如果你正在使用TCP,也许这些小数据包之所以延迟发送是因为你遇到了接收问题。你需要在代码中找到以太网传输的最低级别点,并在那里放置一个通用输出开关。然后,在以太网数据包被接收时,也要放置一个通用输出开关。通过示波器查看信号。如果证实了你的假设,那么就将输出开关移动到缩小问题范围的位置。反复洗涤,直到找到问题所在。这种粗暴的方法虽然耗时,但往往能解决许多“不可能”的嵌入式软件问题,这需要纯粹的决心。祝你好运!


“通用输出切换”是什么意思? - jpsecher

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接