设为首页 加入收藏

TOP

实时嵌入式Linux设备基准测试快速入门3实时嵌入式Linux(一)
2023-08-06 07:49:52 】 浏览:97
Tags:时嵌入 Linux

第3章实时嵌入式Linux

计算机系统与环境之间的交互通常是实时发生的,因此,对于作为计算机系统一部分的嵌入式设备来说,有关实时操作系统的讨论也是一个重要话题。

本章将讨论实时系统的特点,介绍在Linux嵌入式设备上实现实时性的主要方法。具体来说,本章将重点分析PREEMPT_RT内核补丁,该补丁可轻松应用于主线内核。然后,将分析调度延迟的概念以及导致延迟增加的主要原因。最后,结尾部分将重点介绍如何利用特定工具和方法(如Cyclictest提供的工具和方法)以及涉及剖析工具的更复杂工具来测量和分析延迟。

3.1 Linux与实时性

Linux中的实时性是一个非常有趣的话题,每当使用Linux作为操作系统的设备需要运行具有实时性要求的应用程序时,这个话题就会出现。

正如已经强调的那样,Linux几乎具备了在许多系统和ICS中采用所需的所有特性。然而,正如第 2.1节末尾所述,当需要运行的应用程序需要实时行为时,Linux就会受到影响。造成这一问题的主要原因是,Linux最初是作为通用操作系统设计的。因此,Linux在设计时并没有考虑时间的确定性,因此它并不是一个实时操作系统。

分析Linux的设计方式,它的目的是提供最高级别的整体性能。这隐含地意味着,事情不会以确定的时间方式发生,因为一切都将以提高整体性能水平的方式进行,而众所周知,这两件事是背道而驰的。

尽管如此,考虑到Linux提供了许多有用的功能,但当它必须用于时间关键型应用程序时,就会遇到这个问题。

3.1.1 什么是实时?

实时的含义是一个相当混乱的概念,人们在被问及实时系统的定义时,往往会给出许多相互矛盾的定义。因此,在继续讨论之前,有必要澄清实时系统的概念。
一些最混乱的定义涉及以下说法:

  • 实时是指执行速度快
  • 实时是指性能高
  • 实时是指响应速度快

这些说法都有一定的道理,但仍有不足之处。事实上,在谈到实时系统时:它并不是指最快的执行速度和最快的响应时间,也不是指最好的性能,而是指时间保证。换句话说,实时任务的定义并不是要求任务的执行速度越快越好,而是要求任务的执行速度在时间要求规定的范围内。

如果一项任务必须在某个时间点(即截止日期)之前完成,那么它就可以被定义为实时任务。因此,在处理实时系统时,在指定的时间段前完成任务并不重要,重要的是保证任务的最后期限始终得到遵守。

综上所述,在讨论实时系统时,任务在特定机器上执行的算法的正确性不仅取决于算法结果本身的正确性,还取决于算法的执行时间。

这意味着,如果算法没有在指定的时间段内执行,相应的时间违规将导致独立于算法结果的错误条件。
当然,并不是所有的错误条件都是一样的。因此,根据错过截止时间造成的后果,系统可分为以下几类:

  • 硬实时:错过最后期限会导致整个系统瘫痪。
  • 稳健实时:可以容忍不频繁的截止日期缺失,但服务质量可能会下降,因为截止日期后产生的结果完全无用。
  • 软实时:错过截止日期后,产生的结果会降低,但仍可使用。不过,多次错过截止日期后,系统质量可能会下降。

3.1.2 让Linux实现实时运行

谁真正需要实时Linux?

  • 工业
  • 自动化
  • 汽车
  • 多媒体系统
  • 航空航天
  • 金融服务

不仅在嵌入式设备上,而且在功能更强大的计算机系统中,都需要具备实时功能。传统上,使Linux具有实时性的方法主要有两种:第一种是基于所谓的双内核方法,这种方法并不是为了使实际的Linux内核具有实时性,另一种是代表新趋势的内核方法。

双内核(dual-kernel)方法

最著名的使Linux实时化的双内核方法是RTAI和Xenomai:它们使用的方案如图 3.1 所示。

在这种情况下,实际的Linux内核在微内核上运行,微内核确保实时任务的可调度性,并在每次需要时抢占整个Linux内核。

"Altenberg 说:"有了双内核,当优先实时应用程序不在微内核上运行时,Linux 可以获得一些运行时间。
这种方法最明显的问题是,必须有人维护微内核,并支持将其移植到新的硬件平台上。此外,由于 Linux 不能直接在硬件上运行,因此还需要定义和维护一个硬件抽象层。

当然,解决这些问题需要付出巨大的努力,这也是因为开发社区没有维护通用Linux内核的社区那么大。因此,考虑到所需的精力和需要维护的各种东西,这些双内核方法通常要比实际的Linux主线版本晚几步。更详细地说,RTAI是米兰大学开发的第一个尝试。使用它,可以在内核空间编写实时应用程序,而实时应用程序与用户空间之间的交互是通过非常有限和特殊的方法完成的。RTAI的目的是获得最低的延迟,支持的操作系统包括x86、x86_64 和一些 ARM 平台支持。

"有了RTAI,你就可以编写一个由微内核调度的内核模块。这就像内核开发一样,真的很难进入,也很难调试"。此外,由于RTAI的开发是在内核空间进行的,根据内核通用公共许可证(GPL)的规定,代码必须发布,这可能会使事情变得更加复杂,因为工业客户往往希望使用封闭源代码。

如今,RTAI的另一种双内核替代方案是Xenomai,它已成为主流。它比RTAI支持更多的硬件平台,但更重要的是,它提供了一种在用户空间进行实时操作的解决方案。
"为此,他们提出了皮肤的概念,即不同实时操作系统(RTOS)(如Unix的可移植操作系统接口(POSIX))API 的仿真层。这样就可以重新使用某些实时操作系统的现有代码子集"。

不过,即使使用Xenomai,也需要维护一个单独的微内核和一个硬件抽象层。此外,标准C库无法使用,应用程序开发需要特殊工具。总之,双内核方法克服了Linux在管理实时应用程序方面的局限性。不过,所分析的两种解决方案都有一些不容忽视的缺点,尤其是在处理大型复杂项目时。

in-kernel方法

由于使用双内核方法可能会很复杂,这可能会阻碍开发人员使用Linux,因此最好的办法就是使实际的Linux内核具有实时性,而不需要任何外部微内核的帮助,如图 3.2 所示。

实时操作系统要想获得确定性时序行为,首先必须提供抢占功能。具体来说,它需要在大部分时间都能抢占先机,因为优先级较高的任务必须总是抢占其他不太重要的任务和优先级较低的任务的先机。当然,一旦增加了抢占功能,就必须管理和解决其他众所周知的问题,如优先级倒置。

传统上,使主线内核实时运行所需的所有转换都是通过内核补丁完成的:即所谓的 PREEMPT_RT。
如今,PREEMPT_RT补丁已被广泛使用,它是使Linux实现实时运行的主要方法。

3.1.3 PREEMPT_RT

PREEMPT_RT补丁代表了最常用的内核方法,可使Linux在实时场景中发挥作用。此外,由于PREEMPT_RT已获官方支持,它允许使用标准POSIX,而不需要特殊的API来编写实时应用程序。因此,PREEMPT_RT得到了很好的支持,并得到了官方社区的高度认可,其大部分功能已被纳入主线内核。对此Linus Torvalds在2006 年的一次峰会上表示支持:"用Linux控制激光器太疯狂了,但在座的每个人都有自己的疯狂之处。因此,如果你想用 Linux 来控制工业焊接激光器,我对你使用 PREEMPT_RT 没有意见"。

在继续分析PREEMPT_RT补

首页 上一页 1 2 3 4 下一页 尾页 1/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇【技术积累】Linux中的命令行【理.. 下一篇rsync教程、rsync+inotufy、sersy..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目