第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 如何为瑞芯微选型?
我总结了一个决策流程,你照着走就行:
- 先看硬实时要求:如果中断响应需要<10 μs,直接考虑RT-Linux
- 再看功能复杂度:如果需要网络、文件系统、多线程,别碰裸机
- 最后看团队能力:如果团队熟悉Linux,Preempt-RT是最佳选择
我个人建议:80%的瑞芯微工控项目,选Preempt-RT就够了。剩下15%选RT-Linux,5%选裸机。
我的经验:瑞芯微的芯片性能其实很强。RK3568跑Preempt-RT,4核A55全开,实时任务绑在隔离核上,非实时任务跑其他核。这样既保证了实时性,又不浪费算力。
2.6 总结
选型没有绝对的对错,只有合不合适。裸机像开手动挡,操控感强但累;Preempt-RT像自动挡,省心省力;RT-Linux像赛车,性能极致但难驾驭。
嗯,下一章我会讲如何在瑞芯微上实际搭建Preempt-RT环境。到时候手把手教你配置内核、编译、跑测试。别走开。