> ## Documentation Index
> Fetch the complete documentation index at: https://dragonwingdocs.qualcomm.com/llms.txt
> Use this file to discover all available pages before exploring further.

# RT 内核基础

实时(RT)系统对外部事件提供确定性的、有界的响应时间。当一个系统不存在无界延迟、其最坏情况响应时间可以精确计算、且所有任务都能在规定的抖动限制内满足其调度期限时,该系统即可称为实时系统。

Qualcomm<sup>®</sup> Linux 提供一个基于上游 `PREEMPT_RT` 补丁集构建的 LTS RT 内核(6.18.x)。RT 内核面向需要确定性调度的内核空间进程。用户空间应用程序仅使用 RT 内核并不能获得 RT 行为;它们还必须使用 RT 调度策略(`SCHED_FIFO` / `SCHED_RR`)编写,并绑定到隔离的 CPU 核心上。

## PREEMPT\_RT 如何改变内核

标准 Linux 内核(`CONFIG_PREEMPT` 或 `CONFIG_PREEMPT_VOLUNTARY`)允许某些临界区以不可抢占方式运行,导致无界的调度延迟尖峰。`PREEMPT_RT` 通过以下方式消除这一问题:

| **改变**                         | **效果**                                 |
| :----------------------------- | :------------------------------------- |
| 将自旋锁转换为可睡眠互斥锁(RT 互斥锁)          | 临界区变得可抢占,降低最坏情况延迟                      |
| 默认将中断处理程序线程化                   | ISR 作为具有可配置优先级的内核线程运行,将其从不可抢占的中断上下文中移出 |
| 序列化 RCU(读-复制-更新)回调             | RCU 回调在专用线程而非 softirq 上下文中运行,减少抖动      |
| 将 `local_lock_t` 转换为每 CPU 可睡眠锁 | 每 CPU 代码路径变得可抢占                        |

其结果是一个几乎所有代码路径都可以被更高优先级 RT 任务抢占的内核,在经过调优的 Qualcomm 硬件上可提供微秒级的确定性最坏情况延迟。

有关权威的上游文档,请参阅
[Linux kernel realtime](https://realtime-linux.org/)。

## 所需的 Kconfig 选项

Qualcomm Linux 的 `meta-qcom` 层通过 `linux-qcom-rt_6.18.bb` 配方中包含的 `rt.config` 配置片段默认启用 `CONFIG_PREEMPT_RT`。下表描述了关键的 Kconfig 选项及其作用:

**表:RT 内核 Kconfig 选项**

|         **选项**         | **RT 构建中的默认值** | **说明**                                                      |
| :--------------------: | :------------: | :---------------------------------------------------------- |
|   `CONFIG_PREEMPT_RT`  |       `y`      | 启用完全内核抢占。RT 的必备选项。                                          |
|  `CONFIG_NO_HZ_COMMON` |       `y`      | 无时钟滴答空闲和完全无滴答运行的基础设施。`NO_HZ_FULL` 的必需项。                     |
|   `CONFIG_NO_HZ_FULL`  |       `y`      | 在只有单个可运行任务的 CPU 上抑制调度时钟中断。减少隔离 RT 核心上的抖动。                   |
|    `CONFIG_CPUSETS`    |       `y`      | 允许将 CPU 分组为集合以进行亲和性控制。将 RT 任务隔离到专用核心所必需。                    |
| `CONFIG_CPU_ISOLATION` |       `y`      | 启用 `isolcpus=` 内核参数支持,将核心从通用调度器中移除。                         |
|    `CONFIG_HZ_1000`    |       `y`      | 将内核定时器频率设置为 1000 Hz(1 ms 滴答周期)。更高的 `HZ` 值以更多定时器开销为代价提高调度粒度。 |

在正在运行的 RT 系统上验证这些选项是否生效:

```bash theme={null}
zcat /proc/config.gz | grep -E "CONFIG_PREEMPT|CONFIG_NO_HZ|CONFIG_CPUSETS"
```

预期输出:

```text theme={null}
# CONFIG_PREEMPT_NONE is not set
# CONFIG_PREEMPT_VOLUNTARY is not set
# CONFIG_PREEMPT is not set
CONFIG_PREEMPT_RT=y
CONFIG_NO_HZ_COMMON=y
CONFIG_NO_HZ_FULL=y
CONFIG_CPUSETS=y
```

## RT 与标准内核的权衡

选择 RT 内核需要接受特定的权衡:

|  **维度**  |   **标准内核**  |                      **RT 内核**                      |
| :------: | :---------: | :-------------------------------------------------: |
| 最坏情况调度延迟 | 无界(μs 到 ms) |                  有界(在调优硬件上为低 μs 级)                  |
|    吞吐量   |  更高,上下文切换更少 |                       略低,抢占点更多                      |
|    功耗    |    空闲时更低    |             更高,`NO_HZ_FULL` 使 RT 核心保持活动             |
|   调试复杂度  |     标准工具    | RT 专用工具(`cyclictest`、带 `hwlat_detector` 的 `ftrace`) |
|   使用场景   |    通用、多媒体   |                   工业控制、机器人、时间敏感网络                   |

<Note>
  所有 Qualcomm Linux 硬件平台(QCS6490、IQ-9075、IQ-8275、IQ-615)均支持 RT 内核。延迟数值取决于具体的 SoC、CPU 拓扑和所应用的调优。请始终在目标硬件上进行测量,不要仅依赖仿真结果。
</Note>

## 验证 RT 已启用

启动 RT 内核后,确认完全 RT 抢占已启用:

```bash theme={null}
# Kernel version string includes -rt suffix
uname -r
# Example: 6.18.0-rt1+

# Confirm PREEMPT_RT in the version banner
cat /proc/version

# Verify the Kconfig flag
zcat /proc/config.gz | grep CONFIG_PREEMPT_RT
# Expected: CONFIG_PREEMPT_RT=y
```
