主题中讨论的其他器件:C2000WARE
我正在实施一个简单的以太网应用。 目前、我只处理 ARP 和 ICMP 部分(基本上是 ping)。 我正在使用 C2000Ware 为 CM 提供的驱动程序、并连接到提供的以太网驱动程序中。
我为 RX (用于数据包解析)和 TX (用于释放缓冲区)添加了自定义回调。 这两个定制的回调函数也会调用驱动程序标准回调函数(Ethernet_receivePacketCallback 和 Ethernet_releaseTxPacketBuffer)。
代码会 ARP 并在一段时间内处理 ping 流量而不会出现问题。 最后、我注意到我缺少一些为 TX 分配的缓冲区。 我使用 Wireshark 检查流量并查看所有 ping 都已得到响应、并验证缺少缓冲区中的数据是否与传输响应的 ID 匹配。 似乎没有调用 TX 中断来释放缓冲区资源。 TX 描述符/缓冲区管理器中有用于分配和释放的计数器、表明从未返回过资源。 这些计数器也与驱动程序层中的计数器匹配。
这种情况发生在10到6000个 ping 之间的任何位置。 我从两个单独的终端窗口对器件执行 Ping 操作、以对系统施加压力。 从 Wireshark 来看、似乎通信是按顺序传输的、因为在上一个 ping 得到响应之前会收到新的 ping。 我注意到这个缺少中断的事件。 如上所述、响应是100%被发送、但是资源释放(来自 TX 中断)缺失。
我的线程模型为:
-接收 ISR
-禁用中断(INT_EMAC_RX0和 INT_EMAC_TX0 )
-解析数据包
-从池中分配 TX 描述符和缓冲区
-传输响应
-启用中断
- TX ISR
-禁用中断
-免费的 TX 描述符和缓冲器
-启用中断
我搞砸了中断优先级、认为 TX 中断被 RX 中断改编并清除、但尚未找到问题所在。 是否有关于以太网驱动程序的社区想法/经验? 我在流程中遗漏了什么? 提前感谢。