1. Ryzen Embedded平台与实时Linux工程导论

欢迎进入《Ryzen Embedded实时Linux工程》课程。本章不急于写代码,而是先把三件事讲清楚:我们要解决什么工程问题、Ryzen Embedded这颗处理器为什么适合做实时嵌入式、以及实时Linux在整个系统中的位置。只有把“对象—约束—路径”三者的关系理顺,后面的内核裁剪、PREEMPT_RT补丁、中断线程化、CPU隔离与延迟测量才有落脚点。

1.1 课程要解决的工程问题

嵌入式实时系统与通用服务器最大的区别在于:它不仅要“算得对”,还要“算得及时”。以工业运动控制为例,伺服环通常要求控制周期在 250 μs~1 ms 之间,周期抖动(jitter)需控制在周期的 5%~10% 以内;若某次调度延迟超过 1 ms,就可能造成位置环失稳、机械冲击甚至撞机。因此本课程的目标不是泛泛地“学Linux”,而是围绕一条可度量的指标链展开:

  • 确定性:最坏情况响应时间(WCET)可预测,而非仅看平均值;
  • 低延迟:中断到用户态实时线程的端到端延迟尽量小;
  • 可观测:能用工具量化延迟分布,而不是凭感觉判断“卡不卡”;
  • 可复现:同一配置在不同板卡、不同负载下行为一致。

课程最终交付的能力是:能在一台 Ryzen Embedded 平台上,从零搭建一套可运行、可测量、可调优的实时Linux环境,并用数据说明它是否满足给定周期与抖动指标。

1.2 Ryzen Embedded处理器家族特性

AMD Ryzen Embedded 家族基于 Zen 架构,常见型号包括 V1000、V2000、V3000 以及 R1000 系列。它们与桌面 Ryzen 同源,但面向长生命周期供货(通常 7~10 年)、更宽的温度范围与更低的功耗封装。对实时工程而言,值得关注的是以下特性:

  • 多核与SMT:V2000 系列常见 4 核 8 线程,V3000 可达 8 核。实时任务通常需要独占物理核,因此 SMT 的开关与 CPU 隔离策略直接相关。
  • 缓存层次:每核独立 L2、共享 L3。共享 L3 会带来核间干扰,是抖动的重要来源之一。
  • 内存与IO:双通道 DDR4、PCIe 3.0/4.0、集成 Radeon GPU。GPU 与显示子系统会占用内存带宽并产生中断,实时场景下常需在 BIOS 中限制或关闭。
  • 电源管理:C-State、P-State 与 CPPC 会引入频率切换延迟。实时系统通常固定频率、禁用深度 C-State。
  • 定时器与中断:HPET、TSC、Local APIC Timer 的可用性与精度,决定了时钟源选择(如 tsc 或 hpet)。

这些特性说明:Ryzen Embedded 性能充足,但“默认配置”并不实时。实时性来自对核、频率、中断、内存路径的显式约束,而不是硬件自动保证。

1.3 实时Linux在嵌入式领域的定位

实时Linux并非一个独立发行版,而是“标准Linux + 实时化改造”的组合。主流路线是 PREEMPT_RT 补丁集,它把自旋锁改为可睡眠的 rt_mutex、将中断处理线程化、并让高优先级任务可抢占几乎全部内核路径。其定位可以用一张信号链来理解:从硬件中断产生,到实时线程被唤醒并执行,中间每一段都可能引入延迟。

实时Linux中断到用户线程的延迟链 硬件中断 GPIO/PCIe/定时器 中断线程化 irq/xx-rt 内核线程 调度器唤醒 SCHED_FIFO 优先级 用户态实时线程 控制算法执行 执行完成 写回/输出 延迟来源(抖动贡献) ① 中断屏蔽窗口 ② 中断线程优先级 ③ 调度延迟 ④ 缓存/内存争用 ⑤ 频率切换 ⑥ SMI/NMI ⑦ 页错误 ⑧ 锁竞争 ⑨ 电源管理 ⑩ 热降频 观测手段 cyclictest ftrace / trace-cmd perf sched hwlatdetect

图中每一段都可能贡献微秒到毫秒级抖动。实时工程的核心工作,就是逐段识别、测量并压缩这些延迟。需要强调的是:PREEMPT_RT 提供的是“可抢占、可预测”的内核,而不是“零延迟”。它把不可控的长延迟变成可控的短延迟,最终指标仍取决于配置与调优。

1.4 整体学习路径

本课程按“环境—内核—调度—中断—内存—测量—集成”的顺序推进,共 30 章。建议的学习路径如下:

  1. 环境搭建:选择开发板(如 V2000 评估板),安装 Ubuntu 22.04 或 Yocto,确认串口、网络、SSH 可用。
  2. 内核与补丁:获取对应内核源码,应用 PREEMPT_RT 补丁,配置并编译,验证 uname -a 中出现 PREEMPT_RT。
  3. 调度与隔离:设置 isolcpus、nohz_full、rcu_nocbs,把实时线程绑定到独占核。
  4. 中断与时钟:线程化中断、设置中断亲和性、选择时钟源、禁用不需要的外设中断。
  5. 内存与IO:使用 mlockall 锁定内存、预分配缓冲区、避免实时路径上的动态分配。
  6. 测量与调优:用 cyclictest 建立基线,用 ftrace 定位尖峰,迭代优化。
  7. 系统集成:把实时任务与工业协议(EtherCAT、CANopen)或控制算法结合,形成完整闭环。

1.5 实验环境搭建示例

下面给出一个可参考的起步环境。硬件以 Ryzen Embedded V2000 评估板为例,软件以 Ubuntu 22.04 Server 为基础。以下命令为示例,实际路径与版本需按板卡手册调整。

# 1. 查看CPU与内核信息
lscpu | grep -E "Model name|CPU\(s\)|Thread"
uname -r

# 2. 安装实时测试工具
sudo apt update
sudo apt install -y rt-tests trace-cmd linux-tools-common

# 3. 建立基线:4个线程,优先级80,运行60秒
sudo cyclictest -t4 -p80 -m -n -i1000 -l60000

# 4. 查看中断分布
cat /proc/interrupts | head -20

# 5. 查看当前时钟源
cat /sys/devices/system/clocksource/clocksource0/current_clocksource

运行 cyclictest 后,重点关注输出中的 Max 列。若在空载下 Max 已超过 100 μs,说明基础配置仍有优化空间;若在负载下 Max 突增到毫秒级,则需用 ftrace 定位是哪个中断或内核路径造成。建议把每次修改后的 Max、Avg、超阈值次数记录成表,形成可追溯的调优日志。

提示:实时调优是“测量—假设—验证”的循环。不要一次改多个参数,否则无法判断哪个改动真正有效。每次只改一项,并保留 cyclictest 的完整输出。
注意:BIOS 中的 SMI、C-State、GPU 与显示输出可能产生不可屏蔽的延迟。若追求极致确定性,需在 BIOS 中关闭深度 C-State、限制 GPU 显存、并确认没有后台管理引擎周期性占用总线。

本章建立了三个基本认知:实时性是可量化的工程指标;Ryzen Embedded 提供性能基础但不自动保证实时;实时Linux的延迟来自一条可分解的链路。接下来的章节将沿着这条链路,从环境搭建开始,逐步把每个环节变成可配置、可测量、可优化的对象。