您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 管理学资料 > labview使用执行系统和优先级的建议
使用执行系统和优先级的建议在大多数应用程序中,无需使用优先级或者除标准执行系统以外的执行系统,标准执行系统会自动对VI进行多任务处理。默认情况下,所有VI都在标准执行系统的一般优先级上运行。在多线程应用程序中,由一个单独的线程来处理用户界面,所以VI和用户界面交互是相互独立的。在单线程应用程序中,执行系统轮流执行用户界面交互和VI,并给出类似结果。通常优先级执行的最好的方法是在应用程序的优先级循环中用等待函数放慢较低优先级的执行速度。这一点在用户界面VI的循环队列中非常有用,因为100到200毫秒的延时对用户而言是很难察觉的。如果使用优先级,则必须非常小心。如果在设计中使用了较高的优先级,则必须考虑为那些次要部分增加等待,使它们和较低优先级的任务共享执行时间。当其它任务变化时,应留意操作全局变量、局部变量或者其它外部资源。使用同步技术,比如功能全局变量或信号量(semaphore)来保护这些资源。多处同时调用子VI默认状态下,VI为非重入,且执行系统不能在一个子VI上同时运行多个调用。如要同时调用一个非重入的子VI,当某个调用正在运行时,其它的程序必须等这次调用完成后才能运行。在重入执行中,对子VI多个例程的调用与单独的数据存储可同时进行。如果子VI是重入VI,第二个调用可以在第一个调用完成之前就开始运行。对于重入VI,每个调用VI的程序实例都将保持其自身的信息状态。这样执行系统能从多处同时运行相同的子VI。在下列情况下,可使用重入VI:当一个VI等待一定时间或出现超时当一个VI包含有同一个VI的多个例程中不可共享的数据时如需生成重入VI,可选择文件»VI属性,选择VI属性对话框中执行,勾选重入执行复选框。注:(FPGA模块)FPGAVI默认为重入。从程序框图中以交互方式打开一个重入子VI时,LabVIEW将打开该VI的一个副本而不是VI本身。VI的标题栏中标有(副本)表示它是源VI的一个副本。注:由于源VI的副本VI无法进行源代码控制的操作,副本VI的工具»源代码控制菜单显示为灰色。可以象使用其它VI的前面板一样来使用重入VI的前面板,如需在可重入VI的副本中显示重入VI原本的前面板,可通过选择查看»浏览关系»可重入的源VI实现。每一个重入VI的实例都有一个前面板。通过VI属性对话框将重入VI设置为执行过程中打开前面板并在重入VI完成运行后选择关闭前面板。也可以通过配置一个事件结构来处理重入VI前面板对象的事件。重入VI的前面板也可以是子面板。使用VI服务器可通过编程实现在运行时控制重入VI的前面板控件;但在运行时无法编辑控件。也可使用VI服务器,在运行时创建重入VI前面板的一个新的重入实例。如需打开重入VI前面板的一个新实例,可使用打开VI引用函数。需为其类型说明符输入端连接一个严格类型的VI引用。将0x08连接到选项输入端,可使用打开VI引用函数使VI成为可重入VI。重入执行的类型注:(FPGA模块)LabVIEWFPGA不支持下列VI类型。如在FPGAVI中使用重入子VI,程序框图上子VI的每个实例可全部为独立的硬件资源。LabVIEW支持两种类型的重入VI。勾选VI属性对话框执行属性页上重入执行复选框可启用两种重入VI选项。如需在LabVIEW调用重入VI前为重入VI的每次调用都创建一个副本VI,或当副本VI必须在不同调用中保持状态信息,则选择为各个实例预分配副本选项。例如,当重入VI含有一个未初始化的移位寄存器,或包含一个局部变量、属性或方法,而其中的值必须保留以备下次调用副本VI时使用,则选择为各个实例预分配副本选项。如重入VI中包含首次调用?函数,则还需选择为各个实例预分配副本。对于在LabVIEWReal-Time上低抖动运行的VI,也可使用该选项。选择在实例间共享副本选项,减少预分配VI副本占用的内存。在实例间共享副本减少了内存使用,因为LabVIEW不会为每个调用可重入VI的实例预分配一个副本。选择在实例间共享副本选项时,只有当VI调用重入VI时,LabVIEW才会创建一个副本VI。通过该选项,LabVIEW可按需创建VI,这有可能使VI运行中出现抖动。LabVIEW并不保留重入VI调用的状态信息。共享VI会降低VI执行速度。下表解释了选择重入VI类型时需考虑的内存和执行速度的问题。重入VI类型内存使用执行速度为各个实例预分配副本为重入VI的每次调用创建一个副本VI。内存使用增加。执行速度恒定。在实例间共享副本仅在重入VI的同时调用达到最大数量时分配副本VI。内存使用降低。按需创建副本VI。执行速度将稍有降低且视每次调用而异。定时结构内的可重入执行(ETS,VxWorks,Windows)可将LabVIEW配置为在定时循环或定时顺序结构中预分配或共享重入VI的副本。例如,如在定时循环或定时顺序结构中放置一个重入VI的共享副本,可将结构设置为预分配在结构中调用的重入VI的实例副本。在结构外调用的重入VI实例将继续共享副本。要在定时循环或定时顺序结构中设置VI的分配,右键单击结构选择共享副本分配,从下列选项中选择:自动—LabVIEW根据结构所在的环境决定是否将结构设置为预分配或按需分配。LabVIEW将把文本添加至快捷菜单项,以表示LabVIEW选择的设置。例如,如LabVIEW选择预分配,菜单项变为自动(预分配)。预分配—LabVIEW为每个从结构中调用的重入VI创建一个副本VI。定时循环或定时顺序结构将显示一个图标,表示LabVIEW为结构中的任何重入VI分配副本。按需分配—只有从结构内调用重入VI时,LabVIEW才创建一个副本。定时循环和定时顺序结构将显示一个图标,表示LabVIEW在结构内共享任何重入VI的副本。重入执行范例以下部分为重入VI进行等待和不共享数据的示例。使用等待函数的VI下图为一个名为Snooze的VI,输入时间(xx时xx分),到该时间提醒。如果需要在多处使用该VI,则该VI则必须是重入VI。获取日期/时间(秒)函数读取以秒为单位的当前时间,秒至日期/时间转换函数将当前时间值转换为时间值的簇(年、月、日、时、分、秒、星期)。捆绑函数以前面板上TimeToWakeMe簇控件的值替换当前时间,该值代表同一天内之后的时间。Wake-upTimeinSeconds函数将调整过的记录转换成秒,然后将当前时间和未来时间的差乘以1000得到毫秒,并将结果传给等待(ms)函数。LunchVI和BreakVI将Snooze用作子VI。下图是LunchVI的前面板和程序框图,其功能是在前面板上显示并提醒操作人员午饭时间到了。BreakVI在上午10点时,在前面板上显示并提醒操作人员休息。除了显示信息不同以外,BreakVI和LunchVI完全相同。因为LunchVI和BreakVI是并行运行的,因此SnoozeVI必须是重入VI。否则,如果先启动LunchVI,BreakVI将在两个小时以后的中午SnoozeVI醒来之前,一直处于等待状态。使用存储VI并不意味着共享其数据如需调用存储数据的子VI,必须使用重入执行。例如,创建一个ExpAvg子VI用于计算四个数据点的指数平均。另一个VI用ExpAvg子VI来计算两个数据采集通道的指数平均。这个VI监视采集过程中两个点的电压并将计算的结果显示在带状图表上。这个VI程序框图包括两个ExpAvg子VI的实例。两个调用轮流进行—一个分配给0通道,另一个给1通道,假设0通道先运行,如果ExpAvg不是可重入的,通道1调用时使用了通道0的计算结果,通道0调用时又使用了通道1的计算结果。如果ExpAvg是可重入的,每个调用就可以独立运行而不相互共享数据。调试重入VI如需调试某个重入VI,可选择文件»VI属性显示VI属性对话框,从下拉菜单中选择执行并勾选允许调试复选框。从程序框图中打开一个重入子VI时,LabVIEW将打开该VI的一个副本而不是VI本身。VI的标题栏中标有(副本)表示它是源VI的一个副本。无法对VI副本进行编辑,但可以将重入VI副本的程序框图用作调试,而不能编辑程序实例。在程序框图中,可以设置断点、使用探针、启用高亮显示执行过程和单步执行。选择VI属性对话框执行页的在实例间共享副本选项时,不要在副本VI中设置断点,使用探针或启用高亮显示执行过程。副本VI并不保留不同调用间的调试设置。如设置了最初的重入VI的调试设置,则副本VI将仍然使用最初的调试设置。如需编辑一个重入VI,必须打开原始的重入VI而不是副本。选择操作»切换至编辑模式从副本中打开重入VI。LabVIEW以编辑模式打开重入VI。也可以选择查看»浏览关系»可重入的源VI。当LabVIEW打开重入VI后,选择操作»切换至编辑模式使VI可编辑。注:调试应用程序或动态链接库时,无法调试打开VI引用函数创建的可重入前面板。如可重入前面板是LabVIEW创建的动态链接库的接入点,也无法对其进行调试。同步访问全局变量、局部变量以及外部资源因为执行系统可以几个任务并行运行,因此必须保证以适当的顺序访问全局变量、局部变量或资源。防止竞争状态有几种方法可以防止竞争状态。最简单的方法是整个应用程序中只通过一个地方修改全局变量。在单线程应用程序中,使用子程序级VI读出或者写入全局变量不会造成竞争状态,因为子程序级VI不与其它VI共享执行线程。在多线程应用程序中,子程序级不保证对全局变量的唯一访问,因为当另一个VI在另一个线程上运行时,它能够同时访问全局变量。功能全局变量避免与全局变量相关的竞争状态的另一种方法是使用功能全局变量。功能全局变量是在VI中使用循环上不初始化的移位寄存器来存储全局性数据。一个功能全局变量通常有一个操作输入参数来指定VI执行的任务。该VI在While循环中使用了未进行初始化的移位寄存器来保持操作结果。下列图示是功能全局变量的一个简单范例。该范例中的操作是初始化、读取、递增和递减。每次调用这个VI时,循环中的代码只执行一次。根据操作参数,循环中的选择结构根据移位寄存器的值进行初始化、保持不变、递增或递减。功能全局变量不仅能实现简单的全局变量,也能实现更复杂的数据结构,例如,堆栈或队列缓存。功能全局变量还能用于保护对全局资源的访问,例如,文件、仪器、数据采集设备等无法通过全局变量表示的全局资源。除非VI为可重入VI,否则对功能全局变量的调用只能按顺序执行。信号量使用功能全局变量能解决大多数同步问题,因为功能全局VI确保一次只有一个调用者修改数据内容。功能全局变量的缺点是如要更改变量所代表资源的修改方式时,必须修改功能全局VI的程序框图并增加新的操作。在一些应用程序中,频繁修改全局资源将带来诸多不便。在这种情况下,可以使用信号量保护对全局资源的访问来设计应用程序。信号量(互斥量)是用来保护对共享资源进行访问的一个对象。被访问的共享资源的代码叫作关键临界段。在同一时间,只有一定数量的任务可以访问信号量。信号量以此方式保护对重要部分的访问。通常情况下,一次只有一个任务可以访问被通用信号量保护的临界段。但是,信号量可能允许一个以上任务(预定义值以下)访问重要部分。如要指定同时访问被通用信号量保护的重要部分的任务数量,连接获取信号量引用VI的大小输入端。该VI获取对现有信号量的引用或新建一个信号量,大小输入端指定同一时间可获取信号量的任务数量。使用获取信号量VI可以获取对一个信号量的访问。如使用“获取信号量引用”VI创建的信号量的大小为1,则一次只有一个任务可访问信号量。所以,必须使用释放信号量VI,释放对信号量的访问。这样,另一个任务才能访问信号量。使用释放信号量引用VI,释放对信号量的引用。注:只要非空闲的顶层VI引用了某个信号量,信号量就一直在内存中。如顶层VI为空闲,LabVIEW将释放该VI的全部信号量引用,包括顶层VI的子VI中的引用。如LabVIEW释放上一个引用给某命名信号量,LabVIEW将销毁信号量。因为只能获取引用至一个未命名信号量的引用,当顶层VI空闲时,LabVIEW将销毁一个未命名信号量。如要在多个顶层VI之间使用信号量,需为信号量命名并从顶层VI调用“获取
本文标题:labview使用执行系统和优先级的建议
链接地址:https://www.777doc.com/doc-2880316 .html