第2章:实时操作系统选型:RT-Linux、Preempt-RT、裸机方案对比

好,咱们进入第二章。这一章我估计是大家最纠结的部分——到底选哪个实时方案?

说实话,我刚开始做瑞芯微项目时也踩过坑。当时想省事,直接上了裸机,结果后期加功能加得想哭。后来换了Preempt-RT,又发现某些中断响应不够快。嗯,今天我把这三个方案掰开揉碎了讲清楚。

2.1 三大方案的核心差异

先看一张对比表,心里有个底:

特性 裸机方案 Preempt-RT RT-Linux
中断响应时间 1-5 μs 10-50 μs 5-15 μs
任务切换抖动 极低(<1 μs) 中等(10-30 μs) 低(5-15 μs)
开发复杂度 高(全手写) 低(Linux生态) 中(双内核)
功能扩展性
瑞芯微适配度 需大量移植 官方BSP支持 需额外补丁

说白了,裸机追求极致速度,但代价是开发效率。Preempt-RT最均衡,RT-Linux在硬实时场景有优势。

2.2 裸机方案:什么时候选?

裸机方案,就是没有操作系统,直接在硬件上跑循环。我见过一些老工程师特别喜欢这么干,觉得「掌控一切」。

但说实话,瑞芯微的芯片跑裸机有点浪费。它的MMU、Cache、多核能力全废了。

适用场景:

  • 任务极简单(比如只做IO采样+输出)
  • 对成本敏感(省掉RTOS授权费)
  • 中断响应要求<5 μs

我曾经在一个电机控制项目里试过裸机。刚开始挺爽,代码跑得飞快。但后来要加Modbus协议栈、要支持OTA升级……嗯,那段时间我基本住在公司了。

避坑指南:我曾经以为裸机好调试,结果发现加一个功能就要改一堆全局变量。如果你预计项目会迭代超过3个月,别选裸机。

2.3 Preempt-RT:最稳妥的选择

Preempt-RT是标准Linux内核加上实时补丁。说白了,就是把Linux内核变成可抢占的。

我个人的习惯是:只要不是硬实时要求<10 μs,优先选Preempt-RT。为什么?

  • 生态好:瑞芯微官方SDK直接支持,驱动不用重写
  • 开发快:用标准POSIX API,团队招人容易
  • 调试方便:gdb、perf、ftrace全能用

举个例子,我在RK3588上跑Preempt-RT,控制一个伺服驱动器。周期任务1kHz,抖动控制在±20 μs以内。够用了。

小技巧:配置Preempt-RT时,记得关掉CPU调频和节能选项。我在项目中遇到过因为DVFS导致中断延迟飙升的情况,关了就好了。

2.4 RT-Linux:硬实时的终极方案

RT-Linux走的是双内核路线。一个微内核处理实时任务,标准Linux跑非实时任务。两者通过共享内存通信。

说实话,这个方案我用的不多。因为配置起来比较麻烦,而且瑞芯微的BSP对它的支持不如Preempt-RT成熟。

但如果你遇到以下情况,RT-Linux是唯一选择:

  • 中断响应要求<10 μs
  • 任务抖动要求<5 μs
  • 需要同时跑复杂Linux应用(比如Qt界面)

我记得有个激光切割项目,要求位置同步精度在1 μs以内。裸机搞不定多任务,Preempt-RT抖动又偏大。最后上了RT-Linux,把实时控制放在微内核,上位机通信放在Linux内核,完美解决。

RT-Linux的典型代码结构:

// 实时任务(运行在微内核)
#include <rtl.h>
#include <rtl_sched.h>

void *rt_task(void *arg) {
    struct sched_param param;
    param.sched_priority = 99;
    sched_setscheduler(0, SCHED_FIFO, ¶m);
    
    while (1) {
        // 读取编码器
        // 计算控制量
        // 输出PWM
        rt_task_wait_period();
    }
}

// 非实时任务(运行在Linux)
// 通过rtf_put/get与实时任务交换数据

2.5 如何为瑞芯微选型?

我总结了一个决策流程,你照着走就行:

  1. 先看硬实时要求:如果中断响应需要<10 μs,直接考虑RT-Linux
  2. 再看功能复杂度:如果需要网络、文件系统、多线程,别碰裸机
  3. 最后看团队能力:如果团队熟悉Linux,Preempt-RT是最佳选择

我个人建议:80%的瑞芯微工控项目,选Preempt-RT就够了。剩下15%选RT-Linux,5%选裸机。

我的经验:瑞芯微的芯片性能其实很强。RK3568跑Preempt-RT,4核A55全开,实时任务绑在隔离核上,非实时任务跑其他核。这样既保证了实时性,又不浪费算力。

2.6 总结

选型没有绝对的对错,只有合不合适。裸机像开手动挡,操控感强但累;Preempt-RT像自动挡,省心省力;RT-Linux像赛车,性能极致但难驾驭。

嗯,下一章我会讲如何在瑞芯微上实际搭建Preempt-RT环境。到时候手把手教你配置内核、编译、跑测试。别走开。