当前位置:首页 > 测试测量 > 测试测量
[导读]很多教科书上都提示要慎用局部变量和全局变量,主要有以下几个原因: 违背了数据流的编程 读取局部变量需要拷贝数据 不能象SUBVI一样可以重用数据BUFFER 不利于程序调试 容易引起竞争 我在论坛上看到很多初学

很多教科书上都提示要慎用局部变量和全局变量,主要有以下几个原因:

违背了数据流的编程
读取局部变量需要拷贝数据
不能象SUBVI一样可以重用数据BUFFER
不利于程序调试
容易引起竞争
我在论坛上看到很多初学者的程序,里面充满了大量的局部变量,可以这样说,当你使用了过多的局部变量的时候,你的程序结构是有问题的,在早期的LV版本中根本不存在全局变量和局部变量,同样可以编制规模很大的程序,这说明局部变量和全局变量并不是必须的,LV提供了它们是因为在特定的情况下可以简化编程。

当我们使用SUBVI时,我们需要定义一个连接器,包括输入输出端子,调用VI的数据从输入端子进入,当SUBVI未执行完毕时,数据是不会流出到输出端子的,因此,SUBVI可以重用调用VI的数据缓冲区。而局部变量可以在子VI的任何位置被读写,局部变量在同一一个VI中,全局变量可以在任何VI中,所以通常情况下,无法重用数据缓冲区。

局部变量用于读写一个VI的前面板对象,对象是控制器或者指示器都可以,当我们读局部变量的时候,我们是在对象的当前状态,而对象在程序框图中的其它位置,其它的线程可能连续写这个对象,所以LABVIEW无法重用内存,不得不拷贝数据到新的缓冲区中,如果数据结构很大,就会占用相当多的内存。

很多情况下,局部变量都是可以避免的,看下面的例子。



上面图中的设计方式,在很多初学的程序中经常碰到,同样的数据要传到两个VI中,并且有次序要求,因此采用了顺序结构。问题是根本没有必要用局部变量,局部变量导致了数据的复制。





上面的两个图完成同样的功能,一个仍然采用顺序结构,不过CLUSTER挪到了FRAME外面,通过隧道,将数据传入到两个子VI中,避免了使用局部变量。但是顺序结构本身也是效率比较低的,也是NI不建议过度使用的.

针对这个具体问题,最下面的是最好地解决方案,利用错误簇作为数据流实现了顺序处理,避免使用局部变量。通过错误簇同时也有利于程序调试跟踪.另外一个明显的优点是程序框图更清晰明了,避免了在各个FRAME中进行切换.


全局变量使用内存的方式类似于局部变量,不同的是每次读全局变量肯定要生成一份内存拷贝,而局部变量是有可能重用缓冲区的.当全局变量是一个比较大的数组或者字符串时,多处多次读操作会造成大量的内存复制,极大地占用内存,导致运行速度下降。

从使用方法的角度看,全局变量很向一个SUBVI(8。X后SUBVI也有了使用权限的问题,如私有,公有),可以被任何其它VI调用,但是有一个根本的不同,当一个SUBVI正在被其他VI调用的时候,另外一个VI如果也在调用这个SUBVI,它必须等待这个SUBVI执行完成后,(设置可重入的除外),因此,尽管LABVIEW是并行的,多线程的,但是具体到这个SUBVI,却是有顺序的,需要控制权的,因此,LABVIEW很容易对SUBVI进行缓存重用。

所以,对全局变量,尤其是针对数组或者字符串,尽管它可以直接被调用,最好也要封装成一个SUBVI来使用,这样可以极大提高内存使用效率,同时避免了竞争的问题。

在循环中调用全局变量尤其要注意,每次多全局变量的时候,LV必须先复制这个数据,看下面的例子


上面的两个图中,黑色的需要反复调用内存管理器1000次,发生1000次内存复制,而下面的只需要一次内存复制。

如果COUNTER是一个庞大的数组,程序的运行效率会有惊人的不同。

如果用SUBVI封装全局变量,不如直接用FUNCTION GLOBAL,我在其他的文章中详细介绍过。

局部变量和全局变量另外一个问题是数据竞争的问题。认为任何时刻,该全局变量或者局部变量都可以被读写,这个问题在其它语言中也存在,所以要采用临界或者互斥的方法来避免。

封装成SUBVI,对调用者来说,就实现了互相排斥,任何时刻,只能有一个调用者使用这个SUBVI。

对于编程者来说,有很多方法可以避免全局变量。

使用FUNCTION GLOBAL(也叫LV2型全局变量)
使用队列或者通告
使用用户事件结构
使用控件参考

既然说了全局变量有各种各样的问题,但不是说全局变量是毫无用途的,我用全局变量最多的是用它来定义常量。

C语言中,可以用DEFINE来定义常量。
#define pi 3.14159

同理,我们可以把常量都放在同一个GLOBAL文件中。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

NI提供的软件包经济省时,不仅帮助开发人员节省时间,还为创客提供了新的机遇

关键字: LabVIEW 自动化测试系统

强大的图形化编程工具使整个测试和测量过程的各个方面实现可视化

关键字: LabVIEW 图形化编程工具

摘要:对于每一型新机试飞,或者是重大的研究性试飞和验证试飞,都必须实施遥测监控。现基于TTS(TextToSpeech)语音合成技术,结合飞行试验遥测监控系统的不足,利用TTS引擎在LabVIEW开发环境下设计并实现了遥...

关键字: 飞行试验遥测监控系统 TTS LabVIEW

在科研以及应用软件领域,LabVIEW和MATLAB作为比较常用的2款工具,相信很多人都用过吧。简单的概括一下,LabVIEW侧重测试测量和数据采集,MATLAB侧重科学计算和数据分析。

关键字: LabVIEW matlab 混合编程

摘要:利用单片机和虚拟仪器LabVIEW在PC端设计了温湿度测量及控制系统,用于温湿度数据监测。该系统上位机为PC端监控界面,下位机为单片机,单片机采集温湿度数据,并将采集到的数据通过串口发送给监控界面进行监测和管理。该...

关键字: DHT11 LabVIEW 单片机

摘要:当前闭环步进电机在自动化设备中的应用越来越广泛,故为了进一步满足闭环步进电机的应用需求,采用LabVIEW上位机+运动控制卡+驱动器模块的控制方案进行了多轴运动系统的设计,通过设计的上位机软件实现闭环步进电机的实时...

关键字: 闭环步进电机 精度测试 LabVIEW

由上图中可以知道进程地址空间中最顶部的段是栈,代码中调用函数、定义局部变量(但不包含static修饰的变量)或声明的类的实例等等都要使用栈空间,当函数执行完(也就是程序执行超过了这个函数的作用范围的时候),操作系统会把该...

关键字: 进程地址 局部变量 函数

摘要:为满足某扭矩检测试验标准要求,基于LabView设计开发了一款扭矩检测装置,该装置能检测某类零部件的断裂力矩,满足试验标准要求,其他零部件的扭矩也可在该装置上检测。类似的扭矩装置可参考该装置进行设计。

关键字: 伺服电机 LabVIEW PLC

在下述的内容中,小编将会对LabVIEW的相关消息予以报道,如果LabVIEW是您想要了解的焦点之一,不妨和小编共同阅读这篇文章哦。

关键字: LabVIEW 测试测量 NI

一直以来,LABVIEW都是大家的关注焦点之一。因此针对大家的兴趣点所在,小编将为大家带来LABVIEW的相关介绍,详细内容请看下文。

关键字: LabVIEW 测试测量 测试仪器
关闭
关闭