目前主流的解决方案有 2 个:

  • 单内核解决方案:给 Linux 内核打补丁,解决上面提到的几个问题,例如:RT-Preempt;

  • 双内核解决方案:在硬件抽象层之上,运行 2 个内核:实时内核 + Linux 内核,它们分别向上层提供 API 函数,例如:Xenomai;

 

现阶段的RTOS分成两个阵营:

  • 非Linux阵营:VxWorks,RTEMS

  • Linux阵营 :RT-linux,Preempt-rt,WindRiver Linux,RTAI,Xenomai。

 

RT-linux:应该是第一批实时性linux,可以提供硬实时,有两个版本,免费版和收费版,收费版最初由 FSMLabs(Finite State Machine Labs)公司开发,在2007年卖给了 WindRiver。之后 WindRiver 将其作为自己的产品 WindRiver Linux 的一个实时核心(real-time core)象征性的维护了一段时间,与2011年8月彻底停止更新和维护。RT-linux 的性能应该很好,WindRiver 应该是出于竞争的目的对其进行了收购,现在 RT-linux 已经不再更新。
WindRiver Linux:WindRiver 为 Linux 世界提供的一个发行版,具备软实时的能力,应该吸收了一部分 RT-Linux 的核心技术,感觉是 WindRiver 为了延长其产品线,提高行业竞争力和覆盖面而开发的系统,还没进行深入分析,毕竟是软实时。
Preempt-rt:Ingo Molnar 引领的 Linux kernel 实时 patch,可以改善通用 Linux 的实时性,也是本项目前期工作的重点。
RTAI:(Real-Time Application Interface)项目应该继承自 RT-linux,后期吸收了 Xenomai 的一部分思想,专注实时性能,应用广泛。
Xenomai:2001 年 8 月由 Philippe Gerum 发起,其思想是来源于 Karim 的 ADEOS(Adoptive Domain Environment for Operating System)。发布后即被 RTAI 采用,并一度合并为 RTAI/Fusion。后于2005年独立。Xenomai 的实时性能比RTAI略差,因为其完全由 ADEOS 控制中断,而 RTAI 是由其内核对中断进行了截断,非实时的中断才交给 ADEOS,这就减少了一部分实时开销。

 

RT-Preempt实时补丁

RT补丁下载地址 www.kernel.org/pub/l...

 

rt-tests工具包

cyclictest是一个高精度(us级别)的系统实时性测试程序(维基主页地址) 。该工具是rt-tests下使用最为广泛的测试工具,一般用来进行内核的延迟,从而判断内核的实时性能。也可以git 该程序的源代码到本地进行编译。
参数说明

-p PRIO --prio=PRIO       最高优先级线程的优先级  使用时方法为: -p 90 /  --prio=90
-m       --mlockall        锁定当前和将来的内存分配
-c CLOCK --clock=CLOCK     选择时钟  cyclictest -c 1
                           0 = CLOCK_MONOTONIC (默认)
                           1 = CLOCK_REALTIME
-i INTV  --interval=INTV  基本线程间隔,默认为1000(单位为us),下面介绍原理的时候会提到
-l LOOPS --loops=LOOPS     循环的个数,默认为0(无穷个),与 -i 间隔数结合可大致算出整个测试的时间,比如 -i 1000  -l 1000000 ,总的循环时间为1000*1000000=1000000000 us =1000s ,所以大致为16分钟多。
-n       --nanosleep       使用 clock_nanosleep
-h  HISTNUM    --histogram=US    在执行完后在标准输出设备上画出延迟的直方图(很多线程有相同的权限)US为最大的跟踪时间限制,这个在下面介绍实例时可以用到,结合gnuplot 可以画出我们测试的结果图。
                       
-q       --quiet         使用-q 参数运行时不打印信息,只在退出时打印概要内容,结合-h HISTNUM参数会在退出时打印HISTNUM 行统计信息以及一个总的概要信息。
-f       --ftrace          ftrace函数跟踪(通常与-b 配套使用,其实通常使用 -b 即可,不使用 -f )
-b USEC  --breaktrace=USEC 当延时大于USEC指定的值时,发送停止跟踪。USEC,单位为谬秒(us)。

 

运行其中的cyclictest测试工具,默认创建5个SCHED_FIFO策略的realtime线程,优先级 76-80,运行周期是1000,1500,2000,2500,3000微秒。标准linux的测试结果如下:

cyclictest -p 80 -t5 -n

policy: fifo: loadavg: 9.22 8.57 6.75 11/374 21385

T: 0 (20606) P:80 I:1000 C:  18973 Min:    26 Act:  76 Avg:  428 Max:  12637

T: 1 (20607) P:79 I:1500 C:  12648 Min:    31 Act:  68 Avg:  447 Max:  10320

T: 2 (20608) P:78 I:2000 C:  9494 Min:    28 Act:  151 Avg:  383 Max:    9481

T: 3 (20609) P:77 I:2500 C:  7589 Min:    29 Act:  889 Avg:  393 Max:  12670

T: 4 (20610) P:76 I:3000 C:  6325 Min:    37 Act:  167 Avg:  553 Max:  13673

由此可见在标准Linux内,rt线程投入运行的jitter非常不稳定,最小值在26-37微秒,平均值为68-889微秒,而最大值则分布在9481-13673微秒之间。

实时linux的测试结果如下:

cyclictest -p 80 -t5 -n

policy: fifo: loadavg: 0.14 0.29 0.13 2/308 1908

T: 0 ( 1874) P:80 I:1000 C:  28521 Min:      0 Act:  440 Avg: 2095 Max:  331482

T: 1 ( 1875) P:79 I:1500 C:  19014 Min:      2 Act:  988 Avg: 2099 Max:  330503

T: 2 ( 1876) P:78 I:2000 C:  14261 Min:      7 Act:  534 Avg: 2096 Max:  329989

T: 3 ( 1877) P:77 I:2500 C:  11409 Min:      4 Act:  554 Avg: 2073 Max:  328490

T: 4 ( 1878) P:76 I:3000 C:  9507 Min:    12 Act:  100 Avg: 2081 Max:  328991

输出结果含义:
T: 0 序号为0的线程
P: 0 线程优先级为0
C: 9397 计数器。线程的时间间隔每达到一次,计数器加1
I: 1000 时间间隔为1000微秒(us)
Min: 最小延时(us)
Act: 最近一次的延时(us)
Avg:平均延时(us)
Max: 最大延时(us)

作者:SteveChen  创建时间:2024-10-10 11:52
最后编辑:SteveChen  更新时间:2024-10-10 11:53