嵌入式Linux三种主流实时性方案怎么选?
由于是双内核,双核通信需要提供专门的机制,比如一些消息/信号传递让实时域任务与非实时域 Linux 进程进行通信,而且实时核的API也不同,更倾向于移植传统 RTOS 代码和应用开发。如果需要极低的确定性延迟,比如10us以下的微秒级,或者需要双核隔离等,可以考虑使用。缺点也是有的,就是理论最坏情况延迟相对后面的两种方案会差一点,不过达到十微秒到百微秒级别还是没什么问题的,bug菌采用这种方案做过

正文
大家好,我是bug菌~
前段时间项目对实时性要求比较高,于是就抽了一些时间研究了一下Linux实现强实时性的一些解决方案,总结起来 Linux 实现强实时性其实主要就这三种主流架构路线,Preemption 实时系统、Xenomai 实时系统和AMP 双系统 。下面bug菌将跟大家挨个介绍一下它们,以便后续同志们用Linux系统做项目的时候能够正确决策。
1. Preemption 实时系统 (基于 PREEMPT_RT)

这种方式就是直接改造标准 Linux 内核本身,使其具备更强的实时能力。给Linux内核打上PREEMPT_RT(Real-Time)补丁,现在最新的Linux内核版本这RT---CONFIG_PREEMPT_RT已经合并到了主线,所以你也不用在自己去打补丁了。
RT补丁主要的实现:
以最大化内核可抢占性 : 几乎所有内核代码执行路径,包括系统调用、中断处理程序结尾,都可以被更高优先级的实时任务抢占,不再有大内核锁(BKL)等长期持有的粗粒度锁。
中断线程化 : 将大部分硬件中断处理程序转换为内核线程,也称为 IRQ Threads,这些线程具有可设置的调度优先级(SCHED_FIFO), 高优先级的实时任务可以抢占正在运行的中断线程,这样就避免中断处理程序长时间占用 CPU 而阻塞实时任务。
自旋锁转化 : 将可能导致优先级反转的内核自旋锁替换为优先级继承互斥锁(RT Mutex)。 当发生优先级反转时比如说 低优先级任务持有锁,阻塞了高优先级任务,那么低优先级任务能临时继承高优先级任务的优先级,尽快释放锁。
高精度定时器:提供微秒级精度的定时和休眠,要提高更好更快的实时性可以tick更小。
所以通过上面大部分手段,Linux应用基本上与标准 Linux 无缝集成,应用开发完全沿用 Linux API(如 POSIX 线程,支持 SCHED_FIFO/SCHED_RR),集成度非常高,并且社区支持度强,基本上后续都是跟着主线版本在走的,简单好用。
缺点也是有的,就是理论最坏情况延迟相对后面的两种方案会差一点,不过达到十微秒到百微秒级别还是没什么问题的,bug菌采用这种方案做过一段时间的压力测试还行。
2. Xenomai 实时系统

这种方案主要是在 Linux 内核旁边并行运行一个轻量级的硬实时内核 (Nanokernel / Cobalt)。通过优先级反转机制保证实时核总能优先执行。
主要采用双内核架构
实时域 : 一个微秒级别的硬实时核心,运行 Xenomai 实时任务。有自己的调度器(通常基于优先级/时限)。
非实时域: 标准的 Linux 内核及其所有用户进程。
一些需要硬实时响应的关键硬件中断,会被底层管道截获并路由到实时内核处理。只有当实时内核无事可做时,中断才会传递给 Linux 内核处理。 在需要时(如实时任务阻塞),快速切换到 Linux 非实时域运行。 由于是双内核,双核通信需要提供专门的机制,比如一些消息/信号传递让实时域任务与非实时域 Linux 进程进行通信,而且实时核的API也不同,更倾向于移植传统 RTOS 代码和应用开发。
如果需要极低的确定性延迟,比如10us以下的微秒级,或者需要双核隔离等,可以考虑使用。毕竟打补丁、配置和维护比较困难,甚至还要专门去熟悉一套API,至少不是那么简单好用。
3. AMP 双系统 (Linux + HAL)

这种解决方案也是目前各大厂家陆续推出的异构平台,比如stm32mp157、257;TI AM6253;NXP的9352,;RK3562等等, 利用非对称多处理 (AMP) 硬件(通常是异构多核 SoC),将 Linux 和一个专用的硬实时操作系统 (RTOS) 或 裸机实时 HAL 层分别运行在物理隔离的 CPU 核心上,所以玩法多样,对于SMP多核系统可以单独隔离CPU来跑HAL挺多模组厂家是这么玩的,把MPU和MCU结合到了一起。
相比Xenomai软件上的隔离,AMP实现了硬件隔离:CPU 核心之间通常只有有限的、低延迟的硬件通信通道(如 Mailbox, RPMSG, Shared Memory)。
这种方案实时核M核独占物理核心,零干扰,可实现纳秒级到微秒级的极低延迟,Linux 内核崩溃、卡死或被攻击通常不影响运行在独立核心上的实时任务。而且像STM32MP2的RIF安全隔离框架更是给资源的安全分配带来了强有力的保障。
不过这种方案的开发复杂度也不小,Linux 与实时核之间通信的延迟和带宽可能成为系统瓶颈,重点是开发和调试需要两套工具链、两个开发模型(Linux vs RTOS/裸机)
4. 以后如何抉择呢?
-
需要平衡性能和兼容性? 且实时性要求在几十到百微秒级? → PREEMPT_RT。
-
需要接近Linux但要求更严格的硬实时? 需要微秒级确定性? 或者需要移植传统RTOS代码? → Xenomai。
-
需要最高级别的实时性、隔离性或安全性? 对延迟要求达到纳秒/微秒级? 需要在硬件层面隔离故障? 或有特定的AMP硬件? → AMP (Linux + RTOS/HAL)
最后
好了,今天就跟大家分享这么多了,如果你觉得有所收获,一定记得点个赞~
唯一、永久、免费分享嵌入式技术知识平台~
推荐专辑 点击蓝色字体即可跳转
☞ MCU进阶专辑 
☞ “bug说”专辑 
☞ 专辑|手撕C语言
☞ 专辑|经验分享

更多推荐




所有评论(0)