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.

[FAQ] [参考译文] 【常见问题解答】PRU 仲裁延迟

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1625253/faq-pru-arbitration-delay

我正在为 PRU-ICSS 器件 (AM261x、AM263Px、AM263x、AM335x、AM437x、 AM57x)**、PRUSS 器件 (AM62x) 或 PRU_ICSSG 器件 (AM24x、AM64x、AM65x)。

仲裁延迟可能会向 PRU 读取或写入命令添加额外的时钟周期。 我想计算我的系统可能遇到的仲裁延迟类型。 我该怎么做?

-------------------------------------------------------------------------------------------------------------------------

此常见问题解答是对之前常见问题  解答【常见问题解答】PRU:如何计算读取和写入延迟? 。  本常见问题仅侧重于仲裁延迟的概念。 有关计算读写延迟的信息,请参阅常见问题 【常见问题解答】PRU 读写延迟 。  

此常见问题解答是一个正在进行的工作! 如果您仍在阅读该文章、但它带有进行中标签、请随时创建新的 e2e 主题、与我们聊天以了解最新更新。

**我只验证了 AM261x、AM263Px、AM263x 上的 PRU-ICSS 设计的此信息。 我预计 AM335x、AM437x、AM57x 的行为类似、但这些都是较早的 PRU-ICSS 设计、因此这些器件与较新的 PRU-ICSS 器件之间的内部总线结构可能会发生变化

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

    PRU 子系统内部有哪些类型的总线?

    在开始讨论仲裁延迟之前、我们需要了解 PRU 子系统内的总线架构。

    PRU 架构中可使用 2 种总线: VBUSP 、和 VBUSM 。 总线也可以称为 VBUS、CBASS、CBASS、有时甚至只是 CBA。

    如果访问不同的端点/输出、则无仲裁

    VBUSP 和 VBUSM 均“完全开关“。  这意味着只要启动器访问不同的端点、多个启动器就可以同时使用 CBASS。

    “启动器“可以是 PRU 内核、XFR2VBUS 实例或 来自 PRU 子系统外部的实体。

    端点可以是外设、存储器区域、甚至是寄存器组。

    例如、PRU0 可以在 PRU1 访问 PRU 子系统的硬件 UART 的同时访问 DMEM0。

    单独的存储器充当单独的端点。 例如、一个 启动器可以访问 DMEM0、一个 启动器可以 访问 DMEM1、 第三个启动器可以同时访问 SMEM。

    访问同一端点:VBUSP 和 VBUSM 的行为不同  

    如果多个启动器尝试在同一时钟周期访问同一端点、或者一个启动器尝试在另一个启动器已与该端点交互的情况下与该端点交互、则会发生仲裁。 当发起方必须等待一个或多个周期才能允许发起方读取或写入端点时、就会发生仲裁延迟。

    VBUSP 端点的仲裁行为与 VBUSM 端点的仲裁行为不同。

    我们将在查看方框图后进一步讨论详细信息。

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

    PRU-ICSS 和 PRUSS — 外部访问路径

    这是读取和写入命令访问 PRU 子系统外设或存储器时所用的路径。

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

    PRU-ICSS 和 PRUSS:内部访问路径

    这是读取和写入命令访问 PRU 子系统中外设或存储器所用的路径。

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

    PRU_ICSSG:外部访问路径

    这是读取和写入命令访问 PRU 子系统外设或存储器时所用的路径。


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

    PRU_ICSSG:内部访问路径

    这是读取和写入命令访问 PRU 子系统中外设或存储器所用的路径。

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

    VBUSP 总线上如何同时进行读写?

    每个输出端口允许一条进行中命令

    该命令可以是读取或写入。

    出现“行首“阻塞

    读取可以阻止写入、反之亦然。

    不存在跟踪下一次读取或写入以执行的“线路“、因为 VBUSP 上的每个输出端口都没有命令 FIFO。 一旦输出端口空闲、优先级最高的发起方将立即执行下一步操作。 这可能导致优先级较低的启动器挨饿。 例如、尝试写入 DMEM0 的 R5F 内核可以被 PRU0 和 PRU1 连续抢占。

    待办事项 验证每个总线的每个启动器的相对优先级

    N 个[OUTPUT_PORT_DATA_WIDTH]位字的 PRU/XFR2VBUS 写入会阻止 N 个 PRU 时钟的 VBUSP 端口 、直到数据退出 PRU 子系统

    对 VBUSP 输出端口进行写入会阻止对该输出端口执行写入和读取命令、直到写入完成 N 个时钟周期为止。 这与 VBUSM 不同。 在 VBUSM 上、正在进行的写入不会阻止读取命令开始执行。

    我们以 PRU_ICSSG 的 64 字节写入为例。 片 0 VBUSP 的输出端口数据总线宽度为 32 位、因此 64 字节读取将阻止输出端口、持续时间为(64 字节 x 8 位/字节/32 位/时钟)= 16 个时钟。 另一方面、XFR2VBUS TX VBUSP 的输出端口数据总线宽度为 64 位、因此 64 字节读取会在 8 个时钟内阻止输出端口。

    在读取完成之前会一直读取数据

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

    VBUSM 总线上如何同时进行读写?

    每个输出端口都是“多发射“端口

    这意味着每个输出端口允许多个正在进行的读取命令。

    写入命令不是“多次发出“-正在进行的写入将阻止其他写入发生。

    输出端口可以同时具有正在进行的读取和正在进行的写入。

    每个输出端口在每个时钟周期只能执行 1 条命令

    如果在同一时钟周期内发出多个读取或写入命令、附加命令将进入命令 FIFO。

    待办事项:  验证命令 FIFO 是否意味着到达顺序很重要 — 例如,如果来自较高优先级启动器的写入命令在命令 FIFO 中已经存在来自较低优先级启动器的写入命令之后到达、则较低优先级的写入命令是否仍会首先执行?

    待办事项:  命令 FIFO 如何处理读取和写入操作? 每种请求是否有单独的命令 fifo? 如果 FIFO 中存在停滞的写入命令、然后一个读取命令显示在 FIFO 中、该停止运行的写入命令是否会阻止读取命令执行?

    这意味着、在读取和写入命令之间、或者在两条读取命令之间、如果这些命令在同一时钟周期内在 VBUSM 上着陆、则可能会存在仲裁延迟。 但仲裁延迟非常小。 对于 N 条同时读取或写入命令、读取的最坏情况仲裁延迟为 N-1 个时钟。

    由 N [DATA_WIDTH]位字组成的 PRU/XFR2VBUS 会阻止 VBUSM 端口开始 N 个 PRU 时钟的下一次写入 、直到写入数据退出 PRU 子系统。

    这不会阻止从启动读取命令。 因此、只要读取操作未在与写入命令相同的时钟周期内到达 VBUSM、正在进行的写入操作就不会导致读取仲裁延迟。

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

    仲裁:如果外部启动器尝试访问 PRU 子系统端点、但一直被抢占、会发生什么情况?

    例如、如果 R5F 尝试写入 PRU 内部存储器、但写入始终被 PRU 内核访问抢占、该怎么办?

    • R5 数据不会丢失或损坏、但可能会“耗尽“
    • 内部 main.c 中没有数据 FIFO、因此此处不会存储数据
    • 数据将开始填充 SoC 中返回到 R5F 的 FIFO 和流水线
    • 如果背压意味着数据一直填充回 R5F 本身、则可能会开始影响 R5F 执行(例如,可能会停止下一个 R5F 写入命令,直到背压释放)