【飞腾平台实时Linux方案系列】第十五篇 - 飞腾平台轨道交通实时控制方案设计。
摘要:本文介绍基于飞腾FT-2000/4处理器和实时Linux(PREEMPT_RT)的轨道交通信号控制系统解决方案。该方案针对350km/h高铁50ms级实时控制需求,通过国产化替代传统x86+VxWorks方案,降低成本40%并提升供应链安全性。详细演示了从硬件配置、实时内核编译到列车门控原型开发的完整流程,包含MVB通信、GPIO控制、网络触发等关键环节,满足SIL2安全等级要求。实践表明,
一、简介:轨道信号不能“卡”,飞腾+实时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 -d60s
Max 延迟 < 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_task
5.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/value
5.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 5000
5.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 点的站台,让列车稳稳停在你设定的厘米级位置——自主可控,分秒不差!
更多推荐

所有评论(0)