Skip to main content
在 Qualcomm® Linux 上实现确定性延迟既需要 RT 内核,也需要正确的系统配置。本页介绍运行延迟测试前所需的调优步骤、cyclictest 的用法,以及 Qualcomm Linux RT 内核的已知限制。

测试前的系统调优

在运行任何 RT 验证测试之前,请在目标设备上应用以下配置步骤。除非通过 systemd 服务实现自动化(请参阅 OTA 与升级注意事项),否则每次重启后都必须重新应用调优。

QCS6490 · IQ-9075 · IQ-615

这些平台将 CPU 7 隔离为 RT 核心。CPU 0–6 为管家(housekeeping)CPU。 1. 禁用定时器迁移
2. 将工作队列绑定到管家 CPU(掩码 0x7F = CPU 0–6)
3. 将所有 CPU 频率调速器设置为 performance
4. 禁用 RT 记账/限流
5. 将 IRQ 亲和性设置为管家 CPU(0–6)

IQ-8275

该平台将 CPU 3 隔离为 RT 核心。CPU 0–2 和 4–7 为管家 CPU(掩码 0xF7)。 1. 禁用定时器迁移
2. 将工作队列绑定到管家 CPU(掩码 0xF7 = CPU 0–2、4–7)
3. 将所有 CPU 频率调速器设置为 performance
4. 禁用 RT 记账/限流
5. 将 IRQ 亲和性设置为管家 CPU(0–2、4–7)

通过 Yocto 安装 rt-tests

cyclictest 工具是上游 rt-tests 套件的一部分。 通过在你的层配置中追加 IMAGE_INSTALL 将其包含到 Yocto 镜像中:
重新构建并重新刷写镜像。启动后,cyclictest 位于 /usr/bin/cyclictest

运行 cyclictest

cyclictest 通过调度一个周期性线程并记录每次唤醒相对于请求间隔的延迟量来测量定时器延迟。

QCS6490 · IQ-9075 · IQ-615(RT 核心:CPU 7)

IQ-8275(RT 核心:CPU 3)

表:cyclictest 参数参考 示例输出:
Max 字段是以微秒为单位的最坏情况延迟。在正确调优的系统上,QCS6490、IQ-9075 和 IQ-615 上的该值应保持在 100 µs 以下,在应用了调优的 IQ-8275 上也应低于相同阈值。 有关完整文档和其他测试工具(hackbenchoslatpi_stress),请参阅 RT-Tests 文档

已知限制

仅限内核空间 PREEMPT_RT 为内核线程和中断处理程序提供确定性调度。用户空间应用程序必须通过 sched_setscheduler 显式选择使用 SCHED_FIFOSCHED_RR 调度策略,并必须使用 tasksetcpuset 绑定到隔离的 CPU 核心。在共享 CPU 上以 SCHED_OTHER(默认)运行的用户空间进程不会从 RT 内核中受益。 热限频 当 SoC 温度升高时,Qualcomm SoC 会应用热缓解措施降低 CPU 频率。即使设置了 performance 调速器,热事件也可能暂时降低 RT 核心的 CPU 频率,引入延迟尖峰。在长时间的生产测试中,请监控热状态:
如果结温经常超过限频阈值,请考虑降低系统负载或改善散热。 Remoteproc 固件认证 首次启动时,aDSP、cDSP 和 WPSS 子系统会通过 TrustZone 加载并认证固件。此过程在 device_initcall 期间运行,可能耗时数秒,短暂地对内存总线造成压力,并在早期启动的 RT 测量中引入延迟尖峰。请仅在所有 remoteproc 子系统完全启动后再运行 RT 验证:
SMT / 超线程 Qualcomm ARM64 SoC 不实现同时多线程(SMT)。因此,CPU 隔离模型(isolcpusnohz_fullrcu_nocbs)比 x86 更简单,不存在与 RT 核心共享执行资源的兄弟线程。 sched_rt_runtime_us 与看门狗 sched_rt_runtime_us 设置为 -1(无限制)会禁用防止 RT 任务饿死 CFS 任务的 RT 限流。这是实现确定性延迟所必需的,但意味着失控的 RT 任务可能锁死系统。在生产配置中启用 RT 内核看门狗(CONFIG_DETECT_HUNG_TASK=yhung_task_timeout_secs)以降低这一风险。 EFI 运行时服务 启用 PREEMPT_RT 后,内核的 EFI_DISABLE_RUNTIME Kconfig 选项默认为 y(参见 drivers/firmware/efi/Kconfig)。这会有意禁用 EFI 运行时服务,以消除 UEFI 固件调用可能给 RT 调度路径带来的巨大且不可预测的延迟。 在 Qualcomm 平台上这具有实际影响:启用用户配置启动时 dtb 覆盖(写入 VendorDtbOverlays EFI 变量)需要 EFI 运行时服务。目前在 yocto 配置中,通过在 conf/machine/include/qcom-common.incRT_KERNEL_CMDLINE 中追加以下参数,在内核命令行上传递 efi=runtime 来启用 EFI 运行时服务: