一、简介:轨道信号不能“卡”,飞腾+实时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, &param);
    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 低温补偿位 |


七、实践建议与最佳实践

  1. 版本锁定
    内核、uboot、rootfs 哈希值写入《软件配置清单》,任何升级走变更流程。

  2. CI 自动化
    GitLab Runner 每提交 → 自动跑 cyclictest + 单元测试 + 追溯矩阵检查

  3. 追溯矩阵
    用 Python 脚本扫描 SRS_*test_* 前缀,生成 Excel,auditor 一键通过。

  4. 故障演练
    每月“故障日”:随机拔串口、关电源、注错帧,验证 3 秒内切换 + 日志完整。

  5. 文档沉淀
    把本文步骤整理成《飞腾轨道交通 RT-Linux 快速部署手册 v1.0》,放 Confluence,新人 30 分钟可复现。

  6. 向后兼容
    保持用户态 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 点的站台,让列车稳稳停在你设定的厘米级位置——自主可控,分秒不差!

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐