使用 lwip API 难以立即发送小型 lwip 数据包
Posted
技术标签:
【中文标题】使用 lwip API 难以立即发送小型 lwip 数据包【英文标题】:Having difficulty sending small lwip packets immediately using the lwip API 【发布时间】:2013-02-20 07:49:48 【问题描述】:我正在 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 有多慢?
欢迎提出任何建议。谢谢。
--编辑-- 我还想补充一点,一旦我准备好传输,我会确保我在 FreeRTOS 中的 TX 任务处于最高优先级。在我调用 lwip_send/write 之前没有其他任务正在运行。
【问题讨论】:
【参考方案1】:我对 xilinx 上的裸机 lwIP 相当有经验,而且 lwip 不会等待将内容发送出去。它将在基于以太网硬件确认您的中断时尽快将数据包抽出。我一直只使用UDP。不过,我想到的是,您的问题可能出在接收端。如果您正在使用 TCP,那么这些小数据包可能会迟到,因为您遇到了接收问题。您需要做的是在代码中找到以太网传输的最低级别点,然后在其上放置一个通用输出切换。然后在收到以太网数据包时打开通用输出开关。查看示波器上的信号。如果它证实了您的假设,则移动输出切换以缩小问题范围。清洗、冲洗并重复,直到找到问题所在。这是粗略且耗时的,但由于纯粹的决心,这种蛮力方法通常可以解决许多“不可能”的嵌入式软件问题。祝你好运!
【讨论】:
以上是关于使用 lwip API 难以立即发送小型 lwip 数据包的主要内容,如果未能解决你的问题,请参考以下文章
如何在 tls 中使用 STM32 lwip/mqtt api?