labview深入探索------全局变量、局部变量与内存管理

2015-08-26 10:05:32来源: eefocus 关键字:labview  全局变量  局部变量  内存管理
很多教科书上都提示要慎用局部变量全局变量,主要有以下几个原因:

 违背了数据流的编程
读取局部变量需要拷贝数据
不能象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文件中。

关键字:labview  全局变量  局部变量  内存管理

编辑:什么鱼 引用地址:http://www.eeworld.com.cn/Test_and_measurement/2015/0826/article_12933.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:LABVIEW深入探索---reference(参考)和refnum(参考号)
下一篇:labview深入探索----xcontrol

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利
推荐阅读
全部
labview
全局变量
局部变量
内存管理

小广播

独家专题更多

迎接创新的黄金时代 无创想,不奇迹
迎接创新的黄金时代 无创想,不奇迹
​TE工程师帮助将不可能变成可能,通过技术突破,使世界更加清洁、安全和美好。
TTI携TE传感器样片与你相见,一起传感未来
TTI携TE传感器样片与你相见,一起传感未来
TTI携TE传感器样片与你相见,一起传感未来
富士通铁电随机存储器FRAM主题展馆
富士通铁电随机存储器FRAM主题展馆
馆内包含了 纵览FRAM、独立FRAM存储器专区、FRAM内置LSI专区三大部分内容。 
电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2017 EEWORLD.com.cn, Inc. All rights reserved