LabVIEW处理许多内存的细节操作,方式类似于传统的文本语言。例如,向数组或字符串添加新信息时,LabVIEW将分配新的内存空间来容纳新的数据或字符串。不再需要数据时,LabVIEW取消分配相关的内存。使用LabVIEW时需考虑下列内存因素:

  • 分配内存会造成抖动。
  • RT终端内存可能不足。
  • RT终端连续内存可能不足。连续内存是一组分配给进程的连续内存地址。(NI Linux Real-Time) NI Linux Real-Time终端含有内存管理单元,因而较少发生连续内存不足的情况。

设计考虑内存的VI

NI为设计考虑内存的VI用于RT终端时提供下列建议:

  • 始终预分配数组空间,数组的大小为可能使用的最大容量。
  • 定义用于RT终端的LabVIEW类时,不要定义需要大量内存的默认值,例如,较大的数组或字符串。在RT终端上使用LabVIEW类时,“请求释放内存”函数在某些情况下实际上是分配内存。如类的默认值包含较大的大小可变的数据结构,例如,数组、字符串等,应用程序将设置类实例为较小的数组或字符串,“请求释放内存”函数分配内存,因为函数将把数据设置为数据类型的默认值。

连续内存冲突范例

下图演示了应用程序的最大数组未预先分配足够空间时将如何引起连续内存冲突。

重启或重置RT终端时,RTOS和RT引擎加载至内存。RT引擎使用可用的内存运行RT终端VI和存储数据。

ArrayMaker.vi创建数组1。数组1中的所有元素在内存中是连续的。RTOS预留的连续内存空间相当于数组1使用的内存。

如停止VI后再次运行,数组与上次运行的数组大小相同或较小时,实时操作系统使用相同的内存地址。在图3中,ArrayMaker.vi创建数组2。RTOS在数组1预留的内存空间中创建数组2。分配给数组1的预留内存空间足够容纳数组2,因此不会导致连续内存冲突。数组1的多余连续内存仍位于预留的内存空间内。

ArrayMaker.vi第三次运行时使用较大的数组,或其他VI生成较大的数组,RT引擎必须找到一个足够大的连续内存空间。在图4中,ArrayMaker.vi必须在可用的内存中创建比之前数组都大的数组3。即使ArrayMaker.vi停止运行,RT引擎仍继续运行,之前预留的内存不可用。如ArrayMaker.vi第四次运行并尝试创建比数组3更大的数组时,操作将失败。没有足够的连续内存空间来创建数组。

为避免在图4中发生连续内存冲突,可预分配最大可能用到的数组存储空间。