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.

[参考译文] AM62A7:C7x 干扰 A53 内核和 R5 性能

Guru**** 2924210 points

Other Parts Discussed in Thread: AM62A7

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1645131/am62a7-c7x-interfering-with-a53-cores-and-r5-performance

器件型号: AM62A7

当 C7x 进行大型计算时、我们会看到 A53 和 R5 的性能问题。

 

  • 运行 ISR 的 A53 内核具有~100-200us 延迟
  • R5 MCU 任务有 200 μ s 的延迟

存在 QoS 寄存器、但 C7x 似乎以最高优先级硬编码。 必须有一种方法可以防止 C7x 干扰系统其他部分的实时限制。  

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

    您好、Victor、

    您是对的。 默认情况下、C7x 设置为使用 0(最高)作为 ePriority、而 A53 和 R5F 设置为 7(最低)、并且全部使用 DDR_NON_RT 路径。

    一种方法是使用 DDR_RT 路径设置 A53 和 R5F、并将 C7x 保持在 DDR_NON_RT 路径。 有关详细信息、请参阅随附的 PPT 和头文件。

    此致、

    Ming

    e2e.ti.com/.../AM62D_5F00_DDR_5F00_QoS.pptx

    e2e.ti.com/.../qos_5F00_data.h

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

    尊敬的 Ming:

    我与 Victor 合作、在 AM62A7 系统中、我们遵循 SPL 引导流程、其中 Linux 中的 Remoteproc 驱动程序启动了远程内核 (R5、C7x)。

    我不完全了解有关附加 AM62D_DDR_QoS.pptx 的说明。 我们应修改哪个 syscfg 以将 A53 和 R5F 更改为 DDR_RT? 此外、如何将 qos_data.h 重建到 SPL 引导流程中?

    我尝试了加载 C7x 和 R5 syscfg、但在 syscfg 中没有看到 QoS 配置。 我们使用的是 mcu_plus_sdk_am62ax_10_01_00_33。

    谢谢、

    Joseph

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

    尊敬的 Ming:

    QoS 配置好像在 WKUP R5 syscfg 中、而不是在 C7x 或 MCU R5 syscfg 中。

    如果我在 U-Boot 中构建了一个新的 DM FW 映像和软件包、是否足以应用这些更改?

    谢谢、

    Joseph

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

    尊敬的 Ming:

    我能够应用您随附的 qos_data.h 更改并构建新的 DM FW。 我们看到 QoS 略有改进、但这仍不是我们所期望的。

    通过更改 DDR_NON_RT 设置、是否可以为 A53/R5 获得更高的优先级? 如果是、如何实现?

    谢谢、
    Joseph

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

    您好、Joseph:

    我发送给您的修复程序是针对 FreeRTOS SDK。 您需要重新编译 SBL_SD 或 SBL_OSPI。  对于 Linux、必须在 U-boot 中进行更改:

    elixir.bootlin.com/.../am62a_qos_uboot.c

    此致   

    Ming  

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

    尊敬的 Ming:

    感谢您提供此信息! 您能否确认在用于 Linux SPL 的 DM FW 引导流程中不需要更改?

    此外、我还尝试在 U-Boot 中应用以下更改、将 C7x 内核的优先级降至最低、并提高性能。

    {
    		.reg = K3_QOS_REG(SAM62A_C7XV_WRAP_MAIN_0_C7XV_SOC, 0),
    		.val = K3_QOS_VAL(7, 0, 0, 0, 0, 0),
    },

    您能否介绍一下尝试使用“A53和 R5F“建议并将 C7x 保持在 DDR_NON_RT 路径所需的更改“。

    谢谢、

    Joseph

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

    您好、Joseph:

    您尝试设置 C7x 内核的 QoS 字段、根据 AM62A TRM、该字段是不允许的。

    以下是 “A53和 R5F 使用 DDR_RT 路径并将 C7x 保持在 DDR_NON_RT 路径“的设置:

    #if 0

    .reg = K3_QoS_REG (SAM62A_C7XV_WRAP_MAIN_0_C7XV_SOC、0)、
    .val = k3_QoS_VAL (0、8、0、0、 0)、
    }、
    #endif

    .reg = K3_QoS_REG (Pulsar_UL_WKUP_0_CPU0_RMST、0)、
    .val = k3_QoS_VAL (0、8、0、0、 0)、
    }、

    .reg = K3_QoS_REG (Pulsar_UL_WKUP_0_CPU0_WMST、0)、
    .val = k3_QoS_VAL (0、8、0、0、 0)、
    }、

    .reg = K3_QoS_REG (Pulsar_UL_WKUP_0_CPU0_PMST、0)、
    .val = k3_QoS_VAL (0、8、0、0、 0)、
    }、{
    .reg = K3_QoS_REG (Pulsar_ULS_MCU_0_CPU0_RMST、0)、
    .val = k3_QoS_VAL (0、8、0、0、 0)、
    }、

    .reg = K3_QoS_REG (Pulsar_ULS_MCU_0_CPU0_WMST、0)、
    .val = k3_QoS_VAL (0、8、0、0、 0)、
    }、

    .reg = K3_QoS_REG (Pulsar_ULS_MCU_0_CPU0_PMST、0)、
    .val = k3_QoS_VAL (0、8、0、0、 0)、
    }、

    .reg = K3_QoS_REG (SAM62A_a53_512kb_wrap_main_0_A53_quad_wrap_CBA_AXI_R、0)、
    .val = k3_QoS_VAL (0、8、0、0、 0)、
    }、

    .reg = K3_QoS_REG (SAM62A_a53_512kb_wrap_main_0_A53_quad_wrap_CBA_AXI_W、0)、
    .val = k3_QoS_VAL (0、8、0、0、 0)、
    }、

    如果要将 C7x 内核和其他内核置于相同的数据路径和优先级、只需将“#if 0“更改为“#if 1“

    此致、

    Ming

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

    尊敬的 Ming:

    感谢您分享这些更改。 我能够构建新的 U-boot 和测试、但仍会看到性能延迟。 例如、在运行 C7x 代码时、R5 中的中断未达到预期频率。 我看到在该时间范围内从 100us 到 400us 的延迟。

    我尝试在现有 QoS_DATA[]的基础上应用您的更改 、并在 K3_QoS_VAL 中尝试了不同的配置、例如将 C7x 的 epriority 字段更改为最低优先级。 我将 OrderID 字段 0x0 设置为 0x0、因为 TRM 提示将其保持为 0x0。

    这些设置是否正确? 请注意、我尝试了 C7x 的 IF 0 和#if 1 设置

    struct k3_qos_data qos_data[] = {
    	/* modules_qosConfig0 - 1 endpoints, 4 channels */
    	{
    		.reg = K3_QOS_REG(K3_DSS_UL_MAIN_0_VBUSM_DMA, 0),
    		.val = K3_QOS_VAL(0, 8, 0, 0, 0, 0),
    	},
    	{
    		.reg = K3_QOS_REG(K3_DSS_UL_MAIN_0_VBUSM_DMA, 1),
    		.val = K3_QOS_VAL(0, 8, 0, 0, 0, 0),
    	},
    	{
    		.reg = K3_QOS_REG(K3_DSS_UL_MAIN_0_VBUSM_DMA, 2),
    		.val = K3_QOS_VAL(0, 8, 0, 0, 0, 0),
    	},
    	{
    		.reg = K3_QOS_REG(K3_DSS_UL_MAIN_0_VBUSM_DMA, 3),
    		.val = K3_QOS_VAL(0, 8, 0, 0, 0, 0),
    	},
    
    	/* Following registers set 1:1 mapping for orderID MAP1/MAP2
    	 * remap registers. orderID x is remapped to orderID x again
    	 * This is to ensure orderID from MAP register is unchanged
    	 */
    
    	/* K3_DSS_UL_MAIN_0_VBUSM_DMA - 1 groups */
    	{
    		.reg = K3_QOS_GROUP_REG(K3_DSS_UL_MAIN_0_VBUSM_DMA, 0),
    		.val = K3_QOS_GROUP_DEFAULT_VAL_LOW,
    	},
    	{
    		.reg = K3_QOS_GROUP_REG(K3_DSS_UL_MAIN_0_VBUSM_DMA, 1),
    		.val = K3_QOS_GROUP_DEFAULT_VAL_HIGH,
    	},
    	#if 1
    	{
    		.reg = K3_QOS_REG(SAM62A_C7XV_WRAP_MAIN_0_C7XV_SOC, 0),
    		.val = K3_QOS_VAL(0, 0, 0, 7, 0, 0),
    	},
    	#endif
    	{
    	.reg = K3_QOS_REG(PULSAR_UL_WKUP_0_CPU0_RMST, 0),
    	.val = K3_QOS_VAL(0, 8, 0, 0, 0, 0),
    	},
    	{
    	.reg = K3_QOS_REG(PULSAR_UL_WKUP_0_CPU0_WMST, 0),
    	.val = K3_QOS_VAL(0, 8, 0, 0, 0, 0),
    	},
    	{
    	.reg = K3_QOS_REG(PULSAR_UL_WKUP_0_CPU0_PMST, 0),
    	.val = K3_QOS_VAL(0, 8, 0, 0, 0, 0),
    	},{
    	.reg = K3_QOS_REG(PULSAR_ULS_MCU_0_CPU0_RMST, 0),
    	.val = K3_QOS_VAL(0, 8, 0, 0, 0, 0),
    	},
    	{
    	.reg = K3_QOS_REG(PULSAR_ULS_MCU_0_CPU0_WMST, 0),
    	.val = K3_QOS_VAL(0, 8, 0, 0, 0, 0),
    	},
    	{
    	.reg = K3_QOS_REG(PULSAR_ULS_MCU_0_CPU0_PMST, 0),
    	.val = K3_QOS_VAL(0, 8, 0, 0, 0, 0),
    	},
    	{
    	.reg = K3_QOS_REG(SAM62A_A53_512KB_WRAP_MAIN_0_A53_QUAD_WRAP_CBA_AXI_R, 0),
    	.val = K3_QOS_VAL(0, 8, 0, 0, 0, 0),
    	},
    	{
    	.reg = K3_QOS_REG(SAM62A_A53_512KB_WRAP_MAIN_0_A53_QUAD_WRAP_CBA_AXI_W, 0),
    	.val = K3_QOS_VAL(0, 8, 0, 0, 0, 0),
    	},
    };

    谢谢、

    Joseph

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

    您好、Joseph:

    例如、在运行 C7x 代码时、R5 中的中断未达到预期频率。 在那段时间里、我看到从 100 μ s 到 400 μ s 的延迟。“

    这表示问题可能不是由 QoS 设置引起的、因为 QoS 设置不应导致中断延迟。 它应该只影响数据路径和访问 DDR 的优先级。

    您可能需要查看将中断长时间禁用的代码、尤其是对于 DSS 中的 DMA、因为它们也会设置为高优先级。

    根据 TRM、 无法设置 SAM62A_C7XV_WRAP_MAIN_0_C7XV_SOC 的工龄、因此将其设置为 7 根本不会生效。

    此致、

    Ming

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

    尊敬的 Ming:

    我想我的最后一封邮件有些混淆、因此我会尝试澄清一下。 我们正在测量中断 (R5 和 A53) 中的延迟。 我们有一个保证的硬件触发下降沿中断、频率为 2kHz、我们使用 ISR 来取消置位该中断。 我们在整个应用程序中测量将中断置为无效所需的时间、当 C7x 代码运行时、该时间会增加。 另外、在示波器上、我们会看到该中断的上升沿(置为无效)被进一步延迟、这表明 ISR 需要更长的时间才能运行。

    我确认、在 AM62A TRM 的第 3.5.2.2 节中、 C7X256V0 QoS 映射显示“支持优先级“说“不支持“ 我们可以对 C7x 或 A53/R5 QoS 做哪些其他更改来减少我们看到的延迟?

    谢谢、

    Joseph   

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

    您好、Joseph:

    由于 C7x 已设置为具有 epriority 0 的 DDR_NON_RT 路径、并且 A53 和 R5F 已设置为具有 epriority 0 的 DDR_RT 路径、因此、您无法通过 QoS 设置进行改进。

    如前所述、您可能需要检查 C7x 内核代码、这将禁用来自 A53 或 R5F 内核的中断。

    此致、

    Ming

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

    尊敬的 Ming:

    我在 C7x 代码中运行了一些测试、希望分享测试结果、希望能更好地了解情况。 请注意、这些测试是在应用 QoS 设置的情况下运行的。 欢迎您对测试提供任何意见!
    1.剥离 C7x 中除调试之外的所有内容、以确认 RPMessages 已经到来。
    正如预期的那样、我们的中断性能没有增加延迟。
    2、使用质数搜索算法进行 CPU 应力测试。 这在 DDR 中使用一些静态存储器。
    添加了高达 290us 的延迟
    3、相同的 CPU 应力,在每次的素数搜索迭代中将 memcpy 添加到全局缓冲区。
    增加了高达 350uS 的延迟
    DDR 应力测试将 128KB 的数据复制到全局缓冲区 40 次。
    即使 c7x 代码的执行时间比之前的测试中更长、也不会检测到重大延迟。
    5.结合测试#4 与#2 或#3.
    测量的延迟始终大于 500us。
    附加用于参考的测试片段。 这些计算不应禁用任何中断。
    TRM 中提到了一个寄存器 C7XV_RSWS_BS_LIMITER6、该寄存器支持 C7x 的写入和读取带宽限制。 这是否有助于解决我们的问题?
    谢谢、
    Joseph
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Joseph:

    我在办公室里呆了 4 天。 我们将赶上 e2e 主题、明天继续回复您。

    此致、

    Ming

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

    您好、Joseph:

    由于您已将 R5F 和 A53 设置为 DDR_RT 路径、该路径的优先级高于 DDR_NON_RT 路径上的 C7x、因此、C7x 负载增加不会影响 R5F 和 A53 ISR 的延迟。 为了进行验证、您可以将所有 R5F 相关代码/数据放入 TCM 中(而不是在 DDR 中)。 如果延迟是正常的、则它与 QoS 相关。 如果延迟仍然很高、则还有其他因素会影响 R5F 延迟。

    此致、

    Ming

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

    尊敬的 Ming:

    感谢您的建议。 我实际上尝试了使用 C7XV_RSWS_BS_LIMITER 寄存器、能够大大降低延迟。 我们仍在测试最佳配置、但看起来我们能够限制每个内核的最大读写事务数。 默认情况下、这些设置设置为 64、我通过降低该数字进行测试、直到我们看到性能得到改进。

    我认为可以通过配置带宽限制寄存器 (CIR/PIR) 来进一步调优。 这些寄存器中每个寄存器的速率单位是什么? TRM 未指定此项。

    此致、

    Joseph

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

    您好、Joseph:

    这是 CIR/PIR 编码。

    工作原理: C7x BW 限制器 (SAM62A_C7XV_RSWS_BS_LIMITER6)

    正确的解决方案是 CBass 上的 C7x 带宽限制器。 无论访问模式如何、这都会在 C7x DDR 访问上强制实施硬吞吐量上限。

    关键注意事项:  TISCI_DEV_C7XV_RSWS_BS_LIMITER6 默认情况下、BW 限制器外围设备 (TISCI 设备 ID 206,) 采用时钟门控。 在不接通电源的情况下访问其寄存器会首先导致 DM R5F 上的总线中止。 您必须 Sciclient_pmSetModuleState() 在任何寄存器写入之前调用:

    int32_t ret = Sciclient_pmSetModuleState(
        TISCI_DEV_C7XV_RSWS_BS_LIMITER6,
        TISCI_MSG_VALUE_DEVICE_SW_STATE_ON,
        0U,
        SystemP_WAIT_FOREVER);
    DebugP_assert(ret == SystemP_SUCCESS);
    

    此操作必须在 DM R5F 上运行 Sciclient_init() 在之后和之前 sciServer_init()

    寄存器布局 (base = 0x30406000):

    0.5 μ V 偏移 寄存器
    +0x004 CTRL(位 0 = RD_BW_EN、位 1 = WR_BW_EN)
    +0x100 Rd_CIR
    +0x104 RD_PIR
    +0x200 WR_CIR
    +0x204 WR_PIR

    CIR/PIR 编码:

    reg_value = (target_MB_per_s / cbass_clock_MHz) * 32768
    

    AM62DX 上的 CBass 时钟为 400MHzCHIP_DIV1_CLK()。 对于 LPDDR4-3200 的 50%、16 位峰值 (3200Mb/s):

    reg_value = (3200 / 400) * 32768 = 0x200000
    

    工作代码 (DM R5F main_thread()):

    volatile uint32_t *bwl = (volatile uint32_t *)CSL_C7XV_RSWS_BS_LIMITER6_REGS_BASE;
    
    bwl[0x100/4] = 0x200000U;  /* RD_CIR   50% */
    bwl[0x104/4] = 0x200000U;  /* RD_PIR   50% */
    bwl[0x108/4] = 0U;         /* RD_BURST     */
    bwl[0x200/4] = 0x200000U;  /* WR_CIR   50% */
    bwl[0x204/4] = 0x200000U;  /* WR_PIR   50% */
    bwl[0x208/4] = 0U;         /* WR_BURST     */
    bwl[0x004/4] = 0x3U;       /* CTRL: RD_BW_EN | WR_BW_EN */

    Best regards,

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

    尊敬的 Ming:

    感谢您提供了编码。 对于 C7XV_RSWS_BS_limit 、我实际上在 U-boot 中设置了 am62a7_init.c 中的寄存器。 我不确定这是否应该在 DM R5F 中运行(就像您推荐的 SAM62A_C7XV_RSW_BS_LIMITER6 一样)、但当我  在 Linux 中读取 C7XV_RSWS_BS_LIMITER 寄存器地址时、这些设置仍然很重要。

    此致、

    Joseph

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

    您好、Joseph:

    “此操作必须在 DM R5F 上运行 Sciclient_init() 、之后和之前 sciServer_init()。“

    对于 C7XV_RSWS_BS_LIMITER、寄存器设置不仅必须在 DM R5F 上运行、而且必须在 Scicleint_init () 和 sciServer_init () 之后。

    请关闭此主题并为 AM62A Linux SDK 归档另一个主题。

    此致、

    Ming