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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1625250/faq-pru-read-write-latencies

我正在为 PRU-ICSS 器件 (AM261x、AM263Px、AM263x、AM335x、AM437x、 AM57x)、PRUSS 器件 (AM62x) 或 PRU_ICSSG 器件 (AM24x、AM64x、AM65x)。 我想计算读取或写入将需要多少个时钟周期。 我该怎么做?

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

此常见问题解答是对之前常见问题  解答【常见问题解答】PRU:如何计算读取和写入延迟? 。   此常见问题解答可视为 PRU 读取延迟应用手册更新的“初稿“。 更新应用手册后、此常见问题解答将更新、以反映应用手册中包含最新信息。

仲裁延迟也会影响读取或写入延迟。 有关更多信息、请参阅  【常见问题解答】PRU 仲裁延迟 。

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

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

    PRU 读取和写入指令  

    处理器内核通过执行指令来工作。 即使在 C 语言中对 PRU 固件进行了编程、C 编译器也会将 C 代码转换为 PRU 内核可以运行的指令。 PRU 固件也可以用汇编语言编写、以便直接控制在 PRU 内核上运行的每个指令。 如果应用关心读取是在 6 个 PRU 时钟周期还是 7 个 PRU 时钟周期内执行、则时间敏感型代码可能应该用汇编语言编写。

    本文档将使用术语“延迟“来描述执行指令所需的时间。

    完整的 PRU 指令集记录在 PRU 汇编指令用户指南中。 该文档列出了三种读写指令:

    LBBO(加载字节突发)和 SBBO(存储字节突发)  

    LBBO 和 SBBO 是默认的读取(即加载)和写入(即存储)PRU 指令。 本常见问题解答将重点介绍如何使用 LBBO 和 SBBO 计算读写延迟。

    LBCO(具有常量表偏移的加载字节突发)和 SBCO(具有常量表偏移的存储字节突发)  

    LBCO 和 SBCO 的工作方式与 LBBO 和 SBBO 类似。 但是、LBCO 和 SBCO 不使用寄存器来指定读取/写入存储器地址、而是使用 PRU 常量表中的地址。 LBCO 和 SBCO 的执行延迟与 LBBO 和 SBBO 的延迟相同。

    虽然仅执行读取或写入的延迟是相同的、但 LBCO/SBCO 占用的时钟周期总体上更少。 由于 LBBO/SBBO 的读取/写入地址存储在寄存器中、因此 LBBO/SBBO 需要使用额外的汇编指令将地址加载到寄存器中。 由于 LBCO 和 SBCO 对读取/写入地址而不是寄存器值使用常量表条目、因此 LBCO 和 SBCO 不需要额外的“地址加载“汇编指令。

    宽边命令:XIN(寄存器传输输入)、XOUT(寄存器传输输出)、XCHG(寄存器交换)

    XIN 和 XOUT 可用于在宽边接口中读取或写入多达 31 个寄存器。 XIN 和 XOUT 在单个 PRU 时钟周期内执行、因此它们是移动数据的最快方法。 但是、XIN 和 XOUT 只能与连接到该宽边接口的模块通信。

    不同的 PRU 器件具有不同的宽边接口附件。 例如、AM335x 可以使用 XIN 和 XOUT 在 PRU 内核和暂存区寄存器之间移动寄存器、或直接从一个 PRU 内核移动到另一个 PRU 内核。 AM64x 可以使用 XIN 和 XOUT 在暂存区寄存器之间移动信息、但不能直接移动到另一个 PRU_ICSSG 内核。 但是、AM64x 还可以使用 XIN 和 XOUT 来访问其自己的专用宽边 (BS) RAM、或通过 XFR2VBUSP 接口将多个寄存器读取并写入 PRU_ICSSG 外的存储空间。 有关更多信息、请参阅所需处理器的技术参考手册 (TRM)。

    在后面的章节中、我们将讨论有关使用 XFR2VBUSP 进行读取和写入的更多信息。

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

    如何判断读取还是写入是确定性的?  

    PRU 内核是完全确定性的 这意味着我们可以确切知道每个 PRU 指令执行所需的时间... 但有一些例外情况、如下所述。  

    非读写指令  

    未读取或写入的 PRU 指令是完全确定性的。  这些指令始终恰好需要一个 PRU 时钟周期来执行。

    对 PRU 子系统中某个地址的读写指令  

    对 PRU 子系统内地址的读取和写入是完全确定性的。 但是、还涉及一些额外的数学运算

    有具体的规则来确定读取或写入指令需要多长时间。 我们将在下面深入介绍这些规则。

    但是 、如果 PRU 内核尝试访问 PRU 子系统中的外设、并且另一个内核已经在读取或写入该外设、该怎么办? 或者、如果两个内核尝试在完全相同的时钟周期内访问同一外设、该怎么办? 一次只有其中一个内核可以访问外设、因此 PRU 子系统会对两个内核之间进行仲裁、以决定首先访问哪个内核。 一个内核读取或写入外设后、第二个内核将停止运行、直到外设可用。 失速时间称为“仲裁延迟“。

    在设计具有敏感时序的 PRU 系统时、设计人员必须记住尽可能低的延迟(即“执行读取/写入的时间“)和尽可能高的延迟(即“执行读取/写入的时间“+“仲裁延迟“)。

       PRU 子系统之外的系统地址进行读写指令  

    对 PRU 子系统之外的地址的读取和写入是不确定的。  可能存在扼流点、仲裁延迟、其他内核的影响等 如果您运行测试来近似计算系统中外部读取和写入的延迟、我们建议将处理器的负载尽可能与实际用例相似(例如,如果测试中 PRU 是在整个器件上运行的唯一内核、则不能很好地显示 Linux 内核驱动显示器,通过以太网通信等时的系统行为)。

    PRU-ICSS 内核和 PRU-SS 内核:
    当信号退出 PRU 子系统时、这些内核不会在 PRU 内核之间经历仲裁延迟。 但是、具有 XFR2VBUSP 的 PRU 子系统可能会在同一片中的 PRU 内核和 XFR2VBUS 实例之间发生仲裁。

    PRU_ICSSG:
    对外部系统的访问 必须将来自其他 PRU 内核以及 XFR2VBUSP 加速器的仲裁延迟考虑在内。

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

    使用 SBBO/SBCO 计算写入延迟  

    PRU-ICSS、PRU-SS 对 PRU 子系统之外的存储器位置进行写入:n 个 PRU 时钟以写入 N 个字

    这些说明是充满生气的。

    PRU 子系统和器件的其余部分之间存在缓冲器。  SBBO/SBCO 需要 N 个时钟周期来向系统总线缓冲区写入 N 个字。 然后、PRU 将移至下一条汇编命令、而无需等待写入完成。 写入缓冲区的值在系统总线中传输并最终更新外部存储器地址将需要额外的时间。

    假设 SBBO 写入是针对字对齐的地址(例如 0x100、0x104、0x108 等)。 每当加载跨越 4 字节边界时、它就需要另一个 PRU 时钟周期。
      -例如、将 2 个字节写入 0x100:一个 PRU 时钟
      -例如、将 2 个字节写入 0x102:一个 PRU 时钟
      -例如、将 2 个字节写入 0x103:两个 PRU 时钟(一个时钟用于写入 0x100 处的字、一个时钟用于写入 0x104 处的字)
     *因此、如果写入地址未按字对齐、则公式会更改为 N + 1 个 PRU 时钟、以便 SBBO 写入 N 个 32 位字

    PRU_ICSSG 写入 PRU 子系统之外的存储器位置:n 个 PRU 时钟用于写入 N 个字、加上每个片仲裁延迟  

    请参阅上面的 PRU-ICSS/PRU-SS 部分以及仲裁延迟 常见问题解答  【常见问题解答】PRU 仲裁延迟  

    PRU-ICSS、PRU-SS、PRU_ICSSG 对 PRU 子系统内的存储器位置进行写入:n 个 PRU 时钟以写入 N 个字、外加仲裁延迟

    PRU 内核和 PRU 子系统内部的存储器之间没有缓冲器。 因此、如果另一个内核使用连接到 ICSS CBASS 总线的端点、则 PRU 内核必须等待 端点变为可用、然后才能执行写入。

    内部 CBASS 互连是“完全交换“的。 这意味着、只要多个内核访问不同的端点、多个内核就可以同时使用 CBASS。 例如、PRU0 可以在 PRU1 访问 PRU 硬件 UART 的同时访问 DRAM。

     有关列出 CBASS 端点的图形、请参阅仲裁延迟常见问题解答。

    这里适用相同的字对齐规则。 也就是说、如果写入未进行 32 位字对齐、则增加 1 个额外的时钟周期。

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

    使用 LBBO/LBCO 计算读取延迟  

    读取指令需要多个 PRU 时钟周期、具体取决于目标 地址 在处理器上的距离。 最快的 LBBO/LBCO 读取来自 DMEM0、DMEM1、SMEM (PRU 子系统数据 RAM)。

    来自 PRU DRAM 的 LBBO 需要 2 + N 个 PRU 时钟来读取 N 个 32 位字  (如果地址未按字对齐,则加上仲裁延迟,加上 1 个 PRU 时钟)

    LBBO 需要 3 个时钟周期来从 PRU 内部存储器获取前 4 个字节的数据。 每额外 4 个字节添加 1 个时钟。

    例如、 LBBO loadDestination、loadAddress、0、16
    需要 6 个 PRU 时钟:3 个时钟用于加载前 4 个字节、3 个时钟用于加载接下来的 12 个字节

    根据 PRU 子系统的不同、从不同位置进行的读取可能有来自不同源的仲裁延迟。

    有关仲裁延迟的更多信息,请参阅  【常见问题解答】PRU 仲裁延迟 。

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

    XFR2VBUS 呢?

    什么是 XFR2VBUS?  

    PRU 内核可以使用 XIN/XOUT 命令在单个时钟周期内与 XFR2VBUS 加速器交换多达 64 字节的数据。

    XFR2VBUS 如何节省 PRU 时钟周期

    因此、对于 64 字节写入、PRU 可以在 1 个时钟周期内将数据发送到 XFR2VBUS、而不是停止 16 个 PRU 时钟周期以使用 SBBO/SBCO 发送数据。 然后、PRU 代码可以继续执行指令、同时 XFR2VBUS 加速器处理实际数据传输。

    从片上 SRAM 读取的 PRU 64 字节可能会使 PRU 内核停止~40-80 个 PRU 时钟周期、具体取决于处理器。 在理想情况下、从 PRU 内部存储器读取的 64 字节将使 PRU 内核停止 18 个时钟周期、或者 PRU 内核可以触发 XFR2VBUS 以 1 个时钟周期读取存储器、然后在接下来的另一个时钟周期从 XFR2VBUS 加载数据。 XFR2VBUS 也可以配置为在读取时自动递增:在这种情况下、从 XFR2VBUS 加载数据会自动触发下一次读取、从而节省另一个时钟周期。

    哪些 PRU 子系统具有 XFR2VBUS 加速器?

    AM335x、AM437x、AM57x、K2G:无 XFR2VBUS

    AM261x、AM263Px、AM263x、AM62x:XFR2VBUS RX(每个切片 1 个=每个 PRU 子系统 2 个)

    AM243x、AM64x、AM65x:XFR2VBUS TX(每个切片 2 个=每个 PRU 子系统 4 个)、XFR2VBUS RX(每个切片 3 个=每个 PRU 子系统 6 个)

    使用 XFR2VBUS 有什么缺点吗?  

    XFR2VBUS 不适用于所有单个用例。

    XFR2VBUS 一次只能对一个读取或写入进行排队、因此数据无法通过流水线处理。

    XFR2VBUS 可用于从 PRU 子系统读取或写入数据、而 XFR2VBUS 无法直接访问 PRU 子系统的内部 CBASS 总线。 因此、对 PRU 子系统内存储器的任何读取或写入都必须从物理上退出 PRU 子系统、通过 SoC 级总线、并从 SoC 总线访问内部 CBASS。 这意味着、由于 PRU 内核可以使用具有 LBBO/LBCO 的本地地址直接访问 PRU 的内部 CBASS、XFR2VBUS 从 PRU 本地 DMEM 读取数据的实际时钟周期将大于 LBBO/LBCO 命令所需的时钟周期。

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

    注意! 对 PRU 子系统中的资源使用本地地址

    检查 PRU 的存储器映射、并使用本地存储器地址来访问 PRU 存储器、外设和寄存器。 如果将系统地址用于这些目标、则 LBCO/LBBO/SBCO/SBBO 命令将通过 SoC 总线访问这些目标、而不是直接通过 PRU 的本地 CBASS 总线访问。 这会导致更大的延迟、并可能在延迟中引入额外的抖动。

    有关更多信息、请参阅  【常见问题解答】PRU 仲裁延迟中的图形