一尘不染

Linux 2.6如何“实时”?

linux

我正在考虑将我的产品从RTOS迁移到嵌入式Linux。我没有很多实时要求,而我有几个RT要求大约是10毫秒。

有人可以给我指出一个参考,该参考可以告诉我当前版本的Linux如何实时吗?

从转向商业RTOS到Linux还有其他陷阱吗?


阅读 322

收藏
2020-06-07

共1个答案

一尘不染

您可以从Real Time Linux
WikiFAQ中获得大部分答案。

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

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

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

如果发生某个事件时需要执行高优先级线程才能开始执行的内核代码正在执行,则该高优先级线程无法抢占正在运行的内核代码,直到内核代码明确地产生控制权为止。在最坏的情况下,延迟可能会达到数百毫秒或更长。

Linux
2.6配置选项CONFIG_PREEMPT_VOLUNTARY引入了对长延迟最常见原因的检查,以便内核可以自动将控制权交给等待执行的更高优先级的任务。这可能会有所帮助,但是虽然它减少了长时间延迟(几百毫秒到可能的秒数或更多)的发生,但并不能消除它们。但是,与CONFIG_PREEMPT(在下面讨论)不同,CONFIG_PREEMPT_VOLUNTARY对系统的总体吞吐量的影响要小得多。(与往常一样,在吞吐量(系统的整体效率)和延迟之间存在经典的权衡。随着现代系统CPU速度的提高,通常需要权衡吞吐量以降低延迟,

2.6
Linux内核还有一个额外的配置选项CONFIG_PREEMPT,它使自旋锁保护区域和中断处理程序之外的所有内核代码都可以通过更高优先级的内核线程进行非自愿的抢占。使用此选项,尽管某些设备驱动程序可以使用中断处理程序,但最坏的情况下的延迟降至(大约)个数毫秒,这将使延迟更差。如果实时Linux应用程序要求的延迟小于一位数毫秒,则强烈建议使用CONFIG_PREEMPT_RT补丁。

它们还具有您在FAQ中称为“ Gotcha”的列表。

在编写实时应用程序时要记住哪些重要的事情?

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

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

详细信息:如何:构建RT应用程序

他们还有一个大型出版物页面,您可能想结帐。

2020-06-07