【问题标题】:Real-time processing with machines机器实时处理
【发布时间】:2014-02-20 06:09:07
【问题描述】:

我将用 C++ 编写一个控制大型 CNC 机床的界面,它将在 Windows 上运行。出于安全原因,我希望这个进程在它自己的核心上运行,以便它可以实时运行该进程。如果它与 Windows 共享一个内核,那么所有的 Windows 进程都会在我的进程之前被处理。基本上,我如何确保我的进程始终位于处理队列的前面,或者我如何指定一个核心来运行我的进程并让另一个核心来处理 Windows?另外,有什么方法可以看到我的程序是实时运行的。 AKA,这个核心正在处理这个程序,但是这个核心没有做任何事情,因为我们告诉程序不要在它上面运行。任何意见都会有所帮助。

【问题讨论】:

    标签: c++ real-time multicore cnc


    【解决方案1】:

    无法保证您的流程会得到实时处理。 Windows 不这样做。既然你提到了安全,那我就提一下,如果打官司,你就麻烦大了。专家证人会证明该设计本质上是不安全的。

    用户控制和显示可以在 Windows 中完成,但实时操作属于 PLC 等专用硬件。

    【讨论】:

    • 这可能是一个愚蠢的问题,但为什么我不能在我的 Windows 机器上运行一个实时操作系统来处理实时操作呢?据我了解,这在某种程度上已成为行业的标准做法。用户控制和显示由 Windows 完成,然后运行在 Windows 上的 RTOS 处理实时操作。
    • @TheBlindSpring 你可以。尽管它通常采用另一种方式 - RTOS 将 Windows 作为其任务之一运行。
    • 非常感谢,我对这个概念很陌生。你碰巧知道我在哪里可以了解到这一点。就像教程一样,其中可能包含一些非常基本的演示,展示了如何使用 RTOS,主要是如何查看并确保实时处理您想要的进程,或者如何将 Windows 作为任务之一运行?
    • @TheBlindSpring - 对“Windows RTOS”的网络搜索会找到几个候选者,包括Kuka RTOS、InTime 和Wind River。我敢肯定还有更多,但它越来越离题了。
    【解决方案2】:

    您可以使用SetThreadAffinityMask 将线程限制为在可用处理器/内核的某些子集上运行。

    如果你使用SetThreadPriority 和SetProcessPriorityClass 将一个线程设置为实时优先级,那么只有以实时优先级运行的其他线程才能中断它,有效地迫使其他线程在其他内核上运行(除非你提高两个或更多线程到实时优先级。

    【讨论】:

    • 有多少 Windows 线程以实时优先级运行,可能会中断我的进程?基本上,我的线程被中断的几率是多少?是否可以明确地说您希望线程“x”在核心“y”上运行?还是我必须信任 Windows 将线程委派给每个内核?
    • 在实时优先级下,你的线程被中断的几率基本上为零。我知道的唯一例外是硬件错误是否触发了不可屏蔽的中断。在单核机器的时代,实时优先级可能会导致真正的问题,因为它阻止了任何事情的发生,所以如果你以这种方式运行很长时间,中断不会得到服务,并且(举个例子)你的记忆不再被刷新(很快导致机器崩溃)。
    • 所以不能保证我的流程会被实时处理?这可能是描述我的目标的更好方式。用于设计、诊断、优化和设置运动控制应用程序的界面在 Windows 下运行,而生成的控制代码和机器界面在其自己的内核或 Windows 内的实时操作系统中运行。我对实时操作系统不是很熟悉,RTOS上运行的所有进程都是实时处理的吗?如果这只会让您更加困惑,我深表歉意。
    • 归根结底,不——Windows 并非设计为实时系统。大多数 RTOS(至少我见过的那些)都支持实时进程和尽力而为进程的混合。
    【解决方案3】:

    作为替代方案,Windows Embedded Compact 是一种基于实时优先级的操作系统,可以做出软实时保证(远优于 Windows Vista/7)。它的成本很高,但与其他商业 RTOS 相当。

    【讨论】:

      猜你喜欢
      • 2011-08-03
      • 1970-01-01
      • 2010-10-10
      • 2018-11-03
      • 2010-11-12
      • 2017-12-08
      • 1970-01-01
      • 1970-01-01
      • 2018-10-22
      相关资源
      最近更新 更多