This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TMS570LC4357:当以最高速度馈送小帧时、EMAC 会卡住

Guru**** 2393725 points
Other Parts Discussed in Thread: HALCOGEN

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1412049/tms570lc4357-emac-gets-stuck-when-fed-with-small-frames-at-maximum-speed

器件型号:TMS570LC4357
主题中讨论的其他器件:HALCOGEN

工具与软件:

在 Hercules 开发套件上进行 EMAC 测试实施期间、当 RX 数据速率接近最大速度时会发生一些错误。

尤其是以最大速度传输最小尺寸的帧、需要通过 μ µC 完全停止帧接收。 在完成一些测量之后、我发现该行为是由 RX ISR 引起的、它所花费的时间比下一帧到达所花费的时间更长。 为此、μ µC 超出了缓冲区、并将 RX 报头描述符指针设置为0。 如参考手册中所述、EOQ 位应指示这一点。 但是、在我的例子中、似乎有时 HDP 在不设置 EOQ 位的情况下会得到零。 这将导致不再执行 ISR。 我们为什么不看到 EOQ 位?

我们通过测试 EMACReceive 函数的 HDP 是否为零来部分解决此问题。 如果 HDP 为零、我们将其设置为 free_head 指针。 因此、μ µC 可以在发生过载后恢复。

执行此操作后、出现了一个稍微不同的错误:我们显示新帧、它们按预期触发 ISR。 但出于某种原因、仍会在 ACTIVE_HEAD 帧中设置 owner 位。

我的目标不是,完全防止封装丢失,因为这是不可能的,但 μ µC 可以从这种过载在每种情况下恢复。

此致

Georg Hermann

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    大家好、Georg Hermann:

    感谢您指出这一点。

    是否可以将代码与测试过程一起共享、因为我想在最后重现此问题

    因此、我想知道您使用的工具和遵循的过程。 如果可能、也请共享您的代码。

    ——
    谢谢、此致、
    Jagadish。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Jagadish:

    感谢您的快速响应。

    您将在 e2e.ti.com/.../source.zip 文件中找到我的 C 代码。 这些数据包使用附带的 Python 脚本生成。

    此外、我在 HalCoGen 的 HL_EMAC 中发现两个潜在错误。

    1. 在 HL_hw_emac_ctrl.h 文件中、EMAC_CTRL_CnRXTHRESHEN (n)的定义值应为0x10u、而不是0x20u。
    2. 在 HL_EMAC.c 中的 EMAC 初始化期间、EMAC_FREEBUFFER 首先被设置为零。 这之后 GMII 位启用。 稍后、会调用 EMACNumFreeBufSet 函数来设置实际分配的数字缓冲区。 遗憾的是、由于 GMII 位、FREEBUFFER 寄存器是写增量、从而导致 FREEBUFFER = 0xFF + MAX_RX_PBUF_ALLOC。

    提前感谢您的支持。

    此致、

    Georg

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    以下是当前情况的简短更新:

    第一个错误仍然存在。 因此、在以最大速度发送的64B 百万帧中、大约3500倍的 EOQ 标志未设置在应设置的位置。 工作空间是直接检查标头描述指针、而不是 EOQ 标志。

    第二个错误是、有时 ACTIVE_HEAD 帧设置了 Owner 位、因此会等待帧完成。 由于某种原因、EMAC 将下一帧写入 ACTIVE_HEAD->next 指针、因此未清除 Owner 位。 通过启用缓存并将 CPPI 区域设置为 STRONGLYORDERED_SHARABLE、可以解决此问题

    发生第三个错误。 由于在释放的打包缓冲区描述符中未设置所有者标志、因此触发了主机错误。 在最大速度下的百万个64B 帧中、此错误大约发生1500次。 权变措施是在 ISR 末尾附近检查所有者标志、如果不存在、则再次对其进行设置。 有趣的是、错误仅发生在与第一个误差相关的情况下。

    总而言之、CPPI RAM 似乎有问题。

    谢谢、此致

    Georg Hermann