精确的定时是实时应用程序的关键性因素。抖动是指程序的执行事件没有满足确定性预期。本章节介绍如何在实时应用程序中减小抖动。

避免引起抖动的常见源

不要在实时循环中加入非确定性的内容,以减少程序执行时间的抖动。常见的抖动源包括:

  • 内存分配 – 先预分配数组,然后在确定性循环中使用数组,避免确定性循环中可变大小的数据结构。使用替换数组子集函数对确定性循环中的预分配数组进行操作。使用Real-Time Trace Viewer识别等待内存系统事件标识,该标识表示内存管理操作。
  • 打开和关闭引用 – 在初始化阶段(进入确定性循环之前)打开引用,在关闭阶段(确定性循环终止之后)关闭引用。打开和关闭引用会影响循环的确定性。
  • 通信 – 与确定性循环通信时,使用RT FIFO函数或启用了Real-Time FIFO的共享变量。RT FIFO将数据存放在缓冲区中,确定性循环可访问数据,不受低优先级循环的影响。
  • 共享资源 – 避免访问共享资源,如硬件资源、I/O通道或确定性循环和其他循环中的非重入VI。同时访问某共享资源是引起抖动的常见原因。如确定性循环使用其他循环同时也在使用的硬件资源或非重入VI,确定性循环可能需要等到低优先级的循环释放后才能使用这些资源。
  • 文件I/O – 在确定性循环中避免文件I/O操作。访问硬盘会引起确定性循环的执行时间抖动。
  • 异步I/O – 在定时循环或实时VI中避免异步I/O操作。LabVIEW通过轮询操作来确定操作是否已完成。轮询会引起抖动,还会阻止低优先级任务运行。建议使用同步操作。同步任务会一直运行到结束,保证读/写操作在完成之前不被轮询。使用GPIB读取、GPIB写入、VISA读取、VISA写入、VISA等待事件时,同步和异步操作的区别较大。如要在定时循环或实时VI中使用这些函数,右键单击函数,从快捷菜单中选择同步I/O模式»同步,将函数切换为同步I/O模式。其他函数可能也需该配置。
  • 网络互连 – 不要在确定性循环中进行网络互连。网络互连会引入确定性循环的无约束抖动。
  • 无约束的算法 – 某些算法的性质是非确定性的。不要在确定性循环中使用无约束的算法。如不确定VI或函数的抖动特性,建议先进行基准测试。

创建定时策略

对于不间断的重复的循环,需创建一致的定时策略以保证精确定时。LabVIEW Real-Time模块的定时策略包括循环结构和定时源。LabVIEW Real-Time模块包含了大量可用于控制循环定时的定时方法和定时源。

选择循环

除标准的While循环之外,LabVIEW还具有内置定时功能的定时循环。使用定时循环的输入和输出端,确认应用程序的定时特性。下表总结了两种循环结构的特性:

循环结构 特性 优点 缺点
While循环 基本的循环结构,多线程 CPU开销较小 无内置定时功能
定时循环 单线程循环结构,用于多速率应用程序 内置时间控制、定时数据、CPU选择、优先级控制;易于确定性调度的单线程 CPU开销大于While循环

选择定时源

无论使用的是定时循环或While循环,选择一个合适的定时源驱动循环的各个循环定时。

While循环定时源

在While循环中放置定时VI或函数,可控制While的定时设置。下表总结了LabVIEW Real-Time模块可用的内置定时VI和函数:

使用场景 定时方法 内置定时源
通过硬件定时I/O同步循环 硬件定时I/O方法,例如,DAQmx读取VI或FPGA I/O方法节点上的等待方法 外部(取决于硬件平台)
x毫秒后延迟循环执行 等待 CPU衍生的毫秒或微秒计时器
控制循环执行速率和同步循环 等待下一个整数倍 CPU衍生的毫秒或微秒计时器
NI扫描引擎每次扫描后,触发循环运行 同步至扫描引擎 NI扫描引擎

定时循环的定时源

关于选择定时循环定时源的信息,见选择定时结构的定时源主题。

创建时间预算

创建应用程序的时间预算,有助于避免非预期的时间分配。时间预算涉及确定执行应用程序中各个循环的时间,以及设置相应的循环速率。创建和遵循时间预算有助于应用程序按照预期运行。

测量循环执行时间

将应用程序分为若干个循环后,可使用RT基准测试方法确定应用程序中各个循环所需的时间。基准测试运行上千个循环计数,然后将其中最长的执行时间用作循环的预期持续时间。

注: 分析执行时间时,不要使用高亮显示执行过程工具。高亮显示执行过程会显著降低执行速度。

创建时间预算表

测量循环的执行时间后,记录每个循环的持续时间和周期,创建应用程序的时间预算表,如下列范例所示:

任务/循环 持续时间(µS) 周期(µS)
控制 400 1000
监视 3000 10000
记录 16000 30000

降低CPU使用率

CPU的使用率在100%以下时,可降低抖动并确保应用程序无需抢占CPU时间。创建时间预算表后,可通过下列公式确定理论CPU使用率。

CPU使用率(%) = 100 * Sum[Loop 1, Loop 2,.., Loop n](持续时间/周期)

将表中的数据代入公式,得到该例中CPU的使用率是:100 * (400/1,000 + 3,000/10,000 + 16,000/30,000) = 123%。因为该范例中的监控循环的优先级高于记录循环,实时操作系统在控制循环完成后立即调用监控任务。实时操作系统只有在监控循环完成一次循环后才开始记录,留出的时间不足以满足要求的周期。

在该情况下,可延长一个循环或多个循环的周期,保证循环按指定速率运行。例如,将监控循环的周期延长为25,000 µS,将记录循环的周期延长为80,000 µS,理论CPU使用率将变为100 * (400/1,000 + 3,000/25,000 + 16,000/80,000) = 72%。

注: 如无法延长循环的周期,可使用其他方法来降低RT终端的CPU使用率。