labview栈和队列

发布者:Qianfeng最新更新时间:2015-09-07 来源: eefocus关键字:labview  队列 手机看文章 扫描二维码
随时随地手机看文章

同步控制技术----栈与队列

(其中有很多图片不是马上就能看到的,查看方法是:鼠标右击不可看图片,选择复制图片地址,然后在浏览器中打开即可。因为本文是摘录的,给各位朋友带来不便,请多谅解!)

 

在计算机编程中栈是一个很重要的概念,尤其在汇编语言中,需要不断进栈和出栈的操作.栈是限定在一个表的尾端进行插入(进堆栈)和删除(出堆栈)的线性表.是后进先出结构(LIFO).

队列的定义和栈的定义是类似的,区别是数据是先进先出(FIFO)

labview还有一个概念缓冲区BUFFER,典型的比如CHART,它默认保存数据长度是1024.BUFFER的概念和队列是非常相似的,都是一个先进先出的结构.如果我们设定队列的数据长度也是1024.比较一下他们的区别.

区别一:未达到设定

开始的时候,队列和缓冲区中都是没有数据的,当有数据进入的时候,队列和缓冲区中的数据在不断地增加,对于缓冲区,因为未达到它最大许可的长度 1024,因此数据是不断第增加的,队列则不同,它的数据是否增加取决于是否有读队列的过程,就是所说的出队,如果出队的速度大于入队的速度,队列中则根本不会有数据.如果没有出队的过程或者出队的速度小于入队的过程,队列中的数据也是不断地增加的.这是第一个区别. 

区别二:到达设定值

当队列和BUFFER都达到了1024个数据后,这是再有新的数据要进来,队列和BUFFER的表现是不同的,对于BUFFER,它将自动挤出(形象的说法,当然也是编程实现的)最早进入BUFFER的数据,所谓先进先出.而队列则不同.要求进入队列的线程只能被动等待,一直到队列中有别的线程取出数据,队列中有空闲位置.所以队列有调节读写速度线程的能力.

相同点一:数据进入都是在尾部,(队列插入如果在头部,就编程上面所说的栈了)

相同点二:对于中间数据都实现了有效的封装,你无法直接提取中间的某个数据,你可以读出中间的数据,但是不能改变当前BUFFER和队列的值.

 

LABVIEW提供的队列的功能函数(包括栈),在逐点分析库提供了DBL型的BUFFER,我在另外的日志中专门提到了,这里就不多说了.

LV队列的函数是基本函数,无法进行深入跟踪,估计应该是采用C++的算法然后封装的,我实际测试过,它的运行效率远高于用数组的方式构成的队列,为了详细说明队列和栈的细节,我还是用数组的形式,然后在介绍LV的队列函数.

首先看看如何用数组实现栈的功能:

栈的操作是非常简单的,只有压栈和出栈两个操作(PUSH AND POP)

我们用AE来实现它.分成三个action: Init,Push ,Pop

首先严格自定义ENUM,表示三个动作.

 

 

 

 

 

 

这样我们就完成了栈的AE的制作过程。

看看它的调用过程。

10次循环,栈中的数据应该是0,1,2,3,4,5,6,7,8,9。栈的弹出次序应该是9,8,7,6,5,4,3,2,1,0

运行结果确实如此。

与栈相反,队列是一个先入先出的数据结构,我们对栈的过程稍微修改一下,就可以得到队列。就不多介绍了。

下面重点介绍一下LV提供的队列的具体功能。

分别介绍这8个节点的具体功能:
1:获得队列(实际是得到队列的参考)它有5个数据端子

name :String
队列在LV系统中是名称来区分的,LV系统自己维护一个包含的目前所有队列的表,当你运行这个函数的时候,它首先会查找表中是否已经存在这个队列参考,如果存在,就直接返回这个参考,如果不存在,就建立一个新的队列,并将队列参考加入表中进行维护。这样做的好处是非常明显的,允许我们在任何子VI中,只需要知道队列的名称就可以运行这个函数直接得到队列参考,不用通过全局变量或者数据流输入来得到参考,在一个层层嵌套的VI中想传递一个数据很不容易,也不利于模块化。[page]


max queue size :I32

定义的队列的最大长度,当输入-1时,队列长度不受限制,需要注意的是,如果取出数据的速度小于加入队列数据的速度,随着时间的推移,需要的内存会不断地增加,这显然是存在问题的,如果我们没有规定最大长度的话,编程时候要注意自己来协调速度。如果规定的最大长度,当达到最大长度时候,加入队列的线程会一直等待到队列中有空闲位置为止。

如果已经有同名队列存在,该设置是不起作用的,用的还是第一次运行这个函数时的设置。


element data type:队列中的数据类型,允许任意数据类型。
其它两个非常简单,不介绍了。

2:元素加入队列(Enqueue Element)

3:预览要出队的元素(读,并不取出)

4:取得队列当前状态( Get Queue Status)

   这个函数比较重要,它可以获得当前队列的状态信息,包括队列最大长度(设定的),队列名称,当前正在运行的等待取出数据的(运行DEQUEUE)的数量,当前正在运行的加入队列的数量(ENQUEUE),以及当前队列中的所有数据。

5:释放队列(当程序结束时,进行清理工作,防止内存泄露)

6:在相反方向插入队列(栈的功能),如果按这种方式插入一定数量,再依次取出,就是上面说的栈的功能。

  对于队列,这个函数可以人工实现队列优先级,最重要的信息可以放在其他不重要的信息前面,比如严重错误,紧急停止等。

7:取出元素。如果当前队列中无元素可以提取,该函数会一直等待到TIMEOUT或者有数据为止。

8。清除队列(FLUSH),清除队列中的所有元素。


可见,队列的基本操作是很简单的,关键是如何在实际工作中正确运用。

我们首先用AE封装一个队列:

我们来模拟一下WINDOWS消息,首先定义消息结构。


 


然后定义AE,封装队列。


 

 

 




下面我们来实验一下这个AE,它可以运行在任何一个VI中,为了方便,我们在一个VI中做三个循环,两个写入队列(生产者),一个读取队列(消费者);


 

队列的应用范围非常广,经常和状态机联合使用,就是经常提到的队列状态机,有机会我会结合状态机一起介绍。

关键字:labview  队列 引用地址:labview栈和队列

上一篇:LabVIEW串口的编程-使用LabVIEW系统VI
下一篇:LabView利用IMAQ来采集笔记本自带摄像头图像

推荐阅读最新更新时间:2024-03-30 23:03

LabVIEW动态事件的注册
  动态事件注册可完全控制LABVIEW产生的事件的类型和时间。动态事件可使事件仅在应用程序的某个部分发生,也可在应用程序运行时改变产生事件的VI或控件。使用动态注册,可在子VI中处理事件而不是仅在产生事件的VI中处理事件。   处理动态注册的事件主要包括以下4个步骤。    第1步:获取要处理的事件对象的VI服务器引用;    第2步:将VI服务器引用连接至 注册事件 函数以注册对象的事件;    第3步:将事件结构放在While循环中,处理对象事件直至出现终止条件为止;    第4步:通过取消注册事件函数以停止事件发生。   要动态注册对象事件,必须先获取该对象的VI服务器引用。可通过打开应用程序引用和打开VI引用函数来获取应
[测试测量]
C语言及ARM中堆指针SP设置的理解与总结
什么是栈: 百度这么说:栈是一种特殊的线性表,是一种只允许在表的一端进行插入或删除操作的线性表。表中允许进行插入、删除操作的一端称为栈顶。表的另一端称为栈底。栈顶的当前位置是动态的,对栈顶当前位置的标记称为栈顶指针。当栈中没有数据元素时,称之为空栈。栈的插入操作通常称为进栈或入栈,栈的删除操作通常称为退栈或出栈。 简易理解: 客栈,即临时寄存的地方,计算机中的堆栈主要用来保存临时数据,局部变量和中断/调用子程序程序的返回地址。程序中栈主要是用来存储函数中的局部变量以及保存寄存器参数的,如果你用了操作系统,栈中还可能存储当前进线程的上下文。设置栈大小的一个原则是,保证栈不会下溢出到数据空间或程序空间。CPU在运行程序时,
[单片机]
LabVIEW 8.2中的最优化
  最优化理率与算法是一个重要的数学分支,它所研究的问题是,在众多的方案中什么样的方案最优以及怎样找出最优方案。早在公元前500年,古希腊数学家毕达哥拉斯就已发现了黄金分割法,17世纪牛顿发明微积分时已经提出极值问题,后来又出现拉格朗日乘数法;1847年柯西提出了最速下降法,还有求无约束极值的变分法,这些统称为古典最优化方法。   由于生产和科学研究迅猛发展,许多最优化问题已无法用古典方法解决,又由于电子计算机日益普及,使最优化问题的研究不仅成为一种迫切需要,而且有了求解的有力工具。现在已经有许多计算机算法解决最优化问题,如Kuhn-Tucker 定理、Be11man 最优化原理和动态规划、pONTRIAGIN 的极大值原理以及Ka
[测试测量]
<font color='red'>LabVIEW</font> 8.2中的最优化
基于STM32的串口数据环形缓冲队列
最近进行STM32开发,在处理大规模串口数据的时候,由于数据处理速度不够及时而出现掉包的问题,为此通过以下方案成功解决。 BTW:在串口循环发送一组数据的时候,应该在发送第一个字节之前也加上判断缓冲区是否为空。 正确形式如下: //这个函数会循环执行 void stop(void){ //发送10给上位机,使其进入数据解调 float_data.d = 10 * 10000; while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET); USART_SendData(USART1,0xff);//发送开始帧标志位 while(USART_GetFlagStatu
[单片机]
基于STM32的串口数据环形缓冲<font color='red'>队列</font>
基于LM3S615的地下水位监测系统设计
0 引言 我国地下水占水资源总量的三分之一,年供水量占总供水量的近20%,在支撑经济社会发展中具有重要作用。大规模地下水开发造成局部地区地下水超采,诱发地质灾害。如:地面沉降、地裂缝灾害等。 如今我国对于地下水位的监测,大部分监测点仍以传统的人工定时测量方法(电表、测钟、测绳等)为主,因而对于某些突发性的地下水位异常不能起到很好的预警作用,同时也会占用大量的人力,且存在人为误差,因此实现地下水位重点监测点的自动监测有利于提高各种地质灾害的预报、预测。 采用ARM作为主控器能够降低功耗,并为建立无线网络通信奠定了基础,使系统更高效、可靠。 1 设计方案 1.1 方案概述 此系统的基本设计思路是:前端利用差压式传感器
[单片机]
基于LM3S615的地下水位监测系统设计
利用LabVIEW 对大型造纸厂的纸浆生产进行仿真与控制
行业: Manufacturing, 管道/纸业 产品: 数据采集, 数据记录与监控模块, Labview 挑战: 创建一个用来监测大型造纸厂纸浆的生产过程,以节约能源和降低成本。 解决方案: 为了增加吞吐量,节约能源,以及优化生产过程,我们利用NI LabVIEW数据记录和监控(DSC)模块来处理复杂的,非线性的建模过程。 "LabVIEW工具包使同时运行多个模型变得更加容易,这意味着在线性能监控功能可以变得简单直接。" 位于英国Workington的Iggesund纸板公司,其生产线上主要有五个造纸机,运行每个造纸机至少需要消耗15兆瓦的能量。节约能源对于降低我们 的运营成本至关重要,因此,我们需要一个
[测试测量]
利用<font color='red'>LabVIEW</font> 对大型造纸厂的纸浆生产进行仿真与控制
使用LabVIEW控制探索频道望远镜
  The Challenge:   为大型光学望远镜设计并实现控制软件,并与网络分布式控制系统集成。   The Solution:   使用NI LabVIEW软件创建控制望远镜固定控制硬件的系统。   Lowell天文台和Observatory Sciences Ltd.正在与探索通信合作,开发孔径4.2米的探索频道望远镜(DCT),它将会成为美国的第五大望远镜。它是许多现代天体物理学的强大工具,涵盖太阳系研究到天体、银河系和外银河系天文学的基础工作。   我们使用LabVIEW用于大型物理控制应用,并且将它作为DCT控制系统的主要软件开发工具,使用LabVIEW共享变量在分布式子系统之间通信。我们使用NI Com
[测试测量]
式持续助力新能源车电力创新,泰克参加ATC汽车测试技术周
中国上海2024年3月27日 —— 第三届汽车测试技术周于2024年3月21日-22日在上海举行,技术领先的测试和测量解决方案提供商泰克携新能源汽车全栈式测试解决方案参与了此次盛会。 作为汽车行业值得信赖的测试测量专家,泰克为新能源汽车行业提供全栈式测试解决方案,从初期的器件选择到最终的产品认证多个测试环节助力产业应对AI浪潮下的技术革新。 ATC汽车技术平台是为中国汽车技术人士提供专业技术交流、技能培训、商务服务的综合性平台,客户范围遍布所有主机厂,数千家汽车零部件厂商,是国内汽车技术会议及活动具影响力的品牌。本次汽车测试技术周,全面展示面向整车、零部件开发的各种技术和服务的测试饕餮盛会,涵盖了汽车软硬件系统测试、新能
[汽车电子]
<font color='red'>栈</font>式持续助力新能源车电力创新,泰克参加ATC汽车测试技术周
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
最新测试测量文章
换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved