如何区分RTOS和Linux?

时间:2019-03-27 15:49:41

标签: c ubuntu rtos qnx

我正在运行QNX RTOS和Ubuntu 17.10。问题是,除了QNX是RTOS之外,我没有任何证据证明它的行为类似于RT系统。我应该在每个OS上运行哪种应用程序,从而使我可以清楚地区分RTOS和Ubuntu的RT响应?

我在两个程序上都运行了一个信号处理程序(中断处理程序),看哪个程序首先捕获中断。

Task

我希望在线程继续打印#include <stdio.h> #include <stdlib.h> #include <signal.h> #include <pthread.h> void sig_hand(int sig) { printf("signal received\n"); exit(0); } void *sigfun(void *arg) { signal(SIGINT, sig_hand); while(printf("Thread running\n")); return NULL; } int main(void) { pthread_t th; pthread_create(&th,NULL,sigfun,NULL); pthread_join(th,NULL); return 0; } 的同时,与Ubuntu相比,QNX将获取中断并更快地停止线程。但是,我认为没有什么不同,可能这不是找出更快的RT响应的正确应用。 谁能建议我一种更好的方法来区分RTOS和Ubuntu?

2 个答案:

答案 0 :(得分:1)

RTOS不会神奇地将您的代码转换为“实时”;而是完全确定性地支持实时。

诸如Linux之类的通用OS(GPOS)通常使用循环等优先级的分时调度程序,从而在许多进程中“公平地”节省时间。这样,运行的过程越多且越忙(使用更多的可用时间片),则响应变得越慢。

另一方面,RTOS通常具有基于抢占式优先级的调度程序,因此,具有最高优先级的就绪任务无论如何都将立即运行,并且将继续运行,直到其自身挂起或更高优先级的任务就绪为止。在这样的系统中,您必须适当地分配优先级,以确保所有任务每次都能按时运行。通常,运行时间最短和确定性最高的任务应具有最高优先级。至关重要的是,尽管RTOS支持实时确定性行为,但开发人员要承担大量责任,以适当地设计任务和优先级。

因此,您不能简单地运行一些任意的第三方代码并期望演示实时性能。您需要编写特定的测试代码。最简单的说,您可能有一个在短期定期计时器上阻塞的过程,并且在该任务中获得了实时时间并分析了观察到的定时抖动。实时系统应该具有最小的抖动(取决于其优先级和运行的更高级别的任务或中断),并且不会受到优先级较低的任务的影响,而GPOS将表现出更大的可变性,尤其是在运行其他任务时。 / p>

对于Linux构建,有一个实时调度程序选项,但这远非完美。如果您发现自己在ICU上获得生命支持,请担心呼吸器是否正在运行Linux!

答案 1 :(得分:0)

首先,了解“实时”意味着目标是最大程度地减少最坏情况的时间。通常,这涉及牺牲平均案件时间,这意味着“实时”通常意味着“平均速度较慢”。

这也意味着要比较操作系统的“实时性”,您要测量最坏情况下的时间(而不是平均时间)。

举一个随机的例子,假设您是否进行了5000万次相同的操作(例如,分配RAM的某些页面);并发现在一个OS上,最坏的情况时间是5000纳秒(但是总是要花5000纳秒,因此平均情况时间也是5000纳秒);并且发现在其他OS上,最坏的情况时间是7000纳秒,但几乎总是需要100纳秒的时间(而平均情况时间是123纳秒)。通过比较最坏情况的时间(5000对70000),您知道第一个OS是更好的实时OS。通过比较平均案例时间(5000与123),您知道第二个OS是更好的“非实时” OS。

请注意,大多数现代CPU(例如80x86)并非实时设计的。要衡量实际最坏的情况,您需要同时发生多个“不太可能”的事情(例如,CPU变热并被迫进入“变慢以避免融化”模式,同时芯片组用系统管理工具中断了OS,同时其他CPU和/或设备碰巧正在占用内存或总线/链接;而您正试图衡量最坏的情况。换句话说,要安排条件使其“恰到好处”以击中最坏的情况,将需要付出大量的努力(以及许多尝试)。