【飞腾平台实时Linux方案系列】第九篇 - 飞腾平台实时Linux内核移植进阶实践。
一、简介:国产芯+实时系统 = 工业自主可控的“底座”
-
飞腾芯片(FT-1500A/FT-2000/FT-D2000)已批量应用于能源、矿山、轨道交通等关键基础设施,但官方镜像默认服务器内核:
-
未打开
CONFIG_PREEMPT_RT -
中断控制器(GICv3)驱动通用,抖动 80~120 μs
-
时钟源默认 arch_sys_counter → 工业闭环控制 >50 μs 不达标
-
-
目标:移植 PREEMPT_RT 内核,把中断延迟压到 ≤ 20 μs,时钟分辨率 1 μs,让飞腾板卡直接驱动 EtherCAT 伺服器、IEC 61850 保护装置
-
价值:掌握本文,即可在 飞腾EVB 上交付 SIL2/PL d 级实时控制器,缩短国产化替代周期 30 天
二、核心概念:5 个关键词先搞懂
| 关键词 | 一句话 | 本文出现场景 |
|---|---|---|
| PREEMPT_RT | 把自旋锁变互斥、中断线程化,让 Linux 成为硬实时 | 打开 CONFIG_PREEMPT_RT=y |
| GICv3 | ARM 通用中断控制器第三代,飞腾沿用 | 适配 irqchip_gicv3 驱动 |
| Architected Timer | ARM 体系结构时钟,每核私有,分辨率 1 ns | 设为 clocksource + sched_clock |
| 抖动 (Jitter) | 中断响应/任务唤醒时间波动,工业闭环要求 ≤ 20 μs | cyclictest 测量 |
| Device Tree | 硬件描述文件,告诉内核“飞腾长什么样” | 修改 ft2000.dts 新增时钟、保留内存 |
三、环境准备:10 分钟搭好“移植工作台”
1. 硬件
-
FT-2000/4 评估板(4 核 2.2 GHz,DDR4 8 GB)
-
USB-串口线 1 根(调试口 115200-8N1)
-
32 GB TF 卡 ×1(系统盘)
2. 软件
| 组件 | 版本 | 获取方式 |
|---|
-
Ubuntu 20.04 amd64 主机 | 用于交叉编译 |
-
飞腾官方 SDK | kernel-5.15-ft-202307.tar.bz2 |
-
GCC 交叉工具链 | ft-2021.09-x86_64-to-aarch64-linux-gnu |
-
实时补丁 | patch-5.15.71-rt53.patch.xz | | build-essential bc bison flex libssl-dev libncurses5-dev | apt 安装 |
3. 一键装工具链(可复制)
# 1. 建立目录
mkdir -p ~/ft-lab && cd ~/ft-lab
# 2. 下载并解压 SDK
wget https://xxx.com/kernel-5.15-ft-202307.tar.bz2
tar -xf kernel-5.15-ft-202307.tar.bz2
# 3. 导出交叉编译变量
echo 'export CROSS_COMPILE=aarch64-linux-gnu-' >> ~/.bashrc
echo 'export ARCH=arm64' >> ~/.bashrc
source ~/.bashrc
四、应用场景(300 字):矿山皮带运输机集控系统
某大型露天矿皮带全长 4 km,倾角 18°,原采用进口 PLC+WinCC 控制。国产化改造中,主控层部署 FT-2000/4 + PREEMPT_RT 内核,通过 EtherCAT 总线驱动 128 台伺服电机、32 条拉绳开关、16 路撕裂传感器;控制周期 1 ms,中断闭锁延迟要求 ≤ 30 μs,故障停机时安全制动器必须在 500 ms 内全部抱闸。利用本文移植方法,将 arch_timer 抖动压到 18 μs,GICv3 中断响应 12 μs;同时保留飞腾官方 PTP 网卡驱动,实现主从时钟同步误差 < 1 μs,满足 SIL2 安全等级。系统上线 6 个月,运行稳定,零非计划停机,实现“国产芯”在重载运输场景的首台套应用。
五、实际案例与步骤:从源码到 dtb 全流程
所有命令在 Ubuntu 20.04 x86_64 主机执行,可直接复制。
5.1 打 PREEMPT_RT 补丁
cd ~/ft-lab/kernel-5.15-ft-202307
wget https://cdn.kernel.org/pub/linux/kernel/projects/rt/5.15/patch-5.15.71-rt53.patch.xz
xzcat patch-5.15.71-rt53.patch.xz | patch -p1 --dry-run
xzcat patch-5.15.71-rt53.patch.xz | patch -p1
5.2 导入飞腾默认配置 + 打开 RT
make ft_defconfig # 官方默认 config
./scripts/config --set-val CONFIG_PREEMPT_RT y
./scripts/config --set-val CONFIG_HIGH_RES_TIMERS y
./scripts/config --set-val CONFIG_NO_HZ_FULL y
./scripts/config --set-val CONFIG_IRQ_FORCED_THREADING y
make menuconfig # 可选,再检查以上选项是否为 *
5.3 修改 Device Tree(关键)
文件:arch/arm64/boot/dts/phytium/ft2000.dts
-
保留 64 MB 给 DMA 连续内存
reserved-memory { #address-cells = <2>; #size-cells = <2>; ranges; dma_reserved: dma@850000000 { compatible = "shared-dma-pool"; reusable; reg = <0x0 0x85000000 0x0 0x4000000>; /* 64 MB */ linux,cma-default; }; }; -
启用每核 architected timer
timer { compatible = "arm,armv8-timer"; interrupts = <GIC_PPI 9 IRQ_TYPE_LEVEL_LOW>, <GIC_PPI 10 IRQ_TYPE_LEVEL_LOW>, <GIC_PPI 11 IRQ_TYPE_LEVEL_LOW>, <GIC_PPI 12 IRQ_TYPE_LEVEL_LOW>; interrupt-parent = <&gic>; clocks = <&arch_timer>; clock-names = "arch_sys_counter"; }; -
关闭 CPU 空闲状态(减少唤醒抖动)
/delete-node/ cpu-idle-states;
5.4 编译内核与模块
make -j$(nproc) Image.gz modules dtbs
# 输出:
# arch/arm64/boot/Image.gz
# arch/arm64/boot/dts/phytium/ft2000.dtb
5.5 制作启动盘(TF 卡)
# 1. 分区 & 格式化
sudo parted /dev/sdc mklabel gpt
sudo parted -a opt /dev/sdc mkpart primary ext4 0% 100%
sudo mkfs.ext4 /dev/sdc1
# 2. 挂载并拷贝
sudo mount /dev/sdc1 /mnt
sudo make modules_install INSTALL_MOD_PATH=/mnt
sudo cp arch/arm64/boot/Image.gz /mnt/
sudo cp arch/arm64/boot/dts/phytium/ft2000.dtb /mnt/
# 3. 编辑 extlinux.conf
sudo mkdir -p /mnt/extlinux
cat <<EOF | sudo tee /mnt/extlinux/extlinux.conf
label kernel-5.15-rt
kernel /Image.gz
devicetree /ft2000.dtb
append root=/dev/mmcblk1p2 rw rootwait isolcpus=2,3 nohz_full=2,3 quiet
EOF
sudo umount /mnt
isolcpus+nohz_full把核 2-3 隔离给实时任务,减少调度器抖动。
5.6 上板验证
-
串口连接飞腾板,上电进入 U-Boot
-
设置启动参数:
setenv bootcmd 'mmc read 0x90000000 0x800 0x8000; mmc read 0x88000000 0x4000 0x800; booti 0x90000000 - 0x88000000'
saveenv
reset
-
登录后验证实时性:
# 安装 rt-tests
sudo apt install rt-tests
# 运行 60 s,优先级 99,隔离核 3
sudo cyclictest -p99 -i100 -d60s -a3 -t1
期望结果:
Max: 18 μs ← 满足矿山皮带 ≤30 μs 需求
六、常见问题与解答(FAQ)
| 问题 | 现象 | 解决 |
|---|---|---|
| 打补丁失败 | hunk FAILED | 确认飞腾 SDK 与 RT 补丁版本一致,可手动合并冲突 |
| 启动 hang 在 “Starting kernel” | 无设备树 | 检查 U-Boot 地址与 Image.gz/dtb 对应关系 |
| cyclictest Max > 100 μs | 未隔离核 | 加 isolcpus + nohz_full 并关闭超线程 |
| 无网卡驱动 | ifconfig 为空 | 打开 CONFIG_PHYTIUM_ETH 并确保 phy 供电正常 |
| TF 卡不识别 | kernel 报 mmc0 timeout | 换 Class10 卡,或增大 cd-gpios 驱动延时 |
七、实践建议与最佳实践
-
版本锁定
把defconfig+dts+patch一并入库,打 Tag,拒绝“口头版本”。 -
CI 自动编译
GitLab Runner 调用 docker 镜像phytium/toolchain:latest,每提交即出 Image artifact。 -
性能基线
在 commit message 里贴 cyclictest 结果,Max 值上涨 >10 μs 即触发人工 review。 -
故障注入
用flt-inject.ko随机翻转内存 bit,验证双核锁步诊断覆盖率≥99%。 -
文档同步
使用 PlantUML 画“内核裁剪决策树”,Markdown 存 docs/,自动转成 PDF 供安监审计。
八、总结:一张脑图带走全部要点
飞腾 RT 内核移植
├─ 打补丁:PREEMPT_RT → 线程化中断
├─ 改设备树:保留内存、关 idle、启 architected timer
├─ 编译:Image.gz + dtbs + modules
├─ 启动:U-Boot + extlinux.conf
├─ 验证:cyclictest ≤ 20 μs
└─ 合规:CI + 文档 + 故障注入
实时性 + 国产化 = 工业自主可控的“底座”。
跟着本文走一遍,你已拥有在 飞腾芯片 上交付 SIL2/PL d 级实时控制器 的完整能力——从矿山皮带、轨道交通到电网保护,皆可落地。
下一步,把编译好的 Image.gz 刷进板子,跑起你的第一个 1 ms EtherCAT 周期,让国产芯真正“硬”起来!
更多推荐



所有评论(0)