From Friday, April 19th (11:00 PM CDT) through Saturday, April 20th (2:00 PM CDT), 2024, ni.com will undergo system upgrades that may result in temporary service interruption.

We appreciate your patience as we improve our online experience.



VISA Write和Read函数的异步(Asynchronous)和同步(Synchronous)



主要软件:
主要软件版本: 1.1
主要软件修正版本: N/A
次要软件: Driver Software>>NI-488.2, Driver Software>>NI-VISA

问题:
改变VISA Write和Read函数会怎样影响我的应用?

解答:
注:LabVIEW中,VISA Write和Read函数的同步或异步选择通过右键点击该函数实现,而在基于文本的编程环境里,同步和异步有专门的函数设置。

这里,同步和异步是什么意思呢?
这里的同步并不是硬件共享时钟或者时基。而是VISA函数的运行和调用它们的线程的关系。准确地说,选择异步或者同步决定了执行某个VISA Read或者Write的线程在什么时候被释放,可以让别的代码运行。下边第三节会有详细的讨论。

在LabVIEW里我该怎么选择异步或者同步函数呢?
右键点击一个VISA Write或Read函数会弹出一个菜单,显示Do I/O SynchronouslyDo I/O Asynchronously(参见下边的图片)。您在菜单里看见的和当前函数的状态正好相反。例如,do I/O synchronously会设定函数为同步(之后,再次右键点击,选择do I/O asynchronously能够回到异步)。下边的截屏显示了VISA Write函数如何实现这一点。


改变VISA Write和Read函数会怎样影响我的应用?
首先,认识到每一类资源,例如串口,都有内存供数据传输到总线上。对于串口而言,内存就是UART FIFOs。这个内存跟物理内存不一样。物理内存,例如CPU内存(RAM),存储在电脑上运行的应用所需的数据。此外,应用要和资源通信,需要在资源内存和RAM之间传递数据。这时候,VISA作为中间层,拥有处理数据传输的独立内存。要理解VISA Write和Read函数中异步和同步的区别,我们需要认识到数据从开发环境内存(例如LabVIEW)传输到VISA内存,到底层驱动内存(VISA调用操作系统来确定资源名指定的硬件有什么样的基本驱动),到物理资源内存(例如串口的UART FIFO)。考虑一个VISA Write函数,包括下边的事件:

  1. 调用线程被锁死。

  2. VISA Write函数相关的数据从开发环境(例如LabVIEW)传输到VISA。

  3. 开始轮寻确定所有和VISA Write函数相关的数据从VISA传输到硬件资源的底层驱动。

  4. 从VISA到底层驱动传输完成。

  5. VISA Write函数返回/完成。


现在的问题是: “什么时候调用线程解锁?” 答案如上所述,由选择Write操作的异步或同步决定。如果是异步的,线程在事件2和3之间解锁(紧接在VISA得到数据之后)。然而,如果是同步的,线程在事件4和5之间解锁(仅在函数返回前)。

对Read函数也差不多,区别在于数据传输的方向。这时候数据从硬件资源传向VISA,选择同步或异步read等于选择在传输结束之前或之后释放线程。

我该如何选择VISA Write或Read的同步或异步?
对于VISA Write,有两个重要的因素:1.写入数据量。2.该应用在调度操作中的可用线程数。考虑写入数据量,如果大量数据要写入(例如,通过串口写入数千字节),线程在把这些字节数传递到硬件驱动的时候会被锁死。如果这个时间超过了该应用在没有该调用线程的时候能处理的范围,选择异步能显著提高总体性能。另一方面,如果您的应用要求数据尽快被传输到资源,选择同步使得该线程实现这种需求,直到VISA至少把数据传输到资源驱动内存。

现在考虑该应用可用线程数。如果该数目比应用需要的并行处理数目少,选择同步执行VISA Write可能影响性能。理由是,调用线程在数据从VISA传输到硬件驱动之前被锁死,别的进程需要调用该线程的时候可能等待很长时间(特别是数据量很大的时候)。这种情况下选择异步操作会好一些。一个例子是,LabVIEW Runtime Engine默认有4个线程可以用来分布执行LabVIEW并行进程。如果其中的进程包括了VISA Write函数,您可以选择异步来更快地释放专门使用那些资源的线程,这样通过使得线程能够被别的进程更早的调用,提高该应用性能。然而,如果您希望一个资源在任务完成之前被尽快使用,同时您并没有使用LabVIEW所有的4个进程,选择同步Write能够锁死线程,确保使用资源。相反地,如果可用线程数很大,而您的功能性不会受到多线程之间分割CPU时间影响(以及相应的线程间切换的额外开销)。同步执行Write不会对性能有负面影响。

对于VISA Read操作,也是一样的,您在接收大量数据的时候,同步执行会更长时间的锁死该线程,在该应用可用的线程数相对于它的并行进程需要的线程数少的时候更为重要。

相关链接:
KnowledgeBase 3D9B7L4B: The Affect of UART FIFO Sizes on Serial Application Performance

附件:


visasync.jpg


报告日期: 10/30/2006
最近更新: 11/05/2006
文档编号: 3D9B8E4B