用 Real Time Linux 开始编程的最佳方式是啥?

Posted

技术标签:

【中文标题】用 Real Time Linux 开始编程的最佳方式是啥?【英文标题】:What is the best way to start programming with Real Time Linux?用 Real Time Linux 开始编程的最佳方式是什么? 【发布时间】:2015-06-04 04:14:59 【问题描述】:

虽然我用 C 实现了许多项目,但我对操作系统完全陌生。我在 Discovery board (STM32) 上尝试了实时 linux,并得到了 LED 闪烁的正确结果,但我并不真正了解整个过程,因为我只是按照步骤操作,在互联网上找不到每个步骤的完整描述。

我想在实时 Linux 上实现调度。最好的开始方式是什么?有没有可用的网站、书籍、教程?

完整的 RTLinux 进程描述将不胜感激。

感谢广告。

【问题讨论】:

像这样的类似问题,“最好的”(IMOHO) 方法就是Go and Do It。然后 Do It AgainAgain .. 如果你不知道从哪里开始,研究一个已经开始的项目并努力/模仿它。如果您对特定代码行或流程有特定问题,请阅读文档(或具体询问)。调整学习策略以适合您。 【参考方案1】:

从“裸机”到基于操作系统的编程的转变是我反过来经历的。我从一个完整的软件人开始,完全进入了操作系统方面,随着时间的推移,我转向了相反的方向(甚至用 VHDL 设计电路!)。我的建议是从简单开始。 Linux 相当复杂,无论你在哪里看到,都有许多层一起工作以交付最终产品。如果您对实时 linux 扩展一无所知,我很乐意向您推荐 https://xenomai.org/,这是 linux 的实时扩展。

但是,要更具体地解决您关于在 Linux 中实现调度的问题,您可以,但这将是大量工作并且可能非常复杂。操作系统使用完全公平的调度过程(http://en.wikipedia.org/wiki/Completely_Fair_Scheduler),每当你启动一个线程时,它就会被添加到列表中以运行。如果您在内核空间中将代码实现为驱动程序、依赖硬件中断等,这可能会略有不同,但总的来说,这就是 Linux 的工作方式。实时通常意味着它能够为线程分配几个不同的优先级之一,并在任何给定时间充分利用线程抢占,这些概念实际上并不是 vanilla Linux 的一部分。它对此有一些概念,但它有一些限制,当您从 Linux 中寻找实时行为时可能会导致问题。

可能对您有帮助的是 RTOS。如果您正在寻找完整的实时操作系统,请查看 FreeRTOS http://www.freertos.org/。它有一个庞大的社区,并通过大量示例代码支持许多开箱即用的不同设备。他们甚至通过示例包支持您的特定板,因此您可以毫无损失地试一试! http://www.freertos.org/FreeRTOS-for-Cortex-M3-STM32-STM32F100-Discovery.html 。它使您可以访问许多操作系统结构,例如网络 API、内存管理和线程,而无需庞大操作系统的开销和延迟。使用 RTOS,您可以创建任务并为其分配优先级,这样您就可以成为调度程序,而不再受操作系统的支配。你运行操作系统,而不是操作系统运行你(如果有意义的话)。此外,RTOS 中提供的结构感觉很像裸机代码,因此更容易遵循、理解和充分学习。学习 Linux 或 Windows 等成熟操作系统的基本构建块是一个更简单的世界。如果这个选项听起来不错,我建议在 FreeRTOS 网站上查看支持的设备,然后选择一个你想尝试的设备,然后去尝试。我强烈推荐这是一种学习调度和操作系统结构的方法,因为它尽可能简单并且开源。一旦您掌握了 RTOS 的基础知识,专门购买一本关于 Linux 的书就不会是一个坏主意。尽管网络上有许多与学习 Linux 相关的免费资源,但它们通常相互矛盾,并且可能具有误导性。学习 Linux 的特定知识以及一般的操作系统,这会让人感到不知所措。从简单的开始将有助于防止您筋疲力尽,并最大程度地减少您感到迷失的时间。 Linux 绝对是一个学习过程,但就像任何学习过程一样,从简单开始,牢记你的最终目标,制定计划,并沿着该计划采取小的、可管理的步骤,直到你找到自己想要成为的地方.那就去下一座山吧!

【讨论】:

【参考方案2】:

实时 Linux 环境相当混乱。 99.99% 的信息都已经过时了。

首先,有很多“微内核”将 Linux 作为一项任务运行。 (例如已失效的 RTLinux)。问题是您必须将实时任务写入不同的 API,并且不能依赖 Linux 中的任何东西,因为在您的任务运行时 Linux 将在后台冻结。因此,除非您的任务非常简单(“当我按下此按钮时停止电机”),否则这种方法会带来更多的痛苦而不是收获。

接下来是实时 Linux 补丁集。 This hasn't been doing so well. 因为下一条:

最后,当前的 Linux 内核有gotten rid of the problems,这导致人们过去需要实时。您甚至可以将您的一个处理器上的 Linux 关闭到have full control of the CPU。另见this paper。

回答您的问题:我看到您可以采取两种不同的方式:

1) 从普通的 3.xx Linux 内核开始,探索各种 API 和实时技术(即实时优先级、内存固定等)。这可以让您“足够接近”人们想要“实时”的 99% “ 为了。如果它对高频交易来说足够好,那么它可能对你来说就足够了。

2) 如果您有严格的实时要求,并且担心 Linux 无法满足要求,那么(正如 Nick 上面提到的),只需购买一个处理器并在没有操作系统的情况下编写您的实时代码。通过将“实时”和“非实时”代码拆分到不同的 CPU 上,您将使整个系统更简单,更加更加健壮。

【讨论】:

【参考方案3】:

如果您想学习实时操作系统,那么我建议您使用 FPGA,例如 Altera DE2,并尝试使用您自己的操作系统和 ucos。您可以阅读有关嵌入式 RTOS here 的好文章。

您还可以获得Linux Raspberry 并为此编写自己的操作系统。

【讨论】:

以上是关于用 Real Time Linux 开始编程的最佳方式是啥?的主要内容,如果未能解决你的问题,请参考以下文章

【FFMPEG】NI Real time linux上安装ffmpeg

原创Ubuntu Pro 中的RealTime linux(Real-time Ubuntu/PREEMPT-RT/ubuntu官方PREEMPT-RT)

MySQL WorkBench - Duration time + Fetch time < real waiting time怎么来的

DB:Real-time Scene Text Detection with Differentiable Binarization 一些问题

Real-Time Rendering-第四章 Transforms

Real-Time Compressive Tracking 论文笔记