什么代码不应该写成实时代码?

时间:2012-04-05 09:21:49

标签: linux api real-time xenomai

Xenomai's API of Posix skin中,我找到以下内容:

  

POSIX皮肤。
  时钟和计时器服务。
  条件变量服务。
  中断管理服务。
  消息队列服务。
  互斥服务。
  信号量服务。
  共享内存服务。
  信号服务。
  线程管理服务。
  线程取消。
  线程调度服务。
  线程创建属性。
  特定于线程的数据。

我看不到有关文件处理套接字编程的任何内容,所以我猜测文件处理和套接字可能不是实时处理的?猜错了吗?

请指导。

2 个答案:

答案 0 :(得分:4)

Xenomai及其起源RTAI都控制了您的调度程序,将Linux内核本身作为非实时线程处理。

他们提供了许多服务,其中大部分服务都与线程和同步化有关,这些服务不会调用Linux API(在内核空间中)或系统调用(在用户空间中)。如你所知,实时是关于“保证最后期限”并且调用Linux违反它(因为Linux不保证任何东西)。

由于驱动程序在实时系统中也很重要,因此它们实现了实时驱动程序模型或RTDM,可帮助在实时环境中实现和使用设备驱动程序。

内核中的文件处理非常不受欢迎。如果您正在讨论用户空间实时应用程序,那么您可以访问在RTDM中实现的任何驱动程序。如果您没有找到文件处理或套接字,那么不能使用它们。请注意,即使printf使用Linux系统调用也是禁止的。

请注意,如果您使用它们,没有任何损失,您只是失去了实时性!我个人确实使用文件进行日志记录,但只有在出现错误时才调用它们,这意味着实时已经毁了。

我不知道Xenomai,但至少在RTAI中,如果你调用Linux系统调用,那么你的内核日志中会收到类似“RTAI:LXRT更改模式:syscall ...”的警告。

答案 1 :(得分:1)

实时是整个系统的属性。为了在系统中实现实时属性,应该考虑应用于实时系统的要求来设计其所有组件(包括硬件,操作系统,驱动程序,库和应用程序)。这些组件(如RTOS)可用于构建实时系统。但它们的使用并不意味着最终系统将成为实时系统。实际上,如果系统的至少一个组件不支持实时系统的要求,那么整个系统将不是实时的!

实时系统通常拥有的资源远远超过实时任务的平均要求。未使用的资源可用于执行有用但非关键的后台任务,例如日志记录,系统状态监视,统计信息收集和分析等。执行此任务的应用程序可以设计为运行在顶部的非实时组件实时组件。如果您确定参与实时任务的所有组件都支持实时要求,则此设计是安全的。由于这个问题的直接答案:

  

完全取决于应用程序。通常,所有未用于处理实时任务的代码都可以写成非实时的。用于处理实时任务的所有代码必须写成实时的。

Xenomai正在做的是隔离非实时Linux及其用于处理特殊容器中的非实时任务的活动,该容器在RTOS内核上运行并与基于RTOS的实时并行运行时间任务。要在Xenomai基础上构建实时系统,您的应用程序应仅依赖于Xenomai API以及已知且已被证明是实时的其他库和API。所有可能有用但完全不加批判的后台活动都可以写成有序的Linux应用程序。

诸如存储和网络服务之类的系统和服务通常不用于实时任务,因为常用的硬件非常不确定,因此不适合实时概念。很难说一个小修道院通过网络发送五个数据包或将文件写入HDD需要多长时间。因此,这种系统的接口并不常见。但同样,该应用程序决定了它需要什么样的实时服务。我可以想象实时任务,涉及存储和网络操作。在这种任务的情况下,设计者被迫找到这样的系统组件,这将提供实时存储和网络服务。如您所见,Xenomai不是候选人。