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.

[参考译文] TMDS64EVM:PRU MII_G_RT EX_EOF 标志

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1650034/tmds64evm-pru-mii_g_rt-ex_eof-flag

器件型号: TMDS64EVM

我正在 ICSSG1 PRU0 上运行代码、以通过 MII_G_RT 接口消耗以太网数据包。 我在 RxTx 模式中使用任务管理器、根据“表 6-97 中定义的每个任务 1 子任务触发例程。 任务到事件映射“(RX_SOF、BK1=32、BK2=32、BKN=32、RX_EOF)。

我正在从主机 PC 发送一个虚拟数据的 UDP 数据包。 这就是发送到评估板时的样子(通过 Wireshark 捕获):

image.png  

我可以在代码中看到发生的正确事件触发。 我的子任务处理程序会将数据从 RX L2 FIFO 中弹出、并通过 DMA 将数据输出到共享存储器。 对于上述数据包、我从 MII_G_RT 接口收到三个子任务触发条件、可以使用这些触发条件来从 FIFO 传输数据:bk1、bk2 和 RX_EOF。 数据通过共享存储器中的这三个触发事件填充、如下所示:

image.png

蓝色和绿色的突出显示部分显示了最初传输的 UDP 数据包:

image.png

我有以下问题:

1) 使用 BK2 触发器、从 FIFO 复制的两个字节不属于数据包的一部分。 这些数据来自哪里? 我是否可以从可用的 PRU 组件中知道(除了在我的 oridinal UDP 数据包中编码帧长度和/或校验和以验证消息内容之外)、“所需“数据包结束、另一个开始的位置?

2) 使用 RX_EOF 事件触发器、从 L2 RX FIFO 组 0 读取的 XIN 命令复制与 BK1 事件触发器复制的相同数据、我假设没有新数据被推入 FIFO。 RX_EOF 事件是否总是在所有数据都被推入 FIFO 并从 FIFO 中删除后发生? 或者、FIFO 中是否会在 RX_EOF 事件触发的同时有新的/新的数据? 我的代码假设与 TI git repo 上的 SORTE_G 示例相同(SORTE_G:支持 200 字节输入数据和错误修复 — pru-software-support-package/pru-software-support-package - PRU 软件支持包) 、即 RX_EOF 事件也可能是数据。

 3) 如果只有 30 个字节可从 FIFO 弹出,为什么会发生 BK2 事件触发(因为我假设共享存储器图像中未突出显示的绿色部分的额外字节保留在先前传输的数据上)。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    1) 使用 BK2 触发器、从 FIFO 复制的两个字节不属于数据包。 这些数据来自哪里? 我是否可以从可用的 PRU 组件中知道(除了在我的 oridinal UDP 数据包中编码帧长度和/或校验和以验证消息内容之外)、“所需“数据包结束而另一个开始的位置?

    您看到的两个额外字节是 CRC-32 校验和(用作数据包报尾)的一部分。 具体来说:

    • 在 BK2 触发器上捕获 0x5C87
    • 0x06FE 在 RXEOF 上捕获(覆盖 BKN1)
    • 这些字节共同构成了数据包的完整 4 字节 CRC-32 值:

    此 CRC-32 校验和作为帧校验序列 (FCS) 的一部分自动附加到每个以太网帧。  

    在确定数据包 边界的旁边、 RX L2 支持读取 R18 中的写入指针、从而使软件能够确定:

    • 哪个存储体有活动写入事务
    • 打包数据数组中的特定写入地址
    • 通过执行:

    xin RXL2_SIDEA/B, &R18, 1

    在 EOF 时、您可以确定读取指针移动了多少。 在您的特定示例中、该值预计为 2、这对应于从 CRC-32 尾捕获的两个额外字节 — 让您可以可靠地跟踪数据包边界而无需编码额外信息。  

    有关 RX L2 写入指针和打包数据数组行为的更多详细信息、请参阅 AM64x TRM 中的第 6.4.11.2.3.7.2 节。

    BR
    Jc.

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [quote userid=“685763“ url=“~/support/processors-group/processors/f/processors-forum/1650034/tmds64evm-pru-mii_g_rt-ex_eof-flag 通过 RX_EOF 事件触发器、从 L2 RX FIFO 组 0 读取的 XIN 命令复制与 BK1 事件触发器复制的数据相同的数据、我假设没有新数据被推入 FIFO。 RX_EOF 事件是否总是在所有数据都被推入 FIFO 并从 FIFO 中删除后发生? 或者、FIFO 中是否会在 RX_EOF 事件触发的同时有新的/新的数据? 我的代码假设与 TI git repo 上的 SORTE_G 示例相同(SORTE_G:支持 200 字节输入数据和错误修复 — pru-software-support-package/pru-software-support-package - PRU 软件支持包) 、即 RX_EOF 事件也可能是数据。
    数据包之间的 RX L2 FIFO 未完全清除 — 仅使用当前接收中接收到的数据量进行覆盖。 这意味着 FIFO 中从前一次接收剩余的任何数据都将持续存在、直到被新传入的数据覆盖。

    不过、这不应该是个问题、因为 RX_EOF 事件将在所有数据包数据都写入 FIFO 后触发。 如上所述、您可以使用 R18(写入指针)确切确定当前接收器中接收到的字节数
    BR
    Jc.
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
     3) 如果 FIFO 中只能弹出 30 个字节、为什么会出现 BK2 事件触发器(因为我假设共享内存图像中未突出显示的绿色部分中的其他字节保留在先前传输的数据上)。
    在 Wireshark 捕获中删除 CRC-32、这意味着线路上的实际数据包大小大于 Wireshark 显示的大小。

    62 字节 — 有效载荷  
    4 字节 —  CRC-32(FCS、由 Wireshark 剥离)
    总计:66 字节在线路上
    由于 BKN2 设置为 32 个字节、因此一旦从 FIFO 弹出 32 个字节、BK2 事件触发器就会按预期触发。 因此、在捕获中的 30 个可见字节处发生的触发并不是一种异常 — 来自 CRC-32 的额外字节会考虑差异、从而使 BK2 触发行为正确且符合预期。
    BR
    Jc.
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您的所有回答、非常明确。 最后两个问题:

    1) 关于使用“XIN RXL2_SideA/B、&R18、1“、我假设这在 RX_EOF 情况下非常有用、因为我可以假设对于 BK1、BK2 和 BKN、FIFO 中始终有 32 个字节、因为触发器发生需要 32 个字节、对吗? 我 可以 在这些事件处理程序中读取写入指针、但在所有其他情况下只显示 32、在 RX_EOF 情况下只显示非 32 值。 我是否正确理解其预期用途?

    2) 上面提到的帧检查序列,是由 TMD64EVM 硬件附加的吗? PHY 或 MII 组件? 构建并从主机 PC 发送数据包时、数据包会显示与 FIFO 中显示为 FCS 的值不同的 FCS。 Colasoft 数据包构建器显示“0x09C025EE“、而 FIFO 中接收到的值为“0x5C8706FE“

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    1) 关于使用“xin RXL2_SideA/B、&R18、1“、我假设这在 RX_EOF 情况下非常有用、因为我可以假设对于 BK1、BK2 和 BKN、FIFO 中始终需要 32 个字节、因为触发器是正确的? 我 可以 在这些事件处理程序中读取写入指针、但在所有其他情况下只显示 32、在 RX_EOF 情况下只显示非 32 值。 我是否正确理解其预期用途?

    没错。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    2) 上面提到的帧检查序列、是 TMD64EVM 硬件附加的序列吗? PHY 或 MII 组件? 构建并从主机 PC 发送数据包时、数据包会显示与 FIFO 中显示为 FCS 的值不同的 FCS。 Colasoft 数据包构建器显示“0x09C025EE“、而 FIFO 中接收到的值为“0x5C8706FE“

    ICSS MII_RT 计算 CRC32、然后与传入帧中的 CRC 进行比较。 如果不匹配、MII RT 会将其发送到 PRU (CRC_ERR)。 这意味着 MII_RT 不会将任何计算得出的 CRC 注入 FIFO、而是将传入的数据包 CRC 内容。

    我不确定您正在使用的数据包生成器、我与在线工具进行了比较、实际上值与 FIFO 内容相匹配。

    BR
    Jc.