4. Ubuntu与实时内核部署

在 Ryzen Embedded 机器人控制平台上,操作系统层决定了上层运动控制、EtherCAT 主站、视觉推理能否获得稳定可预期的时基。本节围绕 Ubuntu Server 安装、AMD XDNA/NPU 驱动、PREEMPT_RT 实时补丁、CPU 隔离与调频策略,以及 cyclictest 延迟测试与优化,给出一条可落地的部署路径。需要先明确一个前提:实时性不是“越快越好”,而是“抖动越小越好”。机器人控制周期通常为 1 ms 或 250 µs,允许的最大延迟抖动往往要求控制在几十微秒量级,因此所有配置都服务于降低最坏情况延迟(worst-case latency)。

一、Ubuntu Server 安装与基础环境

推荐使用 Ubuntu Server 22.04 LTS 或 24.04 LTS,选择最小化安装,避免桌面环境引入不可控的调度与中断。安装时建议单独划分 /boot(1 GB)、/(≥64 GB)与 swap(与内存等大或关闭),并关闭自动更新,防止内核在运行中被替换。安装完成后先做三件事:更新基础包、安装编译工具链、确认 CPU 与内核版本。

sudo apt update && sudo apt install -y build-essential git bc bison flex \
  libssl-dev libelf-dev dwarves zstd cpu-checker
uname -r
lscpu | grep -E "Model name|CPU\(s\)|MHz"

对于 Ryzen Embedded 平台,BIOS 中应关闭 Global C-state Control、Core Performance Boost 与 SMT(若控制核需要独占物理核),并开启 IOMMU 以便后续设备直通。这些设置直接影响中断响应与频率抖动。

二、AMD XDNA/NPU 驱动部署

Ryzen Embedded 7000/8000 系列集成的 XDNA NPU 需要内核态 amdxdna 驱动与用户态 XRT/ONNX Runtime 支持。较新的 Ubuntu 内核(6.10+)已包含 amdxdna,可通过 modprobe 加载;若内核版本较旧,需从 AMD 官方仓库安装 DKMS 包。

sudo apt install -y linux-firmware
sudo modprobe amdxdna
lsmod | grep amdxdna
ls /dev/accel/          # 应出现 accel0
sudo apt install -y xrt xrt-plugin-amdxdna

验证 NPU 可用性时,可用 xrt-smi examine 查看设备状态,再用 ONNX Runtime 的 VitisAIExecutionProvider 跑一个 ResNet-50 推理样例,观察 /dev/accel/accel0 是否被占用。注意:NPU 驱动会注册中断,若与实时控制核共享中断线,需在后续中断亲和性配置中将其绑定到非实时核。

三、PREEMPT_RT 实时补丁配置

PREEMPT_RT 将内核中大部分自旋锁替换为可睡眠的互斥锁,使高优先级任务几乎可以在任意时刻抢占内核。部署方式有两种:直接安装 Ubuntu 官方 linux-image-rt 包,或自行打补丁编译。前者省时,后者便于裁剪。以 6.6 内核为例:

sudo apt install -y linux-image-rt-amd64 linux-headers-rt-amd64
# 或手动编译
wget https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.6.tar.xz
wget https://cdn.kernel.org/pub/linux/kernel/projects/rt/6.6/patch-6.6-rt18.patch.xz
tar -xf linux-6.6.tar.xz && cd linux-6.6
xz -dc ../patch-6.6-rt18.patch.xz | patch -p1
make olddefconfig
# 在 menuconfig 中设置:
#   General setup -> Preemption Model -> Fully Preemptible Kernel (RT)
#   Timer frequency -> 1000 Hz
make -j$(nproc) && sudo make modules_install install

重启后通过 uname -v 应看到 PREEMPT_RT 字样。此时还需关闭 CONFIG_DEBUG_PREEMPT 等调试选项,避免额外开销。实时内核下,rcu_nocbs 与 nohz_full 是降低抖动的重要启动参数,将在下一节与 CPU 隔离一起配置。

四、CPU 隔离与调频策略

机器人控制通常采用“隔离核 + 管理核”架构:将 CPU 2、3 核从通用调度器中隔离出来,专供实时任务使用;CPU 0、1 负责系统、网络与 NPU 中断。通过内核启动参数实现:

# /etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash isolcpus=2,3 nohz_full=2,3 \
  rcu_nocbs=2,3 irqaffinity=0,1 processor.max_cstate=1 intel_idle.max_cstate=0"
sudo update-grub && reboot

调频策略方面,实时核应固定为 performance,避免 ondemand 或 schedutil 在负载变化时引入频率切换延迟。管理核可保留 powersave 以降低功耗。

sudo apt install -y cpufrequtils
echo 'GOVERNOR="performance"' | sudo tee /etc/default/cpufrequtils
sudo systemctl restart cpufrequtils
cat /sys/devices/system/cpu/cpu2/cpufreq/scaling_governor  # performance

此外,将实时任务绑定到隔离核并设置 SCHED_FIFO 优先级 80,可进一步减少调度干扰。中断亲和性通过 /proc/irq/*/smp_affinity 或 irqbalance --banirq 将非实时中断全部导向 CPU 0、1。

Ryzen Embedded 实时部署:CPU 分区与信号链 CPU 0 / 1 — 管理核 irqaffinity=0,1 · powersave 系统 / 网络 / 文件 NPU 中断 / XDNA 非实时中断全部导向此区,避免干扰控制核 CPU 2 / 3 — 隔离核 isolcpus=2,3 · nohz_full · performance SCHED_FIFO 80 EtherCAT 主站 1 ms 控制周期 · 抖动目标 < 50 µs 数据/指令 PREEMPT_RT 内核层 自旋锁 → 可睡眠互斥锁 · 中断线程化 · 高优先级任务可抢占内核任意位置 启动参数:rcu_nocbs=2,3 · processor.max_cstate=1 · 关闭 DEBUG_PREEMPT cyclictest 验证 cyclictest -t4 -p80 -n -i1000 -l100000 -a2,3 → 观察 Max Latency 判断依据:Max < 50 µs 合格;若 > 100 µs 需检查中断亲和性与 C-state

五、cyclictest 延迟测试与优化

部署完成后必须用 cyclictest 量化验证。典型命令如下,在隔离核 2、3 上以 SCHED_FIFO 优先级 80 运行 4 个线程,周期 1 ms,共 10 万次:

sudo cyclictest -t4 -p80 -n -i1000 -l100000 -a2,3 -h400 -q
# 输出示例(教学假设值):
# T: 0 ( 1234) P:80 I:1000 C: 100000 Min:  2 Act:  3 Avg:  4 Max:  28
# T: 1 ( 1235) P:80 I:1000 C: 100000 Min:  2 Act:  4 Avg:  5 Max:  31
# T: 2 ( 1236) P:80 I:1000 C: 100000 Min:  3 Act:  3 Avg:  5 Max:  35
# T: 3 ( 1237) P:80 I:1000 C: 100000 Min:  2 Act:  4 Avg:  6 Max:  42

判断标准:Max 值应小于控制周期的 5%。若 1 ms 周期,Max 应低于 50 µs。若出现 100 µs 以上的尖峰,按以下顺序排查:

  • 确认 isolcpus 与 nohz_full 已生效:cat /proc/cmdline。
  • 检查中断亲和性:cat /proc/interrupts,确保隔离核上无外部中断。
  • 关闭 C-state 与频率调节:cpupower idle-info 确认 max_cstate=1。
  • 禁用 irqbalance 或将其排除隔离核。
  • 检查 SMI(系统管理中断):sudo apt install msr-tools,用 rdmsr 0x34 观察 SMI 计数是否增长。

进一步优化可启用 threadirqs 强制中断线程化,并将实时任务的中断线程优先级设为 90 以上;同时用 chrt -f 80 绑定控制进程,配合 taskset -c 2,3 固定 CPU 亲和性。若使用 EtherCAT,还需将网卡中断绑定到管理核,并启用 PTP 硬件时间戳。

建议将上述启动参数、调频策略与 cyclictest 命令固化为部署脚本,每次内核更新后重新执行一次延迟测试,形成可追溯的实时性基线。

完成本节配置后,平台应达到:隔离核上 1 ms 周期任务的最坏延迟稳定在 50 µs 以内,NPU 推理与实时控制互不干扰,为后续运动控制与视觉闭环提供可靠的时基保障。