嵌入式程序使用实时操作系统和不使用实时操作系统有什么区别?

3

有人能解释一下带RTOS和不带RTOS的嵌入式程序有什么区别吗?我学习嵌入式时,总是编写没有任何操作系统的代码,所有代码都分为子函数和主函数,子函数在主函数内调用,它仍然可以运行正确。为什么不需要操作系统就能运行呢?如果我将RTOS添加到我的代码中,会发生什么?感谢您的回答。


这其实是一个不错的问题。RTOS 是平台无关的,因此使用什么平台都无关紧要。而且 RTOS 可以集成到任何代码中,所以相关的代码并不重要。唯一重要的是 RTOS 有什么用处 - Tarick Welling
1
想象一下一个客人众多的酒馆,老板接单、准备食物、上菜、收款、清理所有桌子等等。现在,试着让一个专职厨师、几个服务员、一个收银员和一个打杂的人协同工作,你认为哪种情况更好? - tonypdmtr
这个问题可能涉及到“过于宽泛”。我遇到的最好的解释之一是Jean Labrosse的uC/OS-II书中的“实时概念”章节。本质上,RTOS使得确定性地调度应用程序任务并满足实时截止日期更容易。如果您的应用程序很简单,不适合多线程,或者没有硬实时约束,则可能不需要它-尽管仍然可能有优势。 - Clifford
这个问题非常好地被表述了出来(+1),初学嵌入式编程的人(以及没有实时操作系统经验的高级嵌入式程序员)都应该思考一下这个问题。这个表述还指向了典型的误解,即实时操作系统可能会为函数和子函数添加什么功能。 - HelpingHand
最终结果,我同意@tonypdmtr的最后一条评论,但为了帮助回答者,我们必须提供“如何管理一个驱动酒馆的团队”的帮助。为了保持这个比喻,不是每个酒店老板都知道如何开始雇用人员(一次性4人或更多),并变得更加高效和有利可图——而不是在第一个工资月之后破产。 - HelpingHand
显示剩余3条评论
2个回答

2
您没有给出问题的任何上下文,但是假设您正在尝试使用开发环境在某种微控制器上运行具有 免费RTOS 的程序。

无RTOS的运行是您已经理解的简单情况 - 您的程序从主函数开始运行,执行您编程的任何循环或一组动作。

运行带RTOS会添加一组 .c 文件,主要实现调度程序。在它开始其主循环之前,您需要将想要定期运行的功能注册为调度程序的任务。因此,操作系统的实现将成为您项目的一部分,并与您的程序一起编译。

总之,如果您已经决定需要运行多个任务,并且调度程序将有益于您的系统,则可以添加RTOS而不是自己实现循环逻辑。


3
这是对RTOS行为的相对简单的解释。实时任务通常不会“定期”运行,而是响应于外部事件。简单的周期性执行可以在没有RTOS的情况下实现。RTOS增加了抢占式基于优先级的调度、线程同步、资源锁定和进程间通信机制,当正确使用时可以确定性地保证对实时事件的反应时间。 - Clifford
1
感谢您的澄清,我同意该回答并未解决正确使用RTOS的原因,我将编辑答案以使其更加准确。我的意图是针对问题的真实本质。我猜想,未来寻找此类信息的人应当已经了解操作系统,并且大体上理解简单的裸机程序,并尝试升级到更为复杂的程序,此时互联网对于爱好者程序员来说会变得更不友好。 - Nomios

1
嵌入式程序有RTOS和没有RTOS的区别是什么?
您提到了答案的完美起点: 将代码分割为独立的函数、模块或类(如果我们考虑超越C和汇编语言),使用函数语法并将单独的翻译单元输入链接器工具,您可以使用RTOS将CPU分区,就像您拥有多个CPU一样,为软件实现不同的任务循环。请现在用“运行任务周期”替换“实现任务”。
请注意,与函数/模块分离不同,如果您使用C或C++,则不支持任务上下文分离。 因此,您将需要更多手动工作来集成此分离。
为什么没有操作系统它仍然可以运行?

不要将RTOS / OS内核与访问Microsoft或GNU / Debian / Fedora / SuSE基金会(或Apple或Google或IBM等)并要求操作系统时得到的内容混淆 - 他们会提供实际的操作系统内核和大量应用程序,这些应用程序可能非常必要,以便在目标系统(PC / 手机)上进行有效利用。

谈到RTOS时,我们总是考虑RTOS内核。 谈到操作系统时,我们指的是内核(除非我们像“Windows,Linux”等“操作系统”一样使用“pars pro toto”用法,在SO上不会经常发生)。 (RT)OS的内核是组织何时运行任务和何时暂停任务的组件。

如果我将RTOS添加到我的代码中,会发生什么?

起初,什么都不会发生: 您可以应用一个具有单个任务的RTOS配置,并将当前主循环软件的实现塞入该单例任务中。 这应该可以无限制地工作(如果您将并行性应用于结构化程序以形成函数 - 主函数已经是第一个函数...)。

现在,您可以从软件的分解(架构)开始,逐步添加任务,并与其他任务使用小接口。

RTOS库将通过提供进程间通信元素(事件/队列/邮箱)来实现这些接口。

在理想的基于RTOS的体系结构中,每个任务都应该作为一个邮箱项(或事件,或队列等)接收其工作数据包。 当这个任务没有其他数据项(消息、事件、队列数据等)时,RTOS内核将会阻塞该任务,并切换到另一个准备执行的任务。 因此,只有需要执行的任务才会真正消耗CPU时间。

如果有多个准备执行的任务,则下一个要运行的任务取决于您在配置RTOS库时选择的调度算法。 通常,在典型的嵌入式系统中,不同的任务被赋予不同的优先级,以便当没有更高优先级的准备就绪的任务时,任务才会占用CPU。 因此,RTOS为您提供了完美的解决方案,可以实现具有和不具有实时要求的紧急和非紧急任务,例如。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接