工具与软件:
你(们)好
我想继续下面的线程停止的位置。 我想让 PRU 在 AM625中以333MHZ 运行。 我可以提供反馈和测试。
谢谢你
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.
我按照建议尝试了这些设置。 PRU 时钟确实切换到了333MHz、但对从 DDR 进行读取的 LBBO 调用显著增加。 是否有详细介绍寄存器和值的文档? TRM 非常模糊。
pruss_coreclk_mux: coreclk-mux@3c {
reg = <0x3c>;
#clock-cells = <0>;
clocks = <&k3_clks 81 0>, /* pruss_core_clk */
<&k3_clks 81 14>; /* pruss_iclk */
assigned-clocks = <&pruss_coreclk_mux>;
assigned-clock-parents = <&k3_clks 81 14>;
assigned-clock-rates = <333333333>;
};对于未来的读者、这位之前的客户能够使用与 D Anthony 所发布的相同设置来设置333MHz 时钟:
我们是否能够让您发布测试代码以及默认时钟频率和更新后的333MHz 时钟频率的测试结果?
此致、
Nick
使用上述设置、PRU 指令以333MHz 的频率运行。 然而、在采用默认设置(250MHz)的情况下、以下指令的时间~600ns。 通过建议的333MHz 时钟设置、指令将接管3us。 似乎建议的设置会影响 DDR 读取速度。 希望它能做到、如果可能、我希望减少600ns 的读数。
set R30,R30,PRU_TEST_1 NOP clr R30,R30,PRU_TEST_1 LBBO &r5, ddr_mapped_addr,0,50 set R30,R30,PRU_TEST_1 NOP clr R30,R30,PRU_TEST_1
采用"默认250MHz"设置时的 DDR 50字节读取时序

使用"333MHz 建议设置"的 DDR 50字节读取时序

Anthony、您好!
我们将在下周左右对您的线程进行标记分组-我将 提供一些意见、我的一位团队成员将研究实际运行的测试。
一般读取延迟想法
首先、我之前针对读/写延迟完成的所有工作都可以在本常见问题解答中找到。 如果您尚未通读、请查看:
https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1096933/faq-pru-how-do-i-calculate-read-and-write-latencies
在撰写该常见问题解答时、我没有考虑以下一点:当 ICLK/VCLK 频率(固定为250MHz)与 PRU 内核频率(在您的示例中为333MHz)不同时异步电桥的影响。 目前、我不确定 TI 的任何人是否对这种潜在影响进行了全面分析、因此我无法为您提供预测读取命令影响的准确公式。 我希望写入命令不受影响、并且仍然应如常见问题解答中所述的那样工作。
AM64x PRU 以太网固件开发人员提到、他们必须权衡较长读取时间的利弊、但以更高的频率运行固件。 至少对它们来说、每个 ICSSG 在6个内核上扩展的速度提高了33%(每个指令增加3ns、而不是每个指令增加4ns)、抵消了 访问外部存储器的延迟增加的影响。
其他想法- DDR 不适合低延迟访问
DDR 是您可以访问的最慢存储器、因为信号必须从物理上离开处理器才能到达。 您的应用需要多大的存储器容量?您希望使用它实现什么功能?
如果您有足够的空间、则可以使用 PRU 子系统的本地内存获得最快的性能。 下一个最快的访问将是对片上 SRAM (在 AM62x 上相当有限、仅64KB 用于访问)。
此致、
Nick
Anthony、您好!
也许有一种解决方案可以缩短在333 MHz 下运行时的读取时间、如果不是这样、我们就可以在250 MHz 下运行了。
我将与团队讨论更多这方面的内容并回复给您。
此致、
Nitika
是否有解决办法? 我也会看到相同的问题。 通过使用 LBBO 访问使用32字节读取的各种存储器位置、我看到当 PRU 时钟增加到333MHz 时速度严重放缓。
我能够验证 PRU 本地/共享 RAM 的 LBBO 是否保持在一致的11个时钟节拍。 非常相似。 然而、对 DDR 的访问从大约83个时钟周期(平均)下降到大约690个。 对片上 SRAM 的访问从24个周期下降到大约143个周期。 对 M4F SRAM 的访问(我们不使用 M4F、因此我正在考虑使用它的 RAM)从47个时钟周期下降到363个时钟周期。 随着时钟速度加快、我们期望读取的时钟节拍数略高、但不会太高。
在200MHz 下运行还会导致访问非常慢。 因此、我决定尝试在250MHz 下运行、但实际上将其配置为250MHz、而不是默认值。 使用:
pruss_coreclk_mux: coreclk-mux@3c { reg = <0x3c>; #clock-cells = <0>; clocks = <&k3_clks 81 0>, /* pruss_core_clk */ <&k3_clks 81 14>; /* pruss_iclk */ assigned-clocks = <&pruss_coreclk_mux>; assigned-clock-parents = <&k3_clks 81 14>; assigned-clock-rates = <250000000>; };
这也导致它的访问速度非常慢。 因此、任何配置时钟的尝试都会导致对外部 RAM /存储器的访问缓慢。 是否有任何说明介绍如何在输出影响外部 RAM 速度的情况下、获得配置为333MHz (或200MHz 或250MHz)的时钟?
Daniel、您好!
此外、如果您的主要目标是提高 DDR 的读取速度、我也建议查看 xfr2vbus_rd 小工具(请参阅 TRM 第 7.4.5.3.1 PRUSS XFR2VBUS 硬件加速器)。
TRM 中提供了该 代码的编程指南、您也可以参阅此主题。
此致、
Nitika
我确实尝试了 xfr2vbus 以及,并得到了类似的减速相比 LBBO。 如果我能够在两个读取单元之间交替、xfr2vbus 会更好一点、但与默认值相比、如果 PRU 以333运行、速度仍然会明显变慢。
xfr2vbus 还具有其他复杂性。 一般而言、每次读取时需要48字节的数据、因此我需要读取64字节、并将一些数据转移到暂存区、等等。 然而,如果速度不是任何更好的333 (这不是),那么它仍然是不可用的。
Daniel 和 D Anthony、您好!
你在同一个团队中吗?
您的时钟频率设置看起来不正确
步骤1:请 在不设置频率的情况下使用 ICLK 进行测试
再看一下这个线程中的时钟设置、它们在我看来不正确。 ICLK 是固定的250MHz 时钟、因此不应手动设置频率。 如果您使用的是 ICLK、则应如下操作:
https://git.ti.com/cgit/ti-linux-kernel/ti-linux-kernel/commit/arch/arm64/boot/dts/ti/k3-am62-main.dtsi?h=ti-linux-6.6.y-cicd&id=34e6b1d215aae3e5d9c9d455edc943140ec99775
我最好的猜测是 Linux 选择不同于 ICLK 的时钟源、并将其它时钟源设置为250MHz。 因此、即使您有250MHz 时钟、它与总线时钟是不同的250MHz 时钟、因此读取/写入性能仍然会降低。
第2步:好的、如果我们需要250MHz 以外的其他内容、我们应该如何设置时钟频率?
这有点棘手、因为 AM62x TRM 时钟图现在出错了。 但是、AM64x 的时钟图应该类似。 让我们看看以下时钟源:

我突出显示了我们关心的路径。
PRU 内核时钟(图中为 CORE_CLK)有2个可能的源: pruss_iclk 和 pruss_core_clk。
pruss_iclk (或 ICLK)是固定250MHz。 这是用于与处理器其余部分通信的"总线接口时钟"或 VCLK。 如图所示、此时钟源也可以路由到 PRU 的内部 CORE_CLK。 我不希望您看到此时钟具有额外的读/写延迟。
PRUSS_CORE_CLK (或映像中的 ICSSG0_CORE_CLK)有2个不同的时钟源可以进入这2个时钟源:MAIN_2_HSDIVOUT0_CLK 和 MAIN_0_HSDIVOUT9_CLK。 这些时钟源可以配置为具有不同的频率。 仅当您选择将通过 pruss_core_clk 路由的时钟源之一时、才应设置时钟频率。
让我们查看 TISCI 文档中定义的 PRU 时钟 ID。 查看 ICSSM0下(即使 AM62x 具有 PRUSS、但不具有 PRU-ICSS):
https://software-dl.ti.com/tisci/esd/09_02_07/5_soc_doc/am62x/clocks.html#clocks-for-icssm0-device
对于 pruss_core_clk/core_clk、我们需要使用时钟 ID 0、并将时钟 ID 1或2列为输入:

对于 pruss_iclk/VCLK、我们仅使用时钟 ID 14:

第3步:好的、我的时钟设置应该是什么样的?
我们已经知道如果使用 ICLK、应该是什么样的: https://git.ti.com/cgit/ti-linux-kernel/ti-linux-kernel/commit/arch/arm64/boot/dts/ti/k3-am62-main.dtsi?h=ti-linux-6.6.y-cicd&id=34e6b1d215aae3e5d9c9d455edc943140ec99775
下面我们重点介绍如何使用 pruss_core_clk 获取其他频率。
请遵循此处常见问题解答的概念。 该对话框用于 ICSSG 而不是 PRUSS、但概念类似:
https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1049800/faq-pru_icssg-how-to-check-and-set-pru-core-frequency-in-linux
我将请 Nitika 跟进每个时钟源究竟支持哪些频率。 因此、该代码现在可能没有正确的频率。 但是、假设 MAIN_0_HSDIVOUT9_CLK 可以输出200MHz。
那么、为了将 PRU 内核时钟设置为200MHz、我希望代码如下所示:
pruss_coreclk_mux: coreclk-mux@3c {
reg = <0x3c>;
#clock-cells = <0>;
clocks = <&k3_clks 81 0>, /* pruss_core_clk */
<&k3_clks 81 14>; /* pruss_iclk */
assigned-clocks = <&k3_clks 81 0>, <&pruss_coreclk_mux>;
assigned-clock-parents = <&k3_clks 81 2>, <&k3_clks 81 0>; /* DEV_ICSSM0_CORE_CLK_PARENT_POSTDIV4_16FF_MAIN_0_HSDIVOUT9_CLK */
assigned-clock-rates = <200000000>, <0>; /* 200MHz */
};
请告诉我们这是否适合您。 我们将通过该交互操作为 AM62x 时钟创建新的 e2e 常见问题解答和新文档。
此致、
Nick
Daniel、您好!
设置 PRU 时钟频率
即使使用"已更新"的 devicetree 设置、我也预计在使用接口时钟以外的其他时钟时读取会花费更长的时间(确切时间待定)。 如果使用的不是默认的250MHz ICLK、这项工作的主要目的是确保代码可转发可移植。
请发布您正在测试的确切 devicetree 设置以及每个设置下观察到的结果。
我假设如上所述、当您设置 PRU 内核时钟= ICLK 时、DDR 读取不会花费额外的周期、对吧?
您可以通过使用 devmem2检查这些寄存器来验证您在硬件中的更改:
在 PRU 子系统内:
ICSSG_CORE_SYNC_REG (偏移0x26000、寄存器0x3C)
位 CORE_VBUSP_SYNC_EN:0h = ICSSGn_CORE_CLK 是源、1h = ICSSGn_ICLK 是源
在控制 MMR 寄存器中:
CFG0_ICSSM0_CLKSEL (物理地址 0010 8040h)
位0 ICSSM0_CLKSEL_CORE_CLKSEL (选择 ICSSM0功能时钟源字段值(其他
为保留):1'b0 - MAIN_PLL2_HSDIV0_CLKOUT 1'b1 - MAIN_PLL0_HSDIV9_CLKOUT)
好的、但我仍然看到较高的延迟。 我还能做什么?
您是否使用 SRAM 实现任何用途? SRAM 的访问延迟通常低于 DDR。 我还想了解访问 SRAM 时 ICLK 与其他时钟之间的延迟差异是否与访问 DDR 时不同。
此致、
Nick
对于250MHz、我将使用:
pruss_coreclk_mux: coreclk-mux@3c {
reg = <0x3c>;
#clock-cells = <0>;
clocks = <&k3_clks 81 0>, /* pruss_core_clk */
<&k3_clks 81 14>; /* pruss_iclk */
assigned-clocks = <&pruss_coreclk_mux>;
assigned-clock-parents = <&k3_clks 81 14>;
};
对于200MHz 和333MHz、我将使用:
pruss_coreclk_mux: coreclk-mux@3c {
reg = <0x3c>;
#clock-cells = <0>;
clocks = <&k3_clks 81 0>, /* pruss_core_clk */
<&k3_clks 81 14>; /* pruss_iclk */
assigned-clocks = <&k3_clks 81 0>, <&pruss_coreclk_mux>;
assigned-clock-parents = <&k3_clks 81 2>, <&k3_clks 81 0>; /* DEV_ICSSM0_CORE_CLK_PARENT_POSTDIV4_16FF_MAIN_0_HSDIVOUT9_CLK */
assigned-clock-rates = <200000000>, <0>; /* 200MHz */
};
(仅更新333MHz 的时钟速率)
这导致时序如下所示:

和我使用的代码:
RESET_PRU_CLOCK r8, r9
LDI32 r8, 0x70000000 // OCSRAM
LDI r9, 1024
LOOP TEST_OCSRAM_DONE, r9
LBBO &r10, r8, 0, 32
ADD r8, r8, 32
TEST_OCSRAM_DONE:
GET_PRU_CLOCK r8, r9, 4
SBCO &r8, CONST_PRUDRAM, 16, 4
RESET_PRU_CLOCK r8, r9
LDI32 r8, 0x0005040000 // M4 DRAM
LDI r9, 1024
LOOP TEST_M4_DONE, r9
LBBO &r10, r8, 0, 32
ADD r8, r8, 32
TEST_M4_DONE:
GET_PRU_CLOCK r8, r9, 4
SBCO &r8, CONST_PRUDRAM, 24, 4
RESET_PRU_CLOCK r8, r9
LDI32 r8, 0x8f000000 // DDR DRAM (reserved)
LDI r9, 1024
LOOP TEST_DDR_DONE, r9
LBBO &r10, r8, 0, 32
ADD r8, r8, 32
TEST_DDR_DONE:
GET_PRU_CLOCK r8, r9, 4
SBCO &r8, CONST_PRUDRAM, 32, 4
RESET_PRU_CLOCK r8, r9
LDI32 r8, 0x00010000 // local shared ram
LDI r9, 1024
LOOP TEST_SHARED_DONE, r9
LBBO &r10, r8, 0, 32
ADD r8, r8, 32
TEST_SHARED_DONE:
GET_PRU_CLOCK r8, r9, 4
SBCO &r8, CONST_PRUDRAM, 40, 4
然后、我可以使用 devmem2从 PRU 的 RAM 中查询四个值。
Daniel、您好!
[报价 userid="280115" url="~/support/processors-group/processors/f/processors-forum/1459880/am625-i-would-like-to-get-the-pru-running-at-333mhz-in-am625/5640275 #5640275"]我将请 Nitika 跟进每个时钟源究竟支持哪些频率。 因此、该代码现在可能没有正确的频率。 [报价]如上面 Nick 所提到的、请确定 频率可用于每个 PLL 时钟源:
PLL2 (父时钟 ID 1):225和300MHz
PLL0 (父时钟 ID 2):200,250和333 MHz

此致、
Nitika