如何防止 cpu 用法在 labview 中改变时序?
how to prevent cpu usage from changing timing in labview?
我正在尝试编写一个代码,其中每 1 毫秒一个数字加一,应该替换旧数字。 (有点像计时器!)。
问题是,每当 cpu 使用量因 pc 上的某些其他程序 运行 而增加时,这 1 毫秒也会增加,并且我的程序中的时间会发生变化!
有什么方法可以防止 cpu 负载变化影响我程序的时序?
除非计算机有实时时钟,否则无法阻止 cpu 负载变化影响程序的计时。
如果它没有实时时钟,就没有理由期望它的行为具有确定性。您的程序需要以这样的速度 运行 吗?
您的问题的答案是 "not on a desktop computer." 这就是 LabVIEW Real-Time 和专用确定性硬件等产品存在的原因:您需要一台专注于特定流程的计算机,以便始终如一地为该流程服务。常规 Windows/Mac/Linux 桌面系统中的每个应用程序都存在您看到的可能被其他系统进程中断的问题,特别是在其 UI 层中。
听起来好像您正在尝试使用软件计时通过数模转换器卡生成模拟输出波形,其中您的软件负责确定什么值应该在任何给定时间输出并相应地更新输出。
这对于静止或低速信号是可行的,但您正尝试以 1 毫秒的间隔执行此操作,换言之,每秒输出 1000 个样本或 1 ks/s。您无法在桌面操作系统上可靠地执行此操作 - 有太多其他进程正在进行,这些进程可能会占用 CPU 时间并阻止您的程序从 运行ning 持续数毫秒(甚至几秒,例如网络访问)。
您可以通过以下几种方法解决此问题:
- 如果您的模拟输出设备支持,请使用缓冲、硬件时钟输出。您不是一次写入一个样本,而是向设备发送一个波形或样本数组,然后它使用硬件中生成的定时信号定期输出它们。不幸的是,低端 DAQ 设备通常不支持硬件时钟输出。
- 与其期待将样本写入 AO 的循环每毫秒 运行,不如在循环中读取 LabVIEW 的 Tick Count (ms) 值并使用它作为样本数组的索引:而不是尝试输出每个样本,你的代码现在会说 'what time is it now, and therefore what should the output be?' 这不会给你一个完美的信号,但至少现在它应该保持正确的频率而不是'slowed down' - 相反,只要循环跟不上,您就会看到信号上出现毛刺。这很容易测试,也许足以满足您的需求。
- 使用 实时操作系统 而不是桌面 OS。对于 LabVIEW,这意味着使用实时软件模块和支持 RT 的 National Instruments 硬件设备,例如 CompactRIO 系列,或者如果硬件兼容,则在专用 PC 上安装 RT OS .显然,这不是一个便宜的选择(除非它严格用于 personal, home use)。在任何情况下,您的输出设备都需要一个兼容 RT 的驱动程序。
- 使用您计算机的声音输出作为输出设备。 LabVIEW 具有用于缓冲声音输出的函数,您应该能够获得可靠的结果。您需要将信号上采样到声音输出的可用采样率之一,可能是 44.1 ks/s。缺点是输出电平范围有限且未校准,并且可能是交流耦合的,因此您无法输出直流或非常低频的信号。但是,如果电平适合您要连接的对象,或者您可以添加合适的信号调节,这可能是一个很好的解决方案。如果您需要校准输出电平,您可以同时使用您的 DAQ 卡测量它并缩放您正在输出的声音波形以保持其正确。
我正在尝试编写一个代码,其中每 1 毫秒一个数字加一,应该替换旧数字。 (有点像计时器!)。
问题是,每当 cpu 使用量因 pc 上的某些其他程序 运行 而增加时,这 1 毫秒也会增加,并且我的程序中的时间会发生变化!
有什么方法可以防止 cpu 负载变化影响我程序的时序?
除非计算机有实时时钟,否则无法阻止 cpu 负载变化影响程序的计时。
如果它没有实时时钟,就没有理由期望它的行为具有确定性。您的程序需要以这样的速度 运行 吗?
您的问题的答案是 "not on a desktop computer." 这就是 LabVIEW Real-Time 和专用确定性硬件等产品存在的原因:您需要一台专注于特定流程的计算机,以便始终如一地为该流程服务。常规 Windows/Mac/Linux 桌面系统中的每个应用程序都存在您看到的可能被其他系统进程中断的问题,特别是在其 UI 层中。
听起来好像您正在尝试使用软件计时通过数模转换器卡生成模拟输出波形,其中您的软件负责确定什么值应该在任何给定时间输出并相应地更新输出。
这对于静止或低速信号是可行的,但您正尝试以 1 毫秒的间隔执行此操作,换言之,每秒输出 1000 个样本或 1 ks/s。您无法在桌面操作系统上可靠地执行此操作 - 有太多其他进程正在进行,这些进程可能会占用 CPU 时间并阻止您的程序从 运行ning 持续数毫秒(甚至几秒,例如网络访问)。
您可以通过以下几种方法解决此问题:
- 如果您的模拟输出设备支持,请使用缓冲、硬件时钟输出。您不是一次写入一个样本,而是向设备发送一个波形或样本数组,然后它使用硬件中生成的定时信号定期输出它们。不幸的是,低端 DAQ 设备通常不支持硬件时钟输出。
- 与其期待将样本写入 AO 的循环每毫秒 运行,不如在循环中读取 LabVIEW 的 Tick Count (ms) 值并使用它作为样本数组的索引:而不是尝试输出每个样本,你的代码现在会说 'what time is it now, and therefore what should the output be?' 这不会给你一个完美的信号,但至少现在它应该保持正确的频率而不是'slowed down' - 相反,只要循环跟不上,您就会看到信号上出现毛刺。这很容易测试,也许足以满足您的需求。
- 使用 实时操作系统 而不是桌面 OS。对于 LabVIEW,这意味着使用实时软件模块和支持 RT 的 National Instruments 硬件设备,例如 CompactRIO 系列,或者如果硬件兼容,则在专用 PC 上安装 RT OS .显然,这不是一个便宜的选择(除非它严格用于 personal, home use)。在任何情况下,您的输出设备都需要一个兼容 RT 的驱动程序。
- 使用您计算机的声音输出作为输出设备。 LabVIEW 具有用于缓冲声音输出的函数,您应该能够获得可靠的结果。您需要将信号上采样到声音输出的可用采样率之一,可能是 44.1 ks/s。缺点是输出电平范围有限且未校准,并且可能是交流耦合的,因此您无法输出直流或非常低频的信号。但是,如果电平适合您要连接的对象,或者您可以添加合适的信号调节,这可能是一个很好的解决方案。如果您需要校准输出电平,您可以同时使用您的 DAQ 卡测量它并缩放您正在输出的声音波形以保持其正确。