很多教科书上都提示要慎用局部变量和全局变量,主要有以下几个原因:
当我们使用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 全局变量 局部变量 内存管理
引用地址:labview深入探索------全局变量、局部变量与内存管理
违背了数据流的编程我在论坛上看到很多初学者的程序,里面充满了大量的局部变量,可以这样说,当你使用了过多的局部变量的时候,你的程序结构是有问题的,在早期的LV版本中根本不存在全局变量和局部变量,同样可以编制规模很大的程序,这说明局部变量和全局变量并不是必须的,LV提供了它们是因为在特定的情况下可以简化编程。
读取局部变量需要拷贝数据
不能象SUBVI一样可以重用数据BUFFER
不利于程序调试
容易引起竞争
当我们使用SUBVI时,我们需要定义一个连接器,包括输入输出端子,调用VI的数据从输入端子进入,当SUBVI未执行完毕时,数据是不会流出到输出端子的,因此,SUBVI可以重用调用VI的数据缓冲区。而局部变量可以在子VI的任何位置被读写,局部变量在同一一个VI中,全局变量可以在任何VI中,所以通常情况下,无法重用数据缓冲区。
局部变量用于读写一个VI的前面板对象,对象是控制器或者指示器都可以,当我们读局部变量的时候,我们是在对象的当前状态,而对象在程序框图中的其它位置,其它的线程可能连续写这个对象,所以LABVIEW无法重用内存,不得不拷贝数据到新的缓冲区中,如果数据结构很大,就会占用相当多的内存。
很多情况下,局部变量都是可以避免的,看下面的例子。
上面图中的设计方式,在很多初学的程序中经常碰到,同样的数据要传到两个VI中,并且有次序要求,因此采用了顺序结构。问题是根本没有必要用局部变量,局部变量导致了数据的复制。
针对这个具体问题,最下面的是最好地解决方案,利用错误簇作为数据流实现了顺序处理,避免使用局部变量。通过错误簇同时也有利于程序调试跟踪.另外一个明显的优点是程序框图更清晰明了,避免了在各个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深入探索---reference(参考)和refnum(参考号)
下一篇:labview深入探索----xcontrol
推荐阅读最新更新时间:2024-03-30 23:03
实时操作系统μC/OS-II的改进与应用研究
传统的嵌入式系统设计大多采用单任务顺序机制,应用程序是一个无限的大循环,所有的事件都按顺序执行,与时间相关性较强的事件靠定时中断来保证,由此带来系统的稳定性、实时性较差;尤其当系统功能较复杂,且对实时性要求较严格时,这种单任务机制的弱点暴露无遗。本文引入的嵌入式操作系统μC/OS-II是一个多任务的实时内核,主要提供任务管理功能。在实时系统中的多个任务,必须决定这些任务的优先级顺序,任务调度算法需要动态为就绪任务的优先级排序。为了满足对实时性要求越来越高的需要,同时避免频繁改变就绪任务的优先级,在分析μC/OS-II源代码的基础上,对其调度算法进行改进。 1 μC/OS-II概述 μC/OS-II是一个完整的,可
[嵌入式]
基于NI PXI平台开发军用电子战模拟系统
行业: 政府/国防 产品: PXI, PXI-5421 挑战: 使用最新的商业现成技术,设计和部署灵活、可扩展的模块化电子战模拟系统。 解决方案: 使用多个PXI系统和任意波形发生器,通过T-Clock技术精确地同步并协调脉冲信号、频率信号和扫描调制波形,以生成复杂的信号波形,可以在基于远程网络架构的工作站中,满足军用电子系统综合功能测试的需求。 “NI PXI平台是集小型化、模块化与精确的同步性能于一体的完美解决方案。” 电磁谱中的战争 近几十年以来,战争的区域已经不再局限于陆地、海洋或天空,而是扩展到电子战领域。如今军方将电磁谱应用于多种战术目的。电磁谱已经被研发成为一种可以用来侦测和监视潜在的敌人军力,可以对军
[测试测量]
LabVIEW2014推出,增加可视化功能
LabVIEW 2014软件增加了新的功能,可帮助用户随时随地采集、分析和可视化数据 AUSTIN, Texas –2014年8月4日 – NIWeek –NI (美国国家仪器公司,National Instruments,简称NI)作为致力于为工程师和科学家提供解决方案来应对全球最严峻的工程挑战的供应商,今日宣布推出LabVIEW2014系统设计软件,该软件是NI平台的核心,包含了许多增强的功能,以帮助用户采集、分析和可视化数据,从而快速做出明智的决策。 LabVIEW 2014通过跨系统复用相同的代码和工程流程来标准化用户与硬件交互的方式,这一方式也使得工程师能够根据未来需求调整应用程序。随着技术的进步、需求的不断变
[测试测量]
OK6410A 开发板 (八) 52 linux-5.11 OK6410A linux内存管理相关配置
arm32 要不要配置 CONFIG_HIGHMEM 前提为 vmalloc_min 为 0xf000 0000 , 且 内核空间大小:用户空间大小 = 1:3 如果内存 = 768MB 想全部内存做 线性映射 不配置CONFIG_HIGHMEM //配置了也无所谓,如果是 vmalloc(基于vmap)会做映射,这样就是双重映射(同一个物理页,线性映射一次,vmap映射一次) 想一部分内存 做 线性映射,一部分做高端内存映射 配置 CONFIG_HIGHMEM 并将 vmalloc_min 设置为比0xf000 0000更低的值(具体取决于一部分与另一部分的比例) // 举个例子,内存有7
[单片机]
Keil调试局部变量显示"not in scope"的问题解决
今天在调试程序的时候,发现函数返回值赋值给变量时,变量值总是显示 not in scope ,无法看到变量被赋的值。 出现这种情况的原因是这个局部变量没被分配到内存,或者变量被编译器优化了。 编译器优化级别高的时候,编译器为了优化,可能并没有按照我们想要执行的代码汇编。 解决方法:降低Keil的编译优化选项,如下图所示,优化等级改为0(默认为3)。
[单片机]
基于虚拟仪器Labview实现恒温区测量系统的设计
虚拟仪器(Virtual Instrument,或VI)是计算机技术和现代测试技术相结合的产物,它不仅具有传统仪器、仪表的全部功能,同时还拥有计算机技术的全部优势,它能对数据进行处理、分析、统计并把结果以曲线、图形、图像的形式显示出来;它还具有较高的测试速度、精度,且读取数据方便、直观;它能通过网络进行数据传送,使管理人员能及时掌握测试进展并进行远程指导;在测试结束时,不仅能得到直观的测试结果还能将其打印出来或将结果以文件的形式保存起来。利用现有的微型计算机,增加少量硬件设备,用户就可以在虚拟仪器平台上设计出自己的测量仪器。 1. 引言 在半导体器件和集成电路的生产过程中,为了提高器件参数的一致性的和产品成品率,必须定期对扩散
[测试测量]
使用LabVIEW和FPGA创建一个自动化的微控制器测试系统
使用NI公司的产品,我们可以使用一套软硬件解决方案,轻而易举地测试不同的微控制器外设。我们使用NI的产品,通过向自动化框架提供易用的接口,使我们的测试系统自动化,这样节省了大量的精力和成本。 ZalmanRafael,InfineonTechnologies TheChallenge: 集成和自动化一个完整的微控制器测试流程。 TheSolution: 使用NI公司产品来创造一个非人工测试平台,该平台具有直观用户界面和综合的测试案例。 Author(s): ZalmanRafael-InfineonTechnologies DBirundha-InfineonTechno
[测试测量]
基于LabVIEW的卫星干扰监测技术研究
卫星应用已为我国陆、海、空各类军民载体提供全天候、全天时的高精度定位监测等服务, 已在国防建设和国民经济中凸现出越来越重要作用。但是卫星极易受到干扰, 在大功率干扰或者有匹配干扰入站时, 会造成正常入站信号电平下降甚至中断, 用户信息无法入站等情况, 严重影响了系统的稳定运行。 为保障卫星正常工作, 有必要进行干扰监测, 目前, 我国利用幅差法可对某些干扰进行一定精度内的定位。基于上述需求, 本系统利用LabVIEW 开发出1 套自动监测、存储超限干扰信号、提取载噪比及信号重要参数的系统。
对存储数据可进行复现, 分析其来源、类型及对系统的影响, 对某些干扰实现定位, 消除干扰对系统的影响。
1系统需求
[电源管理]