> ## Documentation Index
> Fetch the complete documentation index at: https://dragonwingdocs-staging.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（Read-Copy-Update）回调    | 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>
  RT 内核在所有 Qualcomm Linux 硬件平台（QCS6490、IQ-9075、IQ-8275、IQ-615）上均受支持。延迟数值取决于具体的 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
```
