26

我的意思是实时操作系统如何以及为什么能够满足最后期限而不会错过它们?或者这只是一个神话(他们不会错过最后期限)?它们与任何常规操作系统有何不同,是什么阻止了常规操作系统成为 RTOS?

4

12 回答 12

31

满足最后期限是您编写的应用程序的一项功能。RTOS 只是提供帮助您按时完成任务的设施。您还可以在一个大的主循环中对“裸机”(w/oa RTOS)进行编程,并满足您的最后期限。

还要记住,与更通用的操作系统不同,RTOS 运行的任务和进程非常有限。

RTOS 提供的一些功能:

  • 基于优先级的调度器
  • 系统时钟中断程序
  • 确定性行为

基于优先级的调度器

大多数 RTOS 有 32 到 256 个可能的单个任务/进程的优先级。调度程序将运行具有最高优先级的任务。当一个正在运行的任务放弃 CPU 时,下一个最高优先级的任务就会运行,以此类推……

系统中优先级最高的任务将拥有 CPU,直到:

  • 它运行完成(即它自愿放弃CPU)
  • 更高优先级的任务准备就绪,在这种情况下,原始任务被新的(更高优先级)任务抢占。

作为开发人员,您的工作是分配任务优先级,以便满足您的最后期限。

系统时钟中断例程

RTOS 通常会提供某种系统时钟(从 500 uS 到 100 毫秒),允许您执行对时间敏感的操作。如果你有一个 1 毫秒的系统时钟,并且你需要每 50 毫秒执行一次任务,那么通常有一个 API 可以让你说“在 50 毫秒内,唤醒我”。此时,任务将处于休眠状态,直到 RTOS 将其唤醒。

请注意,刚刚被唤醒并不能确保您将在那个时候准确运行。这取决于优先级。如果当前正在运行具有更高优先级的任务,您可能会被延迟。

确定性行为

RTOS 竭尽全力确保无论您有 10 个任务还是 100 个任务,都不再需要切换上下文、确定下一个最高优先级任务是什么等......

通常,RTOS 操作尝试为 O(1)。

RTOS 中确定性行为的主要领域之一是中断处理。当一条中断线发出信号时,RTOS 立即切换到正确的中断服务程序并立即处理中断(不管当前运行的任何任务的优先级如何)。

请注意,大多数特定于硬件的 ISR 将由项目的开发人员编写。RTOS 可能已经为串行端口、系统时钟、网络硬件提供了 ISR,但任何专门的(起搏器信号、执行器等)都不会成为 RTOS 的一部分。

这是一个粗略的概括,与其他一切一样,RTOS 实现有很多种。一些 RTOS 做事不同,但上面的描述应该适用于大部分现有的 RTOS。

于 2009-02-11T13:37:06.873 回答
3

在 RTOS 中,应该注意的最关键参数是较低的延迟和时间确定性。它通过遵循某些政策和技巧来愉快地做到这一点。

而在 GPOS 中,除了可接受的延迟外,关键参数是高吞吐量。您不能指望 GPOS 的时间确定性。

RTOS 的任务比 GPOS 中的进程/线程轻得多。

于 2012-12-15T06:02:43.120 回答
2

并不是他们能够按时完成,而是他们有固定的最后期限,而在常规操作系统中没有这样的最后期限。

在常规操作系统中,任务调度程序并不是很严格。也就是说,处理器每秒会执行这么多指令,但它有时可能不会这样做。例如,一项任务可能被抢占以允许执行更高优先级的任务(并且可能执行更长的时间)。在 RTOS 中,处理器将始终执行相同数量的任务。

此外,通常有完成任务的时间限制,之后会报告失败。这在常规操作系统中不会发生。

显然还有更多细节需要解释,但以上是 RTOS 中使用的两个重要设计方面。

于 2009-02-11T12:14:32.890 回答
2

您的 RTOS 的设计方式可以保证重要事件的计时,例如硬件中断处理和在需要时准确唤醒睡眠进程。

这个精确的时间允许程序员确定他的(比如说)起搏器会在需要的时候准确地输出一个脉冲,而不是几十毫秒后,因为操作系统正忙于另一个低效的任务。

它通常是一个比成熟的 Linux 或 Windows 更简单的操作系统,仅仅是因为它更容易分析和预测简单代码的行为。没有什么可以阻止像 Linux 这样的成熟操作系统在 RTOS 环境中使用,并且它具有 RTOS 扩展。由于代码库的复杂性,它无法保证它的时序可以降低到与较小的操作系统一样小的规模。

RTOS 调度器也比通用调度器更严格。重要的是要知道调度程序不会改变您的任务优先级,因为您已经运行了很长时间并且没有任何交互式用户。大多数操作系统会降低此类进程的内部优先级,以支持不应看到界面滞后的短期交互式程序。

于 2009-02-11T12:51:25.343 回答
2

您可能会发现阅读典型 RTOS 的源代码很有帮助。那里有几个开源示例,以下通过一些快速搜索产生了链接:

µC/OS-II是一个有据可查、以源代码形式提供且易于使用的商业 RTOS 。它有一个非常宽松的教育用途许可证,并且(稍微过时的版本)它的源代码可以绑定到一本书中,使用实际实现作为示例代码来描述其操作理论。这本书是Jean Labrosse 的MicroC OS II: The Real Time Kernel

这些年来,我在几个项目中使用了 µC/OS-II,我可以推荐它。

于 2009-04-28T07:39:59.220 回答
0

重要的是实时应用程序,而不是实时操作系统。通常实时应用程序是可预测的:许多测试、检查、WCET 分析、证明……已经执行,表明在任何特定情况下都能满足最后期限。

碰巧 RTOS 有助于完成这项工作(构建应用程序并验证其 RT 约束)。但我见过在标准 Linux 上运行的实时应用程序,更多地依赖硬件功能而不是操作系统设计。

于 2009-02-11T12:21:24.340 回答
0

我没有使用过 RTOS,但我认为这就是它们的工作方式。

“硬实时”和“软实时”是有区别的。您可以在 Windows 等非 RTOS 上编写实时应用程序,但它们是“软”实时的:

  • 作为一个应用程序,我可能有一个线程或计时器,我要求 O/S 每秒运行 10 次......也许 O/S 会在大多数情况下这样做,但不能保证它会一直能够......这种缺乏保证就是它被称为“软”的原因。操作系统可能无法做到这一点的原因是不同的线程可能使系统忙于做其他事情。作为一个应用程序,我可以将我的线程优先级提高到例如HIGH_PRIORITY_CLASS,但即使我这样做了,O/S 仍然没有我可以用来请求保证我将在特定时间运行的 API。

  • 一个“硬”实时 O/S 确实(我想)有让我请求有保证的执行切片的 API。RTOS 可以做出此类保证的原因是它愿意异常终止线程,这些线程花费的时间超出预期/超出了允许的时间。

于 2009-02-11T12:41:44.337 回答
0

... 好 ...

实时操作系统试图确定性并满足最后期限,但这完全取决于您编写应用程序的方式。如果您不知道如何编写“正确”的代码,您可以制作非常非实时的 RTOS。

即使您知道如何编写正确的代码:更多的是要尝试确定性而不是快速。

当我们谈论决定论时

1) 事件决定论

对于每组输入,系统的下一个状态和输出是已知的

2) 时间决定论

… 每组输出的响应时间也是已知的

这意味着如果您有异步事件,例如中断,您的系统严格来说不再是时间确定性的。(并且大多数系统都使用中断)

如果您真的想确定性,请轮询所有内容。

...但也许没有必要 100% 确定性

于 2009-05-18T11:58:44.507 回答
0

教科书/面试的答案是“确定性先发制人”。如果更高优先级的进程准备好运行(在就绪队列中)或断言中断(通常在 CPU/MCU 外部输入),则系统保证在有限的时间段内转移控制。

于 2009-11-13T02:59:52.173 回答
0

他们实际上并不能保证按时完成。他们所做的使他们真正成为 RTOS 的是提供识别和处理截止日期超限的方法。“硬” RT 系统通常是那些错过最后期限是灾难性的并且需要某种关闭的系统,而“软” RT 系统是继续降级功能有意义的系统。无论哪种方式,RTOS 都允许您定义对此类溢出的响应。非 RT 操作系统甚至不检测溢出。

于 2009-11-13T03:34:04.500 回答
0

“基本上,您必须对 RTOS 中的每个“任务”进行编码,以便它们在有限时间内终止。”

这实际上是正确的。RTOS 将有一个由体系结构定义的系统时钟,例如 10 毫秒,所有任务(线程)都经过设计和测量以在特定时间内完成。例如,在处理实时音频数据时,音频采样率为 48kHz,对于任何正在处理数据的下游任务,有一个已知的时间量(以毫秒为单位),预缓冲区将变为空。因此,使用 RTOS 需要正确调整缓冲区大小、估计和测量这需要多长时间,以及测量系统中所有软件层之间的延迟。然后可以满足最后期限。否则申请将错过截止日期。这需要分析整个堆栈中的最坏情况数据处理,一旦知道最坏情况,系统就可以设计用于,例如,

实时操作系统网络应用程序设计的示例时序图在 EE Times 的这篇文章中, 产品操作方法:在基于 VoIP 的电话设计中提高实时语音质量 http://www.eetimes.com/ design/embedded/4007619/PRODUCT-HOW-TO-Improving-real-time-voice-quality-in-a-VoIP-based-telephony-design

于 2011-07-13T23:39:12.437 回答
-1

基本上,您必须对 RTOS 中的每个“任务”进行编码,以便它们在有限时间内终止。

此外,您的内核将为每个任务分配特定的时间,以确保某些事情在某些时间发生。

但是请注意,这不是一件容易的事。想象一下像虚函数调用这样的事情,在 OO 中很难确定这些事情。此外,RTOS 必须根据优先级仔细编码,它可能需要在 x 毫秒内为 CPU 分配高优先级任务,这可能很难做到,具体取决于您的调度程序的工作方式。

于 2009-02-11T12:17:00.903 回答