C#.NET可以用于硬实时吗
本文关键字:实时 用于 NET | 更新日期: 2023-09-27 18:20:57
考虑到熟悉的.NET形式在Windows上运行,而Windows不是实时O/S,MONO在Linux上运行(标准内核也不是实时O/S)。
此外,任何提供垃圾收集的内存分配方案(如在"托管".NET中),实际上任何堆内存方案,都会在应用程序的执行行为中引入非确定性的、潜在的非琐碎延迟。
有没有备用主机O/S和编码范式的组合,在这种组合中,可以利用C#的所有功能和便利性,同时实现一个可以在严格指定的时间限制内执行指定部分代码的解决方案?例如,每隔10ms启动一次C#方法,公差小于1ms,完成时间仅由该方法本身执行的工作决定?
显然,申请书必须写得很仔细;时间关键型代码必须避免内存分配;应用程序必须完成其所有内存分配等工作,并且一旦硬实时循环启动,就没有其他线程处于活动状态。此外,主机O/S必须支持实时调度。
这在.NET/MONO框架内是可能的,还是由于.NET运行时、框架和支持它(或兼容的等价物)的O/S的设计而被排除在外?
例如:是否有可能用像NETduino这样的东西在C#中纯粹进行可靠的细粒度(~1ms)机器控制,或者它们是否有限制或需要用于此类应用程序的替代策略?
简短回答:不。
更长的答案:你能得到的最接近的是直接在硬件上运行.net Micro Framework,但TinyCLR仍然不能给你确定的时间。微软有Windows CE/Windows Embedded Compact作为他们的实时产品,但即使如此,这也只是较慢任务的实时性(我相信在50微秒或更大的范围内——不确定这是否符合硬实时)
我不知道在技术上是否可以创建一个实时的c#实现,但没有人做过,甚至.net native也不适合这样做。
C#可以用于硬实时吗?是
当我们谈论实时性时,最常见的(如果不是总是)是机器人和物联网。为此,我们几乎总是选择其中一个选项(忘记Windows CE和Windows 10 IoT):
- 微控制器(例如:Arduino、RPi-Pico、NodeMCU)
- 基于Linux的SBC(例如:Raspberry Pi、BeagleBone、Rock Pi)
微控制器本质上是实时的。基本上,设备只会永远运行一个循环(不过有些芯片上有中断和多线程)。这一类中最热门的语言是C/C++和MicroPython。但是C#也可以使用:
- 荒野实验室(Netduino和Meadow F7)
- .NET纳米框架叉(几个板)
第二个选项(基于Linux的SBC)有点棘手。操作系统可以完全控制硬件,并且有一个调度程序。这样,许多进程可以在一个CPU上运行。操作系统本身也有很多内务管理功能。
Linux有一组调度API,可以用来告诉操作系统,我们希望您喜欢我们的进程而不是其他进程。操作系统将尽最大努力遵守,但没有任何保证。这通常被称为软实时。在.NET中,您可以使用Process.PriorityClass来更改进程的漂亮值。根据操作系统的繁忙程度和可用资源(CPU和内存)的数量,您可能会得到令人满意的结果。
除此之外,Linux还通过PREEMT_RT补丁提供了硬实时功能,并且还有一个功能可以为您选择的进程隔离CPU核心。但据我所知,.NET没有任何API来使用这些功能(P/Invoke可能有效)。