如何“实时”是Linux 2.6?

我正在考虑将我的产品从RTOS移植到embedded式Linux。 我没有太多的实时要求,而我所需要的几个RT要求是几十毫秒。

有人能给我一个参考,可以告诉我实时Linux的当前版本是什么?

是否有任何其他的陷阱转移到商业RTOS到Linux?

Solutions Collecting From Web of "如何“实时”是Linux 2.6?"

您可以从Real Time Linux wiki和FAQ中获得大部分答案

什么是2.6内核的实时库存能力?

传统上,只有在某些情况下,Linux内核才会允许一个进程抢占另一个进程:

  • 当CPU运行用户模式代码时
  • 当内核代码从系统调用或中断返回到用户空间时
  • 当内核代码在互斥体上阻塞时,或者明确地将控制权交给另一个进程

如果内核代码正在执行,当某个事件发生需要高优先级线程开始执行时,高优先级线程不能抢占正在运行的内核代码,直到内核代码明确地进行控制。 在最糟糕的情况下,延迟可能会达到数百毫秒甚至更长。

Linux 2.6配置选项CONFIG_PREEMPT_VOLUNTARY引入了对长时间延迟最常见原因的检查,以便内核可以自动将控制权交给等待执行的更高优先级的任务。 这可能会有所帮助,但是它可以减少长时间延迟(几百毫秒到几秒或更长时间)的发生,但并不能消除这些问题。 然而,与CONFIG_PREEMPT(下面讨论)不同,CONFIG_PREEMPT_VOLUNTARY对系统的整体吞吐量的影响要小得多。 (与往常一样,在吞吐量—系统的总体效率—和延迟之间有一个经典的折中,现代系统的CPU速度越快,为了降低延迟,平衡吞吐量通常是有意义的,而服务器不需要最小延迟保证的类系统可以选择使用CONFIG_PREEMPT_VOLUNTARY,或者坚持传统的不可抢占的内核设计。)

2.6 Linux内核有一个额外的配置选项CONFIG_PREEMPT,它使得所有内核代码都在自旋锁保护区域之外,中断处理程序有资格被更高优先级的内核线程非自愿抢占。 有了这个选项,最坏情况下的延迟会下降到(几乎)单位数毫秒,尽管一些设备驱动程序可能会有中断处理程序,这会导致更差的延迟。 如果实时Linux应用程序要求的延迟时间小于一位毫秒,则强烈建议使用CONFIG_PREEMPT_RT修补程序。

在常见问题解答中,他们也有一个“Gotcha's”的列表。

在编写实时应用程序时要记住什么是重要的事情?

在初始启动阶段,请注意以下事项:

  • 尽可能从main()中调用mlockall()。
  • 在应用程序启动时创建所有线程,并触摸每个线程的整个堆栈的每个页面。 切勿在RT显示时间内动态启动线程,这将破坏RT行为。
  • 切勿使用已知会产生页面错误的系统调用,例如fopen()。 (打开文件执行mmap()系统调用,这会产生页面错误)。
  • 如果使用“编译时全局变量”和/或“编译时全局数组”,则使用mlockall()来访问它们时防止页面错误。

更多信息: HOWTO:构建一个RT应用程序

他们也有一个大的出版物页面,你可能想结帐。

你有没有看过Xenomai ? 它将允许您在Linux上运行“硬实时”进程,同时仍允许您访问常规Linux API以满足所有非实时需求。

有两种根本不同的方法来实现Linux的实时功能。

1)用rt-preempt补丁修补现有的内核。 这最终将导致一个完全抢先的内核

2)双核方法(如xenomai,RTLinux,RTAI,…)

从RTOS到Linux有很多问题。

也许你不需要实时?

我正在谈论我的培训中的实时Linux: http : //www.reliableembeddedsystems.com/embedded-systems_7.html

答案可能是“足够好”。

如果您正在运行嵌入式系统,则可能会控制所有或大部分软件。

Stock Linux 2.6有几个适合低延迟任务的特性 – 主要是:

  • 调度策略
  • 内存锁定

假设您使用的是单核机器,如果您只有一个将其调度策略设置为SCHED_FIFO或SCHED_RR的任务(如果您只有一个任务,则无关紧要),并将其所有内存锁定在mlockall (),那么一旦它准备运行,它就会被安排。

那么你唯一需要担心的是内核的某些非抢占部分需要花费比可接受的延迟时间更长的时间 – 除非发生不良情况,例如极大的内存压力,否则在嵌入式系统中不太可能发生这种情况。你的司机是狡猾的。

我想“试试看”是一个很好的答案,但在你的情况下可能相当复杂(可能涉及编写设备驱动程序等)。

查看sched_setscheduler的文档以获得更好的信息。