大家好、
因此、我一直在尝试使用实用程序库中提供的 LWIP 使 TM4C 上的 TCP 工作。
它将添加到现有项目中、因此使用 TI-RTOS 会带来痛苦(或者可能会带来更小的痛苦?)
无论如何,我看到了回声示例,在对它进行了一些熏蒸之后,我遇到了一些问题,因为我从未使用过类似的东西。
其原理是基本上使用它来与 python 应用程序之间传输数据。 没什么特别的、它基本上是一个串行端口。 我进行的测试以2kHz 的频率生成消息、所有48字节的大小都必须最终到达 python 应用。
我为此制定了一个测试计划。 它不是理想的、但它本身应该起作用。
我遇到了一些与此 "="" bug"="">"已修复"错误相关的问题。 让我们将其称为 test1
在 test1中、我使用 putty 读取 TCP 数据。 它基本上是读取器和丢弃器。 我主要观察的变量表明"有人"是否丢弃了字节(在我现在拥有解决方案之前)。 30分钟内没有问题。
但是,似乎印刷电路板->snd_queuelen 基本值持续增长如此缓慢。 我尝试在测试过程中禁用消息发生器, 但 snd_queuelen 没有减少!
其他问题。 让我们将其称为 test2。
基本上相同、区别在于我使用的是 python 应用。 它不是 python 测试代码、而是具有扭曲特性的应用、它在从套接字缓冲器中获取时立即丢弃所有内容。 以消除可能的瓶颈。 嗯、它可以正常工作、直到 TM4C 停止发送数据。 它没有冻结、计时器中断不断被调用、消息发生器工作、连接已建立、没有故障、lwip TCP 队列似乎没有满。 它只是停止发送数据。 PCB 或 lwip_stats 中可能存在我可能缺少的某些内容(很可能)、但它看起来很奇怪。
Wireshark 显示"TCP 不按顺序"
我仍然没有检查两个测试所需的所有内容、但由于至少前1个测试似乎让人想起了旧的错误、我决定 在这里发布。 第2次测试可能是我不知道的标志中显而易见的、因此经验的帮助将是极好的。
接下来、我们将详细介绍我实施的措施:
Nagle 已启用
一些选择是为了确保在同一上下文中进行所有原始 API 调用。 由于 main 中调用了1个 tcp_write、但它具有 IntMasterDisable、因此我希望没有问题。
-我有一个函数"serial_lwIP_Send"。 它从主代码调用。 也可以
- 它使用 IntMasterDisable 调用 tcp_write。 当发生这种情况时(sentEvent)、将标志设置为0、只有 在 sentEvent =1或循环缓冲区为空时才会执行此操作。
- 如果 sentEvent == 0,则它加载循环缓冲区
- 如果 tcp_write 返回 err_mem、则会加载循环缓冲区。
-对"tcp_sent (tcp_sent)"进行了回调。 我在每个 tcp_write 之前调用"tcp_sent
- 如果 循环缓冲区中有数据,则负责执行 sentEvent=1并调用 tcp_write()。 仅为 tcp_write()提供 tcp_sndbuf()的最大值
- 实际上只有这样做
-生成了周期为5ms 的周期性计时器 ISR
- 此 ISR 的优先级(应该)高于以太网 ISR
- 每10个中断调用一次 tcp_output (因此周期为50ms)
- 调用 lwIPTimer
请提供任何帮助。
我可以提供 lwipopts.h 我不相信内存是问题、可能我的需求太大了。 但是、与 PBufs 相关的问题可能不是最好的。