news 2026/4/2 17:04:49

【飞腾平台实时Linux方案系列】第九篇 - 飞腾平台实时Linux内核移植进阶实践。

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【飞腾平台实时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
GICv3ARM 通用中断控制器第三代,飞腾沿用适配irqchip_gicv3驱动
Architected TimerARM 体系结构时钟,每核私有,分辨率 1 ns设为clocksource+sched_clock
抖动 (Jitter)中断响应/任务唤醒时间波动,工业闭环要求 ≤ 20 μscyclictest 测量
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

  1. 保留 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; }; };
  2. 启用每核 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"; };
  3. 关闭 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 上板验证

  1. 串口连接飞腾板,上电进入 U-Boot

  2. 设置启动参数:

setenv bootcmd 'mmc read 0x90000000 0x800 0x8000; mmc read 0x88000000 0x4000 0x800; booti 0x90000000 - 0x88000000' saveenv reset
  1. 登录后验证实时性:

# 安装 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驱动延时

七、实践建议与最佳实践

  1. 版本锁定
    defconfig+dts+patch一并入库,打 Tag,拒绝“口头版本”。

  2. CI 自动编译
    GitLab Runner 调用 docker 镜像phytium/toolchain:latest,每提交即出 Image artifact。

  3. 性能基线
    在 commit message 里贴 cyclictest 结果,Max 值上涨 >10 μs 即触发人工 review。

  4. 故障注入
    flt-inject.ko随机翻转内存 bit,验证双核锁步诊断覆盖率≥99%。

  5. 文档同步
    使用 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 周期,让国产芯真正“硬”起来!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/15 8:49:26

终极指南:5分钟掌握btop系统监控工具完整使用技巧

终极指南&#xff1a;5分钟掌握btop系统监控工具完整使用技巧 【免费下载链接】btop A monitor of resources 项目地址: https://gitcode.com/GitHub_Trending/bt/btop 还在为复杂的系统监控工具烦恼吗&#xff1f;btop作为一款现代化的资源监控利器&#xff0c;用直观的…

作者头像 李华
网站建设 2026/4/2 11:55:54

终极显卡性能调优:NVIDIA Profile Inspector完全使用指南

终极显卡性能调优&#xff1a;NVIDIA Profile Inspector完全使用指南 【免费下载链接】nvidiaProfileInspector 项目地址: https://gitcode.com/gh_mirrors/nv/nvidiaProfileInspector 你是否曾经为游戏画面卡顿、响应延迟而困扰&#xff1f;是否觉得显卡的默认设置无法…

作者头像 李华
网站建设 2026/4/1 19:16:44

3个实用技巧,让OpenCode终端AI助手成为你的编程好伙伴

3个实用技巧&#xff0c;让OpenCode终端AI助手成为你的编程好伙伴 【免费下载链接】opencode 一个专为终端打造的开源AI编程助手&#xff0c;模型灵活可选&#xff0c;可远程驱动。 项目地址: https://gitcode.com/GitHub_Trending/openc/opencode 还在为复杂的开发环境…

作者头像 李华
网站建设 2026/3/27 12:55:29

Python字节码逆向终极指南:使用Decompyle++快速恢复源代码

Python字节码逆向终极指南&#xff1a;使用Decompyle快速恢复源代码 【免费下载链接】pycdc C python bytecode disassembler and decompiler 项目地址: https://gitcode.com/GitHub_Trending/py/pycdc 如果你曾经遇到过需要分析已编译的Python字节码文件&#xff08;.p…

作者头像 李华