Other Parts Discussed in Thread: AM62A7
器件型号: AM62A7
当 C7x 进行大型计算时、我们会看到 A53 和 R5 的性能问题。
- 运行 ISR 的 A53 内核具有~100-200us 延迟
- R5 MCU 任务有 200 μ s 的延迟
存在 QoS 寄存器、但 C7x 似乎以最高优先级硬编码。 必须有一种方法可以防止 C7x 干扰系统其他部分的实时限制。
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.
您好、Victor、
您是对的。 默认情况下、C7x 设置为使用 0(最高)作为 ePriority、而 A53 和 R5F 设置为 7(最低)、并且全部使用 DDR_NON_RT 路径。
一种方法是使用 DDR_RT 路径设置 A53 和 R5F、并将 C7x 保持在 DDR_NON_RT 路径。 有关详细信息、请参阅随附的 PPT 和头文件。
此致、
Ming
尊敬的 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
您好、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
尊敬的 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 编码。
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