避免资源共享
- 更新时间2025-05-20
- 阅读时长3分钟
在LabVIEW中,部分资源可能由两个或两个以上VI共享。资源共享可能会造成程序执行时间的抖动,并导致应用程序无法利用多CPU的优点。常见的共享资源包括:
- 全局变量
- 非重入子VI
- LabVIEW内存管理器
- 队列操作函数
- 信号量VI
- 单线程DLL
如VI使用共享资源,VI将使用资源的操作系统互斥量,防止其他VI访问资源。互斥量独占性锁定某个资源,防止其他VI访问该资源。如实时优先级VI试图抢占了一个较低优先级VI的锁定资源,因为资源被锁定,没有可用的共享资源,实时VI必须等待。在该情况下,低优先级VI必须完成操作,释放共享资源,实时VI才能继续执行,使得低优先级VI比实时VI似乎更为重要。这种情况被称为优先级倒置,会影响VI执行的确定性。
内存分配和预分配数组
VI分配内存时,VI将访问LabVIEW内存管理器。LabVIEW内存管理器分配用于数据存储的内存。LabVIEW内存管理器是共享资源,可由互斥量锁定长达若干毫秒。在确定性VI中分配内存会影响VI的确定性。
如在确定性VI的控制循环中使用数组,进入循环之前预分配数组有助于减少抖动。
下列程序框图在循环中创建数组。每次循环时,循环中的“创建数组”函数都使用LabVIEW内存管理器为数组分配内存,会影响循环的确定性。
以下程序框图在循环外使用初始化数组函数,在循环中使用替换数组子集函数,从而创建数组。因为在循环外预分配数组的内存,循环不必在每次循环中访问LabVIEW内存管理器。
转换合适的数据类型
将RT终端VI中的数据转换为合适的数据类型。LabVIEW进行数据转换时会在内存的缓冲区中创建一个数据副本,在数据转换后保存新的数据类型。LabVIEW内存管理器必须为副本分配内存,这会影响确定性VI的确定性。创建数据缓存副本会占用RT终端上的内存资源。
转换数据类型时,应尽可能使用最小的数据类型。如要转换数组的数据类型,在创建数组之前转换。另外,只有输入和输出的数据类型一致时,函数输出才会使用输入的缓存。数组的结构和元素数量必须相等,函数输出才会复用输入缓冲。
减少使用全局变量
LabVIEW会为VI中使用的每个全局变量创建副本。减少使用全局变量,提高VI的效率和性能。创建全局变量的副本会占用RT终端上的内存资源。