LabVIEW 可重入
LabVIEW 新建的 VI 中,默认为不可重入,它只有一份数据空间,在同一时刻只能有一个调用方运行该 VI,其他调用方则必须“等轮到自己”。
使用非可重入子 VI 的理由:
节省硬件空间(资源)。非可重入 VI 只使用硬件的一个空间。如果您 FPGA 应用中空间是一个重要问题,您可以将可重复利用的代码写入到非可重入子 VI 中以节省空间。
在一个 VI 中只有一个子 VI 的实例。当只有一个子 VI 实例时,您的选择就没有任何区别。因此,请保留默认设置。
非可重入子 VI 可以用来在独立循环间存储以及传输数据。由于该子 VI 的所有调用者都使用相同的门资源,因此最后一个调用子 VI 而得到的值可以用在下一个调用者中。LabVIEW 的 VI 可以设置为可重入
如果选择了在实例间共享副本, 该 VI 就会有一个数据空间池(也称为副本池)。在调用 VI 开始时,最初只创建两个副本。一个调用方将使用这两个数据空间之一,但不一定是哪个。后来的调用方也可能使用不同的实例。当数据池中的数据空间(副本)少于同时调用方的数量时,将会创建新的数据空间(副本)并将它们添加到池中。“实例间共享副本”中的“之间共享”一词意味着随着时间的推移,这些数据空间可以被多个调用方使用。如果该子 VI 有 20 个调用方,但这 20 个调用方中只有 2 个会同时运行,那么池中就将只有两个数据空间,这两个空间会在 20 个调用方间被“共享”。这种可重入方式的优点是能优化存储空间的使用。只根据当前需求创建必要数量的副本。
相比之下,如果选择了预分配副本选项,将会为每一个调用方创建一个私有的数据空间(和副本)。如果该 VI 有 20 个调用方,就将在调用 VI 开始时创建 20 个副本并将它们添加到池中。如果调用模式像上面描述的一样,可能每次只有两个调用方同时运行。当每个调用方使用同一子 VI 的副本很重要时(例如,如果子 VI 需要在每次调用后保持数据),那么就使用这种可重入 VI。. 在这种情况下共享副本类型将无法工作,因为您无法知道最后一次调用的是子 VI 的那个实例和将使用的是哪个实例,且存储的信息将会在子 VI 间发生无法预知的“串扰”。“预分配”意味着每次调用时,都会为该调用方创建一个数据空间和副本。预分配发生在 VI 运行前。
如果您希望同时打开同一 VI 的多个前面板,可重入子 VI 选项就无法做到。为了打开一个 VI 的多个实例,有两种方法可供选择:
如果您希望多次打开的是一个顶层 VI, 可以将该顶层 VI 复制到一个临时路径下并取不同的名字,然后再打开这个新的文件实例。但子 VI 就没有必要使用复制,仅顶层 VI 需要使用这种复制的方法。您可以使用 VI 服务器打开并运行副本。
第二种方法是将多实例面板放入一个模板 VI 中,然后每次从该模板 VI 打开文件。VI 模板是扩展名为.vit 的 VI。您可以从文件»新建»基于模板下面的模板创建一个新 VI。这将创建一个新的 VI 实例,它有自己的存储空间。
您可以使用 VI 服务器打开 VI 和 VI 模板。VI 服务器用于动态加载并运行 VI。对于带有子 VI 的情况,只有加载顶层 VI 时子 VI 才被加载。当您动态加载一个 VI,而不是将它作为子 VI 时,它的代码将不会被加载直到 VI 服务器调用该子 VI。这会节省内存和启动时间。
使用可重入子 VI 的理由:
您的子 VI 有两个及更多的循环。在并行循环中将子 VI 设置为非可重入可导致循环要等待每次的执行,而无论子 VI 被同一时间调用还是正在运行。这会在维护实时性上导致无法预料的抖动。这会降低运行速率。
空间没有限制,而速度是重要的。您的程序相对较小,但是需要以较高速率保持实时性,或者需要快速运行。
并行线程需要有它们自己实例的子 VI,以保证子 VI 的调用者之间不会出现数据传输的情况。