与 std Linux 内核相比,在 RT Linux 内核上编程实时 C++ 应用程序(用户空间和 Linux 驱动程序)是否有任何问题?
Linux RT 补丁对内核调度程序、信号量、静音等进行了更改,我想知道这些更改对开发人员是否是透明的?或者在写这样的申请时需要特别注意吗?
答案1
取决于 - 如果您实际上开发使用互斥体和信号量的内核空间驱动程序,您应该快速检查补丁。作为开发人员,这是您的责任,网站上的任何答案都无法解决该问题。
如果您主要开发用户空间软件,这些更改不会影响您,因为您只与内核接口发生争执,而内核接口应该是稳定的。
请记住,对于强实时要求,通常不建议使用用户空间应用程序。
由于大多数主要发行版都提供 RT 内核,我得出的结论是:不,除了 RT 乐趣之外不需要任何特殊的东西 - 一般请记住以下几点:https://rt.wiki.kernel.org/index.php/HOWTO:_Build_an_RT-application
答案2
我没有使用 C++ 编写 RT 应用程序的经验:我使用了 Ada;另外,Erlang 也可能适合。 (还有RT Java,但我没有经验。)
原则上,考虑到 IPC 工具(如您所提到的)和多道程序设计工具:fork
等,使用 C++ 应该不是问题。在您掌握显式内存管理之前,它很容易出错。
RT Linux 是普通Linux 的扩展。 (这对于许多 RTOS 来说很常见 - 它们是非 RT 的扩展,但分时、操作系统。)
为了使RT任务与非RT进程共存,RTOS采取了某些措施:例如,将任务锁定在内存中,或者为它们分配比进程更高的优先级。目的是确保任何非 RT 进程都不会阻塞 RT 任务(因此可能导致其无法满足截止日期 - RTS 的全部目的就是防止这种情况发生)。
对于 RT Linux,它将为 Linux 内核分配最低优先事项。
RT Linux 位于 Linux 内核之下,硬件之上。但 Linux 内核不会注意到这一点:它将硬件和 RT Linux 视为一个整体(即作为硬件)。尽管如此,所有硬件中断都会被RT Linux内核拦截,其中一些(与RT任务相关的)将由RTOS处理(其余的将传递给普通Linux内核处理)。
RT Linux 使用 RT 调度算法来确保“可预测”行为(用 RT 术语来说),即所有任务都满足其最后期限。这与 Linux 不同,Linux 不能做出任何此类保证。此外,RT Linux 不支持虚拟内存,因为这(来回交换)会导致更长(无限制)的上下文切换,从而导致不可预测的延迟时间。 (事实上,所有 RT Linux 任务都可以完全访问硬件。)