一、简介:国产芯 + 硬实时 = 自主可控的“工业底座”

  • 飞腾CPU:ARMv8 架构,FT-2000/4、D2000、腾云 S5000C,已在变电站、矿用防爆机车、地铁信号系统批量装机。

  • 痛点:官方内核仅开启 CONFIG_PREEMPT,在 100 μs 级硬实时场景(伺服控制、保护继电器)抖动超标。

  • 目标:基于官方飞腾 SDK,打上 PREEMPT_RT 补丁,解决 NUMA 调度延迟,输出 ≤ 50 μs 的工业证书级参数包。

掌握本文技能,即可:

  • 让国产控制器的 cycle-time 从 1 ms 缩到 250 μs,同等性能下硬件成本降 30%。

  • 通过 SIL/PL 认证时, auditor 要求的“实时性报告”直接复用 cyclictest 数据。


二、核心概念:5 个关键词先搞懂

关键词 一句话 飞腾平台注意
PREEMPT_RT 将自旋锁、中断、工作队列等改为可抢占,降低延迟 需 ARM64 专用补丁
NUMA 多核访问本地/远端内存速度不同,调度不当 → 延迟抖动 飞腾 D2000 为 2 NUMA 节点
cyclictest 实时延迟基准工具,测“timer → 线程唤醒”最大时间 本文指定 -p95 -i200 -d600s
硬实时 任何情况下延迟 ≤ 死线(如 50 μs),否则系统失效 工业控制 SIL 2 常见指标
锁步 (Lock-Step) 双核执行相同指令,硬件级比较,用于安全认证 飞腾部分型号支持,需内核使能

三、环境准备:10 分钟搭好“飞腾 + RT”工作台

1. 硬件

  • 飞腾 FT-2000/4 工控板(2 × NUMA 节点)

  • DDR4 8 GB+,NVMe 128 GB(装系统 + 日志)

  • 串口线 1 根(115200,8N1)→ 查看 U-Boot & 内核日志

2. 软件

组件 版本 获取方式
  • 官方 SDK 内核:linux-5.10.0-ft | 飞腾 GitLab |

  • RT 补丁:patch-5.10.162-rt77.patch.xz | kernel.org/rt |

  • 交叉编译器:gcc-linaro-11.3-aarch64-linux-gnu | 官网解压即用 |

  • 测试工具:rt-tests 2.4 | apt install rt-tests(板内) |

3. 一键打补丁脚本(可复制)

#!/bin/bash
# apply_rt.sh
set -e
KERNEL=linux-5.10.0-ft
RT_PATCH=patch-5.10.162-rt77.patch.xz
wget https://mirrors.edge.kernel.org/pub/linux/kernel/projects/rt/5.10/${RT_PATCH}
tar -xf ${KERNEL}.tar.gz
cd ${KERNEL}
xzcat ../${RT_PATCH} | patch -p1 --dry-run > ../rt-check.log
xzcat ../${RT_PATCH} | patch -p1
echo "RT patch applied OK"

四、应用场景:能源变电站间隔控制单元(300 字示例)

某 500 kV 变电站间隔控制单元采用飞腾 D2000 + 国产实时 Linux 方案,每 250 μs 完成一次电流采样与保护算法运算,硬实时死线 300 μs。系统需通过 IEC 61850-9-2LE 采样值报文同步输出,误差 ≤ 1 μs。
未优化前,NUMA 调度导致定时器线程在远端节点运行,最大延迟 180 μs,偶发超标跳闸。
按本文配置开启 PREEMPT_RT、绑定 NUMA 本地核、关闭 C-State 后,cyclictest 最大延迟 38 μs,连续 24 h 无超标;同步通过 SIL 2 认证,取得 TÜV 报告,现场已稳定运行 18 个月,实现“国产芯+国产系统”在超高压场景首套应用。


五、实际案例与步骤:从源码到延迟报告

5.1 配置内核(关键选项逐行解释)

make ft_defconfig          # 飞腾默认配置
./scripts/config -e CONFIG_PREEMPT_RT
./scripts/config -e CONFIG_LOCKDEP
./scripts/config -e CONFIG_DEBUG_PREEMPT
./scripts/config -d CONFIG_CPU_IDLE      # 关闭深空状态
./scripts/config -d CONFIG_SUSPEND
./scripts/config -e CONFIG_NUMA_BALANCE  # 保持开启,后续手动绑核对比
make -j$(nproc) Image dtbs

说明

  • 关闭 CPU_IDLE 可消除 C-State 唤醒延迟 20-40 μs。

  • 保留 NUMA_BALANCE 是为了先测“默认”再测“绑核”,形成对比数据。

5.2 内核启动参数优化

编辑 /etc/default/grub

GRUB_CMDLINE_LINUX="quiet splash isolcpus=2,3 nohz_full=2,3 rcu_nocbs=2,3 \
                    processor.max_cstate=1 intel_idle.max_cstate=0 \
                    numa_balancing=disable"
  • isolcpus:把核 2-3 隔离给实时任务

  • nohz_full:减少定时器_tick 到 1 Hz

  • numa_balancing=disable:防止运行时乱迁核

更新 grub 并重启:

sudo update-grub
sudo reboot

5.3 编译 rt-tests(板内原生)

git clone git://git.kernel.org/pub/linux/utils/rt-tests/rt-tests.git
cd rt-tests
make
sudo make install

5.4 运行 cyclictest(3 种负载)

负载 命令 说明
空载 sudo cyclictest -p95 -m -Sp90 -i200 -d600s -n 基准
CPU 压力 stress-ng --cpu 4 & 同上 测 CPU 抢占
I/O 压力 dd if=/dev/nvme0n1 of=/dev/null bs=1M & 同上 测 DMA 影响

空载结果(示例)

T: 0 ( 1998) P:95 I:200 C: 3000000 Min: 8 Act: 14 Avg: 15 Max: 38

CPU+IO 双压测

Max: 46 μs

< 50 μs → 满足硬实时要求。

5.5 自动生成 PDF 报告(可交给 auditor)

#!/bin/bash
# gen_report.sh
LOG=cyclictest-$(date +%F).log
cyclictest -p95 -m -Sp90 -i200 -d600s -n > $LOG
python3 rt-tests/tools/hist2pdf.py $LOG   # 生成直方图 + 统计页

输出 report.pdf 含:延迟直方图、最大值、标准差、测试环境照片。


六、常见问题与解答(FAQ)

问题 现象 解决
打补丁失败 hunk FAILED 确认 SDK 内核版本与 RT 补丁小版本完全一致
cyclictest Max > 100 μs 偶发 120 μs BIOS 未关 Turbo & C6;processor.max_cstate=1 加启动参数
isolcpus 后任务仍漂移 numa_balancing 启用 加 numa_balancing=disable
无 JTAG 如何注入故障 难以模拟内存翻转 用 flt-inject.ko 内核模块软注入
认证 auditor 不认可 self-test 需第三方见证 邀请 TÜV 现场目击测试,签字封存日志

七、实践建议与最佳实践

  1. BIOS 第一,内核第二
    先关 Turbo、C-State、Spread-Spectrum,再谈 RT 补丁。

  2. “空载→CPU→IO→网络”四阶梯测试
    形成梯度报告, auditor 一眼看懂系统余量。

  3. 绑定 NUMA 本地核
    taskset -c 2,3 ./your_rt_app 减少 30% 延迟抖动。

  4. Git 标签管理 kernel config
    每改 1 个选项 → commit,回滚/对比 diff 秒级完成。

  5. 故障注入常态化
    每月随机抽 1 天注入内存翻转 + 网络丢包,验证系统自愈。

  6. 维持证书连续性
    内核升级后须重新跑 cyclictest,提交《变更影响分析》给机构备案。


八、总结:一张脑图带走全部要点

飞腾 PREEMPT_RT 优化
├─ 打补丁:官方 SDK + rt77
├─ 配内核:PREEMPT_RT, 关 C-State
├─ 调启动:isolcpus + nohz_full
├─ 测延迟:cyclictest 四阶梯
├─ 出报告:hist2pdf → PDF
└─ 过认证:TÜV / CQC 现场目击

国产芯 + 硬实时 ≠ 口号,而是今天就能动手验证的事实。
把这篇脚本跑一遍,你将得到:

  • 一份 ≤ 50 μs 的延迟报告

  • 一张 auditor 认可的 PDF 证书素材

  • 一条可复制的“国产控制器安全生命周期”流水线

立刻 git clone 飞腾 SDK,打补丁、编译、跑 cyclictest,让“自主可控”从标语变成你的实验数据!

Logo

更多推荐