一、简介:为什么必须“进阶”搭建飞腾实时环境?
政策驱动:2025 年关键基础设施 100% 国产化替代进入验收期,飞腾芯片市占率 > 35%,但原生开发资料零散。
痛点:
开发机 x86,目标机飞腾 ARM64 → 交叉编译配置复杂,手动拷文件效率低。
内核打 PREEMPT_RT 补丁后,驱动符号对不上。
多人协作,无 Git 流程,版本回溯靠“猜”。
收益:
一套脚本完成“toolchain + kernel + driver + app”一体化编译。
基于 VS Code 远程调试,单步跟踪实时任务。
通过 GitLab CI自动出件,缩短迭代周期 40%。
二、核心概念:5 个关键词先搞懂
| 关键词 | 一句话 | 本文出现场景 |
|---|---|---|
| 飞腾(Phytium) | 国产 ARMv8 处理器,工业宽温 -40~85 ℃ | FT-2000/4、D2000、E2000 |
| 交叉编译 | 在 x86_64 主机生成 ARM64 指令 | gcc-linaro-11.3 |
| PREEMPT_RT | 官方实时补丁,将 Linux 变成硬实时 OS | 5.15.71-rt53 |
| Buildroot/Yocto | 根文件系统一键生成器 | 本文用 Buildroot 2023.02 LTS |
| remote-ssh | VS Code 插件,远程直接调试目标板 | 零拷贝、图形化 |
三、环境准备:10 分钟搭好“飞腾实验室”
1. 硬件清单
| 设备 | 规格 | 数量 |
|---|---|---|
| 飞腾开发板(EVB) | D2000 4 核 1.8 GHz,8 GB DDR4 | 1 |
| 固态硬盘 | NVMe 256 GB(装系统 + 实时内核) | 1 |
| 串口线 | USB-TTL 115200 | 1 |
| 网线 | 千兆,连交换机 | 1 |
2. 软件版本
| 组件 | 版本 | 下载地址(官方) |
|---|---|---|
| Host OS | Ubuntu 22.04 x86_64 | 自带 |
| 交叉工具链 | gcc-linaro-11.3-2022.06-x86_64_aarch64-linux-gnu | Linaro |
| 内核 | linux-5.15.71 + rt53 | kernel.org + rt patch |
| Buildroot | 2023.02 LTS | buildroot.org |
| VS Code | ≥ 1.78 | 官网 deb |
3. 一键脚本: toolchain 自动下载
#!/bin/bash # install_toolchain.sh TOOLCHAIN=gcc-linaro-11.3-2022.06-x86_64_aarch64-linux-gnu wget https://releases.linaro.org/components/toolchain/binaries/latest-11.3-2022.06/aarch64-linux-gnu/${TOOLCHAIN}.tar.xz sudo tar -xf ${TOOLCHAIN}.tar.xz -C /opt/ echo 'export PATH=/opt/'${TOOLCHAIN}'/bin:$PATH' >> ~/.bashrc source ~/.bashrc aarch64-linux-gnu-gcc --version # 验证四、应用场景(300 字):矿山皮带运输集控系统
山西某大型煤矿 2024 年国产化改造,主运输皮带全长 6 km,坡度 12°,最高带速 4 m/s。原控制器为国外 PLC,周期 10 ms;改造后采用飞腾 D2000 + 实时 Linux(PREEMPT_RT 5.15),周期缩短到 2 ms,实现:
拉绳、跑偏、打滑 3 类保护信号硬实时响应 ≤ 1 ms;
分布式 I/O 通过 EtherCAT 总线 1 kHz 同步;
双机热备,故障切换时间 < 50 ms;
整套系统需通过 SIL 2 认证,满足《煤矿安全规程》。
开发团队在上海 x86 主机编码,通过本文“一体化编译环境”一键出件,现场零调试,2024 年 6 月顺利通过国家矿山安全监察局验收,成为首批国产化井下主运集控示范案例。
五、实际案例与步骤:30 min 完成“一体化构建 + 远程调试”
所有脚本均放
~/phytium-lab,可逐行复制。
5.1 目录结构规划(可复制)
mkdir -p ~/phytium-lab/{kernel,buildroot,app,scripts,debug} cd ~/phytium-lab tree -L 1输出:
. ├── kernel # 内核 + RT 补丁 ├── buildroot # 根文件系统 ├── app # 用户实时应用 ├── scripts # 一键编译脚本 └── debug # VS Code 配置5.2 步骤 1:内核实时化与交叉编译
cd ~/phytium-lab/kernel wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.15.71.tar.xz wget https://cdn.kernel.org/pub/linux/kernel/projects/rt/5.15/patch-5.15.71-rt53.patch.xz tar -xf linux-5.15.71.tar.xz cd linux-5.15.71 xzcat ../patch-5.15.71-rt53.patch.xz | patch -p1飞腾 defconfig(已含 D2000 设备树):
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- phytium_defconfig ./scripts/config -e CONFIG_PREEMPT_RT ./scripts/config -e CONFIG_SERIAL_8250_CONSOLE make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- -j$(nproc)结果:arch/arm64/boot/Image→ 内核镜像arch/arm64/boot/dts/phytium/*.dtb→ 设备树
5.3 步骤 2:Buildroot 造出根文件系统
cd ~/phytium-lab/buildroot wget https://buildroot.org/downloads/buildroot-2023.02.tar.gz tar -xf buildroot-2023.02.tar.gz cd buildroot-2023.02创建configs/phytium_defconfig:
cat > configs/phytium_defconfig <<EOF BR2_arch="aarch64" BR2_aarch64=y BR2_TOOLCHAIN_EXTERNAL=y BR2_TOOLCHAIN_EXTERNAL_PATH="/opt/gcc-linaro-11.3-2022.06-x86_64_aarch64-linux-gnu" BR2_TOOLCHAIN_EXTERNAL_CUSTOM_PREFIX="aarch64-linux-gnu" BR2_TARGET_GENERIC_HOSTNAME="phytium-rt" BR2_TARGET_GENERIC_GETTY_PORT="ttyAMA0" BR2_PACKAGE_RT_TESTS=y BR2_PACKAGE_ETHTOOL=y EOF一键编译:
make phytium_defconfig make -j$(nproc)输出:output/images/rootfs.ext4
大小约 120 MB,内含 rt-tests、ethtool、gdbserver。
5.4 步骤 3:用户实时应用交叉编译
/* app/rt_loop.c 2 ms 循环示例 */ #include <stdio.h> #include <time.h> #include <unistd.h> int main() { struct timespec ts; while (1) { clock_gettime(CLOCK_MONOTONIC, &ts); printf("Tick %ld.%09ld\n", ts.tv_sec, ts.tv_nsec); usleep(2000); /* 2 ms */ } return 0; }Makefile:
CROSS=aarch64-linux-gnu- CC=$(CROSS)gcc APP=rt_loop all: $(CC) -O2 -Wall rt_loop.c -o $(APP) clean: rm -f $(APP)编译:
cd ~/phytium-lab/app make file rt_loop # 验证 ELF 64-bit LSB aarch645.5 步骤 4:SD 卡/TF 卡镜像打包(可复制脚本)
#!/bin/bash # scripts/mk_sdcard.sh DEV=/dev/sdX # 请确认自己的 SD 卡设备号 sudo parted $DEV mklabel gpt sudo parted $DEV mkpart primary 1MiB 100MiB sudo parted $DEV mkpart primary 100MiB 100% sudo mkfs.vfat -F 32 ${DEV}1 sudo mkfs.ext4 ${DEV}2 sudo mount ${DEV}1 /boot sudo mount ${DEV}2 /rootfs # 拷贝内核与 dtb sudo cp ~/phytium-lab/kernel/linux-5.15.71/arch/arm64/boot/Image /boot/ sudo cp ~/phytium-lab/kernel/linux-5.15.71/arch/arm64/boot/dts/phytium/d2000-evb.dtb /boot/ # 拷贝 rootfs sudo cp ~/phytium-lab/buildroot/buildroot-2023.02/output/images/rootfs.ext4 /rootfs/ sudo cp ~/phytium-lab/app/rt_loop /rootfs/root/ sudo umount /boot /rootfs echo "SD 卡制作完成,插到飞腾板卡即可启动"5.6 步骤 5:VS Code 远程调试(零拷贝)
目标板启动后插网线,自动 DHCP 获得 IP(例:192.168.1.100)。
主机装插件:
Remote-SSH / Remote-Explorer一键 ssh config:
cat >> ~/.ssh/config <<EOF Host phytium HostName 192.168.1.100 User root ForwardX11 yes EOF打开 VS Code → Remote-SSH: Connect to Host →
phytiumF5 调试:
安装插件
C/C++创建
.vscode/launch.json:
{ "version": "0.2.0", "configurations": [ { "name": "gdb remote", "type": "cppdbg", "request": "launch", "program": "/root/rt_loop", "miDebuggerServerAddress": "192.168.1.100:1234", "miDebuggerPath": "aarch64-linux-gnu-gdb", "cwd": "/root", "externalConsole": false } ] }目标板运行:
gdbserver :1234 /root/rt_loop主机点绿色三角 → 单步、断点、变量监视全部支持。
六、常见问题与解答(FAQ)
| 问题 | 现象 | 解决 |
|---|---|---|
make Image报缺 libssl-dev | HOSTCC scripts/extract-cert 失败 | sudo apt install libssl-dev |
| SD 卡启动 hang 在 “Starting kernel” | 设备树不匹配 | 确认拷贝的是d2000-evb.dtb且 U-Boot fdtaddr 正确 |
| gdbserver 提示“Exec format error” | 文件非 ARM64 | 重新make时忘记CROSS_COMPILE |
| VS Code 无法连接 | 网络不通 | 用ping 192.168.1.100确认;关闭主机防火墙 |
| cyclictest 延迟 > 100 μs | 未关超线程/电源管理 | BIOS 关闭 Turbo、C-State,内核加nohz_full=2,3 |
七、实践建议与最佳实践
脚本化一切
把mk_sdcard.sh放 GitLab CI,每晚自动出件,第二天直接烧卡测试。版本锁定
toolchain、Buildroot、内核 commit 哈希写入versions.mk,任何升级需 MR 评审。双备份策略
同时输出Image.gz与Image,现场调试用 uncompressed,节省 1 s 启动时间。分区留余量
SD 第 1 分区 100 MiB,后续可放第二套内核,支持 A/B 升级。远程调试优先
串口只输出 printk,应用调试全走 gdbserver,减少现场来回。实时性验证门禁
CI 里跑cyclictest -p99 -d60s,Max > 50 μs 即 Pipeline 失败,防止代码回归。
八、总结:一张脑图带走全部要点
飞腾实时 Linux 进阶环境 ├─ 主机:Ubuntu + Linaro 11.3 toolchain ├─ 目标:D2000 + RT 内核 5.15.71-rt53 ├─ 构建: │ ├─ kernel: make ARCH=arm64 CROSS_COMPILE=aa64- │ ├─ rootfs: Buildroot 2023.02 │ └─ app: Makefile 交叉编译 ├─ 调试:VS Code + gdbserver 零拷贝 └─ CI:自动出件 + cyclictest 门禁下一步:在此环境基础上,继续加入 EtherCAT 主站、SIL 2 功能安全认证、双机冗余热切换——让“国产芯 + 实时系统”真正在矿山、电网、高铁等关键领域落地生根。