一、简介:轨道信号不能“卡”,飞腾+实时Linux来兜底
行业痛点
列车速度 350 km/h,信号控制周期要求 ≤ 50 ms;超时即触发“紧急制动”,晚点 5 分钟 = 数十万经济损失。
传统裸机方案扩展性差,新增 AI 视觉检障难落地。
国产化趋势
发改委明确 2025 年关键基础设施芯片自主率 ≥ 75%。
飞腾 FT-2000/4 已用于 CTCS-3(中国列车控制系统),生态成熟。
方案价值
用飞腾+PREEMPT_RT 替代进口 x86+VxWorks,成本降 40%,供应链安全可控。
一套硬件同时跑信号逻辑 + 视频分析,减少车载机笼数量。
二、核心概念:5 个关键词先搞懂
| 关键词 | 一句话 | 本文出现场景 |
|---|---|---|
| CTCS | 中国列车控制系统等级 1-4,级别越高闭塞越密 | 本文以 CTCS-2 为演示 |
| IEC 61375 | 列车通信网络(TCN)标准,MVB+以太网 | 实时通信协议栈 |
| 安全完整性等级 (SIL) | EN 50128 分 SIL 1-4,信号控制需 SIL 2 | 定级 & 测试依据 |
| 飞腾 FT-2000/4 | 4 核 Armv8,主频 2.2 GHz,工业级 -40 ℃ ~ +85 ℃ | 目标芯片 |
| PREEMPT_RT | Linux 实时补丁,中断线程化,优先级继承 | 提供 < 100 μs 延迟 |
三、环境准备:10 分钟搭好“轨道实验室”
1. 硬件清单
| 模块 | 型号/规格 | 备注 |
|---|---|---|
| 核心板 | 飞腾 FT-2000/4 工业版 | 4×A76,2.2 GHz |
| 载板 | 自研或商购 FMC/PCIe 载板 | 带 2×MVB + 2×GbE |
| 存储 | 32 GB eMMC + 8 GB DDR4 | 工业级 -40 ℃ |
| 电源 | 110 V DC 车载输入 | 符合 EN 50155 |
| 调试 | USB-串口 + JTAG | 飞腾官方 XDP |
2. 软件栈
| 层级 | 选型 | 安装指引 |
|---|---|---|
| Bootloader | U-Boot 2022.04 (飞腾官方) | 已烧录 |
| 内核 | linux-5.15.y + rt53 补丁 | 见下文一键脚本 |
| RootFS | Ubuntu 20.04 base + BusyBox | 可裁剪至 300 MB |
| 实时协议 | TCN-Open-Source (IEC 61375) | Git 克隆 |
| 安全库 | SafeRTOS-Linux 混合(用户态 SIL 2) | 商业授权 |
3. 一键编译 RT 内核(可复制)
#!/bin/bash # build_rt_phytium.sh set -e VER=5.15.71 RT_PATCH=patch-${VER}-rt53.patch.xz wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-${VER}.tar.xz wget https://cdn.kernel.org/pub/linux/kernel/projects/rt/${VER}/${RT_PATCH} tar -xf linux-${VER}.tar.xz cd linux-${VER} xzcat ../${RT_PATCH} | patch -p1 make phytium_defconfig # 飞腾官方默认配置 ./scripts/config -e CONFIG_PREEMPT_RT make -j$(nproc) Image dtbs sudo make modules_install sudo cp arch/arm64/boot/Image /boot/phytium-rt sudo update-grub重启选phytium-rt进入,确认:
uname -r # 5.15.71-rt53-phytium cyclictest -p99 -i100 -d60sMax 延迟 < 80 μs 即达标。
四、应用场景(300 字):列车门控 + 站台视频联动
具体场景:高铁进站自动开门 + 站台异物检测
列车以 80 km/h 进站,车载信号计算机通过 MVB 收到“开门使能”帧,周期 32 ms。
飞腾实时 Linux 需 10 ms 内完成:
① 校验 MVB CRC → ② 输出门控继电器 → ③ 通过千兆网触发站台摄像头抓拍 → ④ 返回门状态。若站台摄像头 AI 检测到异物(行李/人员越线),需在 50 ms 内通过以太网反向发送“禁止开门”指令;系统立即切断继电器并记录日志。
整个控制逻辑跑在 PREEMPT_RT 用户态,双冗余热备,任何一路超时自动切换到备份通道,满足 SIL 2 诊断覆盖率≥90%。
飞腾芯片内置 ECC 与看门狗,-40 ℃ 冷启动时间 < 30 s,比进口 x86 缩短 40%,完全替代传统 VxWorks 方案,实现“国产芯+实时 OS”自主可控。
五、实际案例与步骤:30 分钟跑通“门控 + 网络回环”原型
实验目录统一:
~/train-rt,所有代码可拷贝编译。
5.1 硬件连接图
[MVB 仿真器] --RS485--> [FT-2000/4 串口] [FT-2000/4] --GPIO--> [继电器模块] [FT-2000/4] --GbE--> [摄像头 PC]5.2 步骤 1 - 创建实时线程
// door_control.c #include <pthread.h> #include <stdio.h> #include <unistd.h> #include <sched.h> #define PERIOD_MS 32 void *door_task(void *arg) { struct timespec next; clock_gettime(CLOCK_MONOTONIC, &next); while (1) { /* TODO: 读 MVB 帧、校验 CRC */ printf("Door cycle\n"); next.tv_nsec += PERIOD_MS * 1000000; if (next.tv_nsec >= 1000000000) { next.tv_sec++; next.tv_nsec -= 1000000000; } clock_nanosleep(CLOCK_MONOTONIC, TIMER_ABSTIME, &next, NULL); } return NULL; } int main() { pthread_t tid; pthread_attr_t attr; struct sched_param param = { .sched_priority = 95 }; pthread_attr_init(&attr); pthread_attr_setschedpolicy(&attr, SCHED_FIFO); pthread_attr_setschedparam(&attr, ¶m); pthread_create(&tid, &attr, door_task, NULL); pthread_join(tid, NULL); return 0; }编译:
gcc door_control.c -o door_control -pthread -lrt sudo ./door_control # 需 root 才能设置 FIFO:95观察周期抖动:
sudo trace-cmd record -e sched_switch ./door_control sudo trace-cmd report | grep door_task5.3 步骤 2 - MVB 物理层适配(简化)
MVB 需定制驱动,本文用串口 115200 模拟——帧格式 16 字节:
| 头 1B | 数据 12B | CRC 3B |
用户态读串口,代码片段:
int fd = open("/dev/ttyS2", O_RDWR | O_NOCTTY); set_speed(fd, 115200); while (read(fd, buf, 16) == 16) { if (crc_ok(buf)) { gpio_set_value(RELAY_PIN, 1); /* 开门 */ send_udp_to_camera(); /* 触发抓拍 */ } }5.4 步骤 3 - GPIO 控制继电器
飞腾引脚编号计算:BASE = 320; RELAY_PIN = BASE + 12;
# 导出 GPIO echo 332 | sudo tee /sys/class/gpio/export echo out | sudo tee /sys/class/gpio/gpio332/direction # 开门 echo 1 | sudo tee /sys/class/gpio/gpio332/value5.5 步骤 4 - 网络触发摄像头(UDP 回环测试)
void send_udp_to_camera(void) { int sock = socket(AF_INET, SOCK_DGRAM, 0); struct sockaddr_in dst = { .sin_family = AF_INET, .sin_port = htons(5000), .sin_addr.s_addr = inet_addr("192.168.1.100") }; const char *msg = "TRIG"; sendto(sock, msg, 4, 0, (struct sockaddr *)&dst, sizeof(dst)); close(sock); }PC 端接收:
nc -u -l 50005.6 步骤 5 - 冗余与诊断(SIL 2 铺垫)
双串口热备:主串口 3 次无应答 → 切换备份串口 + 记录异常。
看门狗:内核
i.MX_WDT驱动,用户态 20 ms 喂狗一次。ECC 内存:飞腾固件已开,日志中
EDAC无报错即通过。
六、常见问题与解答(FAQ)
| 问题 | 现象 | 解决 |
|---|---|---|
| cyclictest Max > 100 μs | BIOS 未关超线程 | 关闭 Turbo & C-State,内核加nohz_full=1-3 |
| 串口读 16B 延迟抖动大 | 默认调度非 RT | 用setserial /dev/ttyS2 low_latency+ 线程 FIFO:95 |
| GPIO 值写不入 | 引脚复用为 UART | 设备树里 pinctrl 改复用为 gpio |
网络 UDP 丢包 | 中断亲和不均衡 | 把 eth0 中断绑到 core2-3:
echo 0c > /proc/irq/24/smp_affinity| | 低温 -25 ℃ 无法启动 | eMMC 启动电压不足 | 换工业级 eMMC,启用飞腾 PMIC 低温补偿位 |
七、实践建议与最佳实践
版本锁定
内核、uboot、rootfs 哈希值写入《软件配置清单》,任何升级走变更流程。CI 自动化
GitLab Runner 每提交 → 自动跑cyclictest + 单元测试 + 追溯矩阵检查。追溯矩阵
用 Python 脚本扫描SRS_*↔test_*前缀,生成 Excel,auditor 一键通过。故障演练
每月“故障日”:随机拔串口、关电源、注错帧,验证 3 秒内切换 + 日志完整。文档沉淀
把本文步骤整理成《飞腾轨道交通 RT-Linux 快速部署手册 v1.0》,放 Confluence,新人 30 分钟可复现。向后兼容
保持用户态 ABI 稳定,内核升级只做补丁级,避免用户应用重编。
八、总结:一张脑图带走全部要点
飞腾轨道交通实时控制 ├─ 芯:FT-2000/4 工业级 -40 ℃ ~ +85 ℃ ├─ 核:linux-5.15-rt,cyclictest < 80 μs ├─ 协议:IEC 61375 MVB + UDP 视觉联动 ├─ 冗余:双串口热备 + 看门狗 + ECC ├─ 安全:SIL 2 追溯矩阵 + 故障注入 └─ 落地:30 分钟跑通门控原型,文档 CI 自动化国产芯 + 实时 Linux 不再是“实验室玩具”,它已能扛起 CTCS-3 信号控制的安全重担。
把本文脚本 push 到你的 GitLab,下次现场调试,只需一条 ansible-playbook,即可在深夜 2 点的站台,让列车稳稳停在你设定的厘米级位置——自主可控,分秒不差!