C# .NET 是否可用于硬实时?

11
鉴于熟悉的.NET形式在Windows上运行,而Windows不是实时操作系统,而MONO在Linux上运行(标准内核也不是实时操作系统)。同时,任何提供垃圾回收(如“托管” .NET)的内存分配方案,以及任何堆内存方案都会引入非确定性的、潜在的非平凡的延迟到应用程序的执行行为中。
是否存在一种备选主机操作系统和编码范例的组合,可以利用C# .NET的所有功能和便利性,同时实现一个解决方案,该解决方案可以在严格指定的时间限制内执行指定的代码部分?例如,每隔10ms启动一个C#方法,容忍小于1ms的偏差,完成时间仅由方法本身执行的工作决定?
显然,必须仔细编写应用程序;时间关键代码必须避免内存分配;一旦启动了硬实时循环,应用程序必须完成所有内存分配等工作,并且没有其他线程活动。此外,主机操作系统必须支持实时调度。
这在.NET / MONO框架内是否可行,或者是否被.NET运行时、框架和支持它(或兼容的等效物)的操作系统的设计所排除?
例如:使用类似于NETduino的C#语言,是否可能在微小粒度(约1毫秒)机器控制方面进行可靠的操作?它们是否有限制或需要替代策略来满足这些应用程序的需求?

1
你需要先选择你的操作系统。适合编程的工具列表将会非常短,不包括带有垃圾回收器的语言。通常的解决方案是将需要硬实时响应的任务转移到微控制器上。电机控制器或PLC是常见的例子。 - Hans Passant
2个回答

10

简短回答:不行。

更长的回答:最接近的方法是在硬件上直接运行.net Micro Framework,但TinyCLR仍不能给您确定性的时间。微软有Windows CE/Windows Embedded Compact作为其实时操作系统,但即使对于较慢的任务也只能算是实时(我相信在50微秒或更长的范围内 - 不确定是否符合硬实时要求)。

我不知道是否从技术上讲可以创建一个实时C#实现,但没有人这样做,甚至.net native也不是为此而设计的。


-1

C# 可以用于硬实时吗?是的

当我们谈论实时性时,通常(如果不总是)是指机器人和物联网。为此,我们几乎总是选择以下选项之一(忘记 Windows CE 和 Windows 10 IoT):

  • 微控制器(例如:Arduino、RPi Pico、NodeMCU)
  • 基于 Linux 的 SBC(例如:树莓派、比格鲁骨头、Rock Pi)

微控制器本质上是实时的。基本上设备将永远运行循环(但某些芯片有中断和多线程)。这类别中顶级语言是 C/C++ 和 MicroPython。但也可以使用 C#:

第二个选项(基于 Linux 的 SBC)要棘手一些。操作系统完全控制硬件并具有调度程序。这样就可以在一个 CPU 上运行许多进程。操作系统本身也有很多后勤工作。

Linux有一组调度API,可用于告诉操作系统我们希望优先考虑我们的进程而不是其他进程。操作系统会尽力遵守,但不能保证。这通常被称为软实时。在.NET中,您可以使用Process.PriorityClass来更改进程的nice值。根据操作系统的繁忙程度和可用资源(CPU和内存)的数量,您可能会得到令人满意的结果。

除此之外,Linux还提供了硬实时能力,使用PREEMT_RT补丁,还有一个功能可以将CPU核心隔离为所选进程使用。但据我所知,.NET没有任何API可用于使用这些功能(P/Invoke可能有效)。


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