微波EDA网,见证研发工程师的成长!
首页 > 测试测量 > 测试测量技术文库 > LabVIEW程序设计模式(五)—生产者/消费者模式(4)

LabVIEW程序设计模式(五)—生产者/消费者模式(4)

时间:01-09 来源:互联网 点击:
本节将使用“多循环”来解决程序并行运行的问题,那么程序中的两个循环如何进行数据交互和共享呢?最普通的方式是采用全局变量或局域变量,但是当两个循环执行的速率不相等时,必然会造成数据的丢失或重复。如前所述,LabVIEW提供了队列操作函数,允许数据的发送者和接受者之间建立一条缓冲通道,这样就避免了循环不同步带来的影响。
如图 37所示,将整个过程与供水系统进行类比,在数据产生/采集端(供水局)产生数据后,并不直接向终端用户供水,因为前者产生水的速率与后者消耗水的速率并不相同。此时需要建造蓄水池将供水局产生的水放入到蓄水池中,同理获取的数据也放入该缓冲区中。当终端用户需要用水时,直接从蓄水池中获取就可以了,同理在进行数据显示和分析时直接从数据缓冲区中获取就可以了。


图 37 生产者/消费者模型
当然,上面的模型也会存在一个问题:数据缓冲区/蓄水池的容量?假定供水局不停地产生自来水,而终端用户却不消耗水,这样便会导致蓄水池装满而溢出。反之当终端用户耗水量太大时,导致没有水可用。LabVIEW中的队列函数提供了一种很好的方式规避了这个问题,由于队列中的元素是“先进先出”的,因此确保了接收到的数据是有序的。在LabVIEW的队列操作中(入列和出列函数),提供了timeout选项以处理数据缓冲区的溢出或不足。当数据溢出时,入列函数(数据进入队列)将停止发送数据(处于等待状态),直到缓冲区存在数据空间或者达到了timeout设置的时间;而当数据不足时,出列函数(数据流出队列)将停止接收数据(处于等到状态),直到缓冲区进入了新的数据或者达到了timeout设置的时间。

本例将演示生产者/消费者循环的一些基本特性和队列操作的特点。如图 38所示,生产者与消费者之间传递的数据是一个连续的sine波形,二者靠大小为20个点的缓冲区连接。右下角是“停止”按钮,用户控制程序的停止执行。例程提供了操作方式控件控制生产者和消费者的数据传递速率,包含五种状态:不生产,只消费、生成快于消费、生成速率等于消费速率、生成慢于消费、只生产,不消费。



图 38 生产者/消费者例程的前面板
图 39所示为生产者/消费者例程的背面板,代码由3个循环组成,依上而下分别是生产者循环(产生sine数据)、消费者循环(获取sine数据)和状态循环(获得缓存区中数据的数据量)。例程假定正常的数据发送和接收的速率是延时50ms,当需要某一段的速率减慢时需要将循环的延时设置为100ms。
例程将入列和出列函数的timeout设置为-1,表示如果没有满足条件进行入列和出列操作,循环将处于持续等待状态。在新建队列时,设置了缓冲区的大小是20个元素(图中的红色圆圈内)。最下面的循环是为了实时查看队列缓冲区中存储的元素数量。


图 39 生产者/消费者例程的背面板
运行该VI,默认的操作方式是“生产速率等于消费速率”,从图 40中可以看出生产者循环和消费者循环的数据是同步的,此时缓冲区内没有数据,也就是说产生的数据都被实时地消耗了。


图 40 生产速率等于消费速率
如果再将操作方式设置为“生成快于消费”,可以看出数据缓冲区内将逐渐变满并保持为20个元素。此时生产者的波形将会比消费者多20个数据点(这些点保存在数据缓冲区中),如图 41所示。


图 41 生产速率高于消费速率
当将操作方式变为“不生产,只消费”时,生产者循环将停止生产,而消费者循环将组件消耗掉缓冲区中的数据直至数据全部消耗完(此时接收到的波形与发送的波形点一致),如图 42所示。


图 42 不生产,只消费
再将操作方式变为“只生产,不消费”,消费者循环将停止消费,而生产者循环将产生数据直至数据缓冲区填满,如图 43所示。


图 43 只生产,不消费

从运行过程来看,借助于timeout的设置,消费者接收的数据始终与生产者发送的数据是一致的,避免点数据点溢出的问题。当然,在实际使用中需要避免由于timeout设置为-1而导致的无限等待和死循环。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top