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.

[参考译文] AM263P4:CPSW 延迟改进

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1312127/am263p4-cpsw-latency-improvements

器件型号:AM263P4
主题中讨论的其他器件:DP83869SysConfig

大家好、我们正在针对需要与远程 AM64x 进行低延迟通信的应用评估 AM263Px。 由于 涉及的距离和所需的带宽、我们仅限于使用以太网进行通信(而不是 FSI、SPI 或 CAN)。 在 AM64x 端、我们 使用带有 PRU-ICSSG 的自定义固件以千兆位速度进行发送和接收。 该功能在 AM64x 电路板之间非常有效、可提供极低的延迟。

遗憾的是、AM64x 上的 PWM/ADC 外设 有限、因此 我们正在考虑使用 AM263Px 与远程 AM64x (而不是第二个 AM64x)进行通信。 由于 AM263Px 不包含能够千兆位的 PRU、因此我们将评估 CPSW。 请参阅以下内容:

AM64x PRU-ICSSG ->千兆位以太网链路-> AM263Px CPSW

我们的带宽需求非常适度;我们需要每10微秒发送一个64字节数据包、即大约 51 Mbps。 我们还需要 TX 和 RX 之间的总延迟小于1.5微秒、这需要千兆位速度。 SDK v9.01 SDK 具有一项基准测试、表明 CPSW 可以在开始丢弃数据包之前处理<15Mpbs (具有64B UDP 数据报)。 显然数据包大小和带宽之间存在折衷、但即便如此、性能还是相当差。 我们考虑了使用 PRU 以太网、但由于其限制为100Mbps 、因此延迟太大(~5微秒只是为了传输64字节、不包括 PHY 或处理 延迟)。

由于 AM263Px 是一款新产品、低性能是否会导致 SDK 延迟限制、从而在将来会得到改善? 或者、这 是 DMA 引擎造成的硬件瓶颈吗?

换句话说、ENET-LLD 是否有任何绕过 DMA 引擎的 API、使我们能够直接与原始数据包进行交互以改善延迟? 我们的产品 不需要通用网络功能、只需从远程 AM64x (直接连接、中间无交换机或其他器件)接收固定大小的数据包。

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

    周老师、您好!

    我们已在内部讨论了这个主题并进行了讨论。 我们下周早些时候会向您介绍一些最新情况。

    此致、

    Shaunak

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

    周老师、您好!

    如果您可以共享测试两个 AM64x 器件之间的链路时能够实现的性能(带宽、延迟)、那将会很有帮助。

    您在第2层的性能要求是~51.2Mbps 正确吗?  

    此致、

    Shaunak

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

    周老师、您好!

    我确实有关于绩效的一些信息、以及一些可以帮助我更好地回答您的问题:

    、我们仅可使用以太网进行通信(相对于 FSI 或 SPI 或 CAN)

    您正在寻找 SPI/FSI/ CAN 的替代器件、能否确认以太网帧是标准 IEEE802.3格式、还是修改了格式。

    由于 AM263Px 是一款新产品、低性能是否可能是 SDK 延迟限制、将来会得到改进?

    MCU_PLUS_SDK 中的开箱即用示例未进行优化以获得最佳性能、但对较大的数据包具有更低的存储器占用空间和良好的性能。 编写开箱即用应用程序是为了适应大数据包缓冲区用例。 如果您查看相同的 SDK 数据表以了解较大的数据报长度、则会看到数据包丢失较低或没有数据包丢失。

    应用程序可以配置为具有更多较小尺寸的缓冲器、以帮助提高吞吐量。

    我们的产品 不需要通用网络功能,只需要从远程 AM64x
    接收固定大小的数据包
    • 我想知道您是否只想处理没有 IP 标头的 L2数据包。 这就足够了吗? 基本上、您是否直接连接 AM64x 和 AM263Px、并根据 MAC 地址转发数据包?
    • 我还想讨论一下带宽、即每10微秒发送1个数据包。 是否可以对网络数据包进行批处理? 例如、每处理40微秒4个数据包、它仍会提供所需的带宽、但处理可以更高效。
    ENET-LLD 是否有任何绕过 DMA 引擎并允许我们直接与原始数据包流交互以改善延迟的 API?

    恐怕 Im 无法改善延迟或带宽。  

    此致、

    Shaunak

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

    尊敬的 Shaunak:

    我们一直在运行 AM64x 至 AM64x、因此帧尺寸较大(268字节 L2)、延迟也相应地更长(从 TX 到 RX、到 PRU SRAM 为~4微秒)。 我们正在努力设置一个测试、以 将数据包大小减少到64 字节有效载荷(76字节 L2)、从而查看延迟下限。

    尽管我们可以 根据需要修改 PRU 代码以符合 IEEE802.3、但我们使用修改后的帧格式来容纳更多数据(无 MAC 地址、无 ETH 类型)。

    是的、我们在寻找没有 IP 报头的 L2数据包。 遗憾的是、批处理对于此应用不起作用(我怀疑这意味着更大、更小的缓冲区也不起作用)、因为我们是根据数据包信息执行闭环控制。

    我们再来看一下链路速率为100Mbps 的 AM263Px 上的 ICSS。 我之前说过100Mbps 速度太慢、但只有当我们必须发送64字节时才是如此。 从技术上讲、我们只需要 一个8 字节有效载荷(20字节 L2)。 但我不确定 PRU-ICSS 或 PHY (本例中为 DP83869)是否 要求最小帧大小。 此信息不会显示在 AM263Px 的 TRM 或数据表中。 AM263Px 上的 PRU-ICSS 是否 需要 RMII RX 具有最小的帧大小?

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

    另一个问题是、我们是否可以为 AM263Px 上的 PRU0/PRU1选择不同的多路复用模式。

    例如、我们可以将 PR0_PRU0_GP_MUX_SEL = 2 (MII 模式)和 PR0_PRU1_GP_MUX_SEL = 0 (GPIO 模式)吗?

    在 AM64x 上、您无法执行此操作(二者必须均为 MUX=RMII 才能使用 RMII)。 但我们需要使用第二个 PRU 内核与外部 A/D 连接、因此我们必须能够选择不同的多路复用器模式。

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

    周老师、您好!

    Im 对最终用例有点困惑。 如果我回答正确、我们将在 AM64x 上使用 PRU-ICSS。

    在 AM263Px 上、您使用的是 PRU-ICSS 还是 CPSW? 为了满足 CPSW L2的性能要求、 我们必须遵循 IEEE802.3标准以太网帧格式、我将能够帮助您实现所需的带宽。 遗憾的是、我不是 PRU-ICSS 专家、因此必须先将该主题转给 PRU-ICSS 专家后再发表评论。 您能否确认 AM263Px、CPSW 或 PRU-ICSS 上的用例是什么?

    谢谢。此致、
    Shaunak

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

    尊敬的 Shaunak:

    很抱歉让人感到困惑。 我们尚未决定 使用 PRU-ICSS 还是 CPSW。 我们正在尝试确定哪个具有最低延迟。 在这种情况下、我们关心的延迟是从接收到数据包到 将数据包负载传输到 R5F TCM 的时间。

    AM64x => PHY TX =>以太网=> PHY RX => AM263Px (1000Mbps CPSW 或100Mbps PRU-ICSS)=> R5F TCM

    我们可以对 CPSW 使用 IEEE802.3标准帧、但我担心即使 对于 小数据包、延迟也太高。 如前所述、MCU+ SDK v9.01中的 UDP 基准测试声称 64字节有效载荷的最大带宽不会丢失~10Mbps。 我们仍在努力设置一个测试来自行测量 AM263Px controlCARD 上的延迟。

    对于 使用 CPSW 缩短延迟、您有什么建议吗?

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

    尊敬的 Shaunak:

    我们 可以运行基准测试 、在处理器之间发送64字节的 UDP 有效载荷。

    从 AM64x (ICSSG)到 AM64x (ICSSG)@ 1Gbps、我们 测得的 总延迟为~2.0微秒。

    从 AM64x (ICSSG)到 AM263Px (CPSW)@ 1Gbps、我们测得的总延迟~16.2微秒。

    (这些数字 包括 两侧 R5F TCM 之间64字节传输的时间)。

    除了 AM263Px CPSW 具有更高的延迟外、我们还必须将数据包 发送速率从每10us 降低到每100us。 即使以 这种较低的速率 运行、我们仍然看到具有64字节有效负载的数据包丢失。 您能否为使用 AM263Px 上的 CPSW 提高性能提供任何指导?

    为了 测量延迟、我们使用两块电路板上的 GPIO 引脚来指示何时发送 (或 接收)数据。 具体而言、在 AM263Px 上、我们在 接收到任何数据包并将其传输到 R5F TCM (通过 EnetDma_returneRxPktQ)后、在 rxIsrFxn 回调中切换 GPIO 引脚。

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

    周老师、您好!

    感谢您分享基准数字、回答一些问题和要点。

    1.我认为您的用例不需要 LwIP 堆栈和 UDP (如果我错误的话请更正我)、LwIP 堆栈将增加大量开销、由于应用开箱即用没有针对更小的数据报长度进行优化、我们看到很多数据包丢失。 我们必须尝试增加 Rx 缓冲池和内存池,以便获得更小的数据报长度。 Im 仍在最后运行一些实验以尝试减少数据包丢失、一旦我有任何发现、我将共享相同的数据包。  

    2.由于我们只关心 AM263Px 上的包 Rx 的处理、不需要其他通用的网络功能、只需要测试2层的性能就可以了。 我将在下周前从结束时获得有关第2层性能的一些信息。  由于您已经有了良好的测试设置来测量延迟、我们能否考虑设置一个测试来测量第2层性能、而不是使用 LwIP 堆栈和 UDP 开销进行测量、因为它可能会向我们发送错误的方向。

    感谢您的耐心等待、希望我们尽快取得更多进展!

    此致、
    Shaunak

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

    尊敬的 Shaunak:

    感谢您目前的帮助。

    1、我在上一篇文章中实际上是不正确的。 我分享的数字适用于64字节 L2帧、而不是 UDP。 我最初是使用 UDP 进行测试、当时我写了这篇文章、但后来切换到 L2、忘记在提交之前编辑文本。

    2.自从上一篇文章以来,我意识到我的基准是在调试模式下编译的。 切换到释放可将延迟降低到7-8微秒。 这有希望、但我需要最坏情况下的延迟小于4 微秒。

    此外、我也无法使 CPSW 基准测试稳定。  对于某些数据包、AM263Px 会在7-8微秒内接收并复制到 R5F TCM、但通常会完全丢弃数据包。 即使我将发送速率降低到每100微秒一个64字节 L2数据包、情况也是如此。

    正如论坛上的其他人所建议的、TI 为包括 CPSW 在内的所有外设提供裸机示例会有所帮助。 我将删除"enet_L2_cpsw"示例、以使其变得更简单。 希望这将帮助我更好地了解 这里的延迟来源。

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

    周老师、您好!

    1.您能分享 CPSW 的统计数据吗? ENET L2 CPSW 示例具有打印统计信息的函数。 关于裸机示例、我将在内部开始讨论。 这肯定会有所帮助。  

    2.关于 AM263Px 到 TCM 的不稳定性、丢包的频率有多高? 是否有任何特定的模式? 例如、每10个数据包中有1个?

    此致、

    Shaunak

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

    尊敬的 Shaunak:

    运行短时间后的以下 CPSW 统计信息:

    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    Cortex_R5_0: GEL Output: --------------------------------
    Cortex_R5_0: GEL Output: PORT0 STATS
    Cortex_R5_0: GEL Output: --------------------------------
    Cortex_R5_0: GEL Output: STAT_0_RXGOODFRAMES = 0x0001C0BE
    Cortex_R5_0: GEL Output: STAT_0_RXOCTETS = 0x00773278
    Cortex_R5_0: GEL Output: STAT_0_TXGOODFRAMES = 0x0001CB0F
    Cortex_R5_0: GEL Output: STAT_0_TXMULTICASTFRAMES = 0x0001CB38
    Cortex_R5_0: GEL Output: STAT_0_TXOCTETS = 0x007A0030
    Cortex_R5_0: GEL Output: STAT_0_OCTETFRAMES65T127 = 0x00038C33
    Cortex_R5_0: GEL Output: STAT_0_NETOCTETS = 0x00F1581C
    Cortex_R5_0: GEL Output: --------------------------------
    Cortex_R5_0: GEL Output: PORT1 STATS
    Cortex_R5_0: GEL Output: --------------------------------
    Cortex_R5_0: GEL Output: --------------------------------
    Cortex_R5_0: GEL Output: PORT2 STATS
    Cortex_R5_0: GEL Output: --------------------------------
    Cortex_R5_0: GEL Output: STAT_2_RXGOODFRAMES = 0x0007A349
    Cortex_R5_0: GEL Output: STAT_2_RXMULTICASTFRAMES = 0x0003D1CA
    Cortex_R5_0: GEL Output: STAT_2_RXFRAGMENTS = 0x0004CCEB
    Cortex_R5_0: GEL Output: STAT_2_ALE_DROP = 0x0005D274
    Cortex_R5_0: GEL Output: STAT_2_RXOCTETS = 0x0207E368
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

     通过修改 rxIsrFxn 以调用 EnetDma_returneRxPkt()而不是 EnetDma_returneRxPktQ(),我能够将接收延迟再减少0.5微秒, 然后是 EnetQueue_DEQ() 。 通过此配置、我 看到几乎 每隔一个数据包就会丢弃。 在进行此更改之前、大部分数据包都被丢弃。

    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    void EnetApp_rxIsrFxn(void *appData) {
    EnetApp_PerCtxt *perCtxt = (EnetApp_PerCtxt *)appData;
    // EnetDma_PktQ rxReadyQ;
    EnetDma_PktQ rxFreeQ;
    EnetDma_Pkt *rxPktInfo;
    uint8_t *rxFrame;
    int32_t i;
    uint32_t data[16];
    /* All peripherals have single hardware RX channel,
    * so we only need to retrieve packets from a single flow.*/
    // EnetQueue_initQ(&rxReadyQ);
    EnetQueue_initQ(&rxFreeQ);
    /* Get the packets received so far */
    // EnetDma_retrieveRxPktQ(perCtxt->hRxCh, &rxReadyQ);
    EnetDma_retrieveRxPkt(perCtxt->hRxCh, &rxPktInfo);
    /* Consume the received packets */
    // rxPktInfo = (EnetDma_Pkt *)EnetQueue_deq(&rxReadyQ);
    while (rxPktInfo != NULL) {
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    我暂时放弃了将 ENET-LLD 移植到裸机。 不幸的是、驱动程序通过 TaskP 充分利用了线程化任务、并且需要进行重大重写才能在没有 FreeRTOS 的情况下正常工作。 如果 TI 可以提供一个简单的裸机示例来展示如何使用 CPSW 进行发送/接收、这仍然很棒。

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

    周老师、您好!

    非常感谢您到目前为止在进行评估时所付出的努力和耐心。 我曾向内部网络团队提出将裸机数据包逐包处理示例作为 SDK 的一部分的要求、我们正在考虑将其用于 MCU_PLUS_SDK 09.02版本(2024年4月时间段)。 这对你来说是可以的吗?

    我确实浏览了您发布的统计数据,我无法在主机端口上看到数据包丢失,我仍然试图了解数据包被丢弃的位置。 中断定步可能在这里有所帮助、但您已经明确表示不需要对数据包进行批处理。

    如果您能分享目前已删除的应用程序代码、我也不胜感激。 因此、在作为 SDK 发布的一部分发布官方示例之前、我也可以尝试在我们的终端上对其进行评估。

    此致、

    Shaunak

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

    忘记提一下、我还没有尝试过两项测试来降低 延迟:

    1.在 CPSW 上启用直通。 这是您可以帮助的吗?

    我在 SysConfig 中看不到任何直通选项、因此我尝试了直接更改 CPSW 寄存器的"简单"方法。 我在 AM263Px TRM 中找不到等效于"CPSW_Pn_CUT_THRU_REG_k"的选项(实际上、TRM 中目前没有 CPSW 的寄存器)。

    在 AM64x 上、该寄存器位于 CPSW_BASE + 0x223C0、因此我尝试了对 AM263Px 上的0x528223C0进行写入。 遗憾的是、无论 我写入的值如何 (通过 CCS 中的"Memory Browser"写入)、寄存器都保持在0x00000000。

    您是否知道 如何 启用 CPSW 直通功能?

    2.将 RX 数据包缓冲区从 OCRAM 移动到 TCM、以太网 DMA 将数据包直接写入 TCM。

    对于我在上一篇文章中在示波器跟踪中看到的抖动、我希望裸机实现方式会明显更好、因为在没有随机中断和后台任务的情况下、时序会更加一致。

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

    周老师、您好!

    感谢您共享这些文件。

    1.关于无论 syscfg 设置如何都覆盖 ALE 配置的问题、我将进行研究、并在需要时提出错误。

    2.直通模式在 AM263Px 上不可用。

    如前所述、您可以在下一个 SDK 版本中获取裸机示例。 (版本09.02)。 希望这将解决我们在此面临的问题。

    此致、

    Shaunak

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

    尊敬的 Shaunak:

    遗憾的是、直通转换不可用。  请注意、 TRM (2023年9月)在1111页调用了对直通交换的支持。

    这个问题我们已经纠结过几次了、即 TI 有很多芯片搭配类似的外设、但经常重复使用相同的名称、 即使外设是不同的。  在这种情况下 、AM64x 上的 CPSW3G 支持直通交换、但 AM263Px 上的 CPSW3G 不支持。 另一个示例是 AM64x 上的 eHRPWM 实际上并不是"高分辨率"、这与 C2000和其他 Sitara 处理器上使用的 eHRPWM 不同。 非常令人困惑。 每个外设至少有一个版本号会有所帮助。 类似于 CPSW3G_V1或 CPSW3G_V2、其中指出了_V1和_V2之间的特性差异。 这也可能有助于解决 TRMS 中经常出现的剪切和粘贴错误。

    我希望裸机实现可显著减少抖动、但可能对 延迟影响不大。 遗憾的是、我们需要将延迟降低~50%才能在此应用中使用 CPSW3G。 在没有切入直通的情况下、我不知道 CPSW3G 上 会降低 延迟的其他设置。 无论是哪种方式、我们都希望在下一个 SDK 版本中提供裸机示例、因此我们可以对此进行测试。

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

    周老师、您好!

    对于因 TRM 中说明细节与实际功能不 可用之间存在不一致而造成的混淆、深感歉意。 直通模式在 AM263Px 上不可用。 我将在最后采取措施以更新 TRM。 没错、在 TRM 中可以发现很多剪切粘贴的错误、需要加以解决。

    至于裸机示例、将在下一个 SDK 版本中提供。 该示例流程可能与基于 AM64x Enet 环回 NORTOS 的示例类似。 或许、BareMetal 示例发布后、我们将能够针对您的用例更好地评估性能。

    如果我能为其他事情提供帮助、请告诉我。

    此致、
    Shaunak