【LabVIEW FPGA入门】局部变量和全局变量

局部变量

        无法访问某前面板对象或需要在程序框图节点之间传递数据时,可创建前面板对象的局部变量。创建局部变量后,局部变量仅仅出现在程序框图上,而不在前面板上。

        局部变量可对前面板上的输入控件或显示件进行数据读写。写入局部变量相当于传递数据至其他接线端。但是,局部变量还可向输入控件写入数据和从显示控件读取数据。实际上,使用局部变量可将前面板对象同时用作输入和输出。

        例如,如果用户界面需要用户登录,可在每次新用户登录时清空登录和密码提示框中的内容。通过局部变量,当用户登录时使用局部变量从登录和密码字符串输入控件中读取数据,当用户离开时向这些输入控件写入空字符串。

        右键单击一个前面板对象或程序框图接线端并从快捷菜单中选择创建»局部变量便可创建一个局部变量,该对象的局部变量的图标将出现在程序框图上。

        如需使局部变量与输入控件或显示控件相关联,可右键单击该局部变量节点,从快捷菜单中选择选择项。展开的快捷菜单将列出所有带有自带标签的前面板对象。

        LabVIEW通过自带标签关联局部变量和前面板对象,因此前面板输入控件和显示控件的自带标签应具有一定的描述性。

全局变量

        全局变量可在同时运行的多个VI之间访问和传递数据。全局变量是内置的LabVIEW对象。创建全局变量时,LabVIEW将自动创建一个有前面板但无程序框图的特殊全局VI。向该全局VI的前面板添加输入控件和显示控件可定义其中所含全局变量的数据类型。该前面板实际便成为一个可供多个VI进行数据访问的容器。

        例如,假设现有2个同时运行的VI。每个VI含有一个While循环并将数据点写入一个波形图表。第一个VI含有一个布尔控件来终止这两个VI。此时须用全局变量通过一个布尔控件将这两个循环终止。如这两个循环在同一个VI的同一张程序框图上,可用一个局部变量来终止这两个循环。

        从函数选板上选择一个全局变量,将其放置在程序框图上。双击该全局变量节点可显示全局VI的前面板。该前面板与标准前面板一样,可放置输入控件和显示控件。

        LabVIEW以自带标签区分全局变量,因此前面板输入控件和显示控件的自带标签应具有一定的描述性。

        可创建多个仅含有一个前面板对象的全局VI,也可创建一个含有多个前面板对象的全局VI从而将相似的变量归为一组。

        所有对象在全局VI前面板上放置完毕后,保存该全局VI并返回到原始VI的程序框图。然后必须选择全局VI中想要访问的对象。右键单击该全局变量节点并从快捷菜单中选中一个前面板对象。该快捷菜单列出了全局VI中所有自带标签的前面板对象。右键单击该全局变量节点并从选择项快捷菜单中选择一个前面板对象。

        如为全局变量节点创建了一个副本,则LabVIEW将把这个新的全局变量节点与原始变量节点的全局VI相关联。

局部变量和全局变量的初始化

        如需对一个本地或全局变量进行初始化,应在VI运行前将已知值写入变量。否则变量可能含有导致VI发生错误行为的数据。如变量的初始值基于一个计算结果,则应确保LabVIEW在读取该变量前先将初始值写入变量。将写入操作与VI的其他部分并行可能导致竞争状态。

        要使变量初始化在VI其他部分执行之前完成,可将把初始值写入变量的这部分代码单独放在顺序结构的第一帧。也可将这部分代码放在一个子VI中,通过连线使该子VI在程序框图的数据流中第一个执行。

        如在VI第一次读取变量之前,没有将变量初始化,则变量含有的是相应的前面板对象的默认值。

        当全局变量或本地变量的值连接至程序框图上的任何位置,变量改变不会引起连线上的值改变。变量的值更改以后,要读取变量的值,才会更新连线上的值。

竞争状态

        两段或更多代码并行执行并访问同一部分内存时会引发竞争状态。如果代码是相互独立的,就无法判断LabVIEW按照何种顺序访问共享资源。

        竞争状态会引起不可预期的结果。例如,两段独立的代码访问同一个队列,但是用户未控制LabVIEW访问队列的顺序,这种情况下会引发竞争状态。

        竞争状态随着程序运行的时间因素而改变,因此具有一定的危险性。操作系统、LabVIEW版本和系统中其他软件的改变均会引起竞争状态。

        如改动了VI的时间要素(例如,更新操作系统或LabVIEW版本),请检查访问同一部分数据的并行代码,并使用定时条件来控制哪一部分代码首先执行。

使用局部变量和全局变量时的竞争状态

        对同一个存储数据进行一个以上更新动作均会造成竞争状态,但是竞争状态通常在使用局部变量和全局变量或外部文件时出现。以下程序框图显示了一个局部变量造成竞争状态的范例。

1378

        该VI的输出,即本地变量x的值取决于首先执行的运算。因为每个运行都把不同的值写入x,所以无法确定结果是7,还是3。在一些编程语言中,由上至下的数据流模式保证了执行顺序。在LabVIEW中,可使用连线实现变量的多种运算,从而避免竞争状态。下列程序框图通过连线而不是局部变量执行了加运算。

1378

        提示如必须在局部变量或全局变量上执行一个以上操作,则应确保各项操作按顺序执行。

        如两个操作同时更新一个全局变量,也会发生竞争状态。如要更新全局变量,需先读取值,然后修改,再将其写回原来的位置。当第一个操作进行了读取-修改-写入操作,然后才开始第二个操作时,输出结果是正确的,可预知的。第一个操作读取值,然后第二个操作读取值,则两个操作都修改和写入了一个值。这样操作造成了读取-修改-写入竞争状态,会产生非法值或丢失值。

        要避免全局变量引起的竞争状态,可使用功能全局变量保护访问变量操作的关键代码。使用一个功能全局变量而不是多个本地或全局变量可确保每次只执行一个运算,从而避免运算冲突或数据赋值冲突。

循环中的变量行为

        当一个变量控制多个并行循环时,循环必须在写入变量后执行,在循环每次执行后读取变量。

        当系统重新启动时,循环读取变量之前,必须为变量设置合适的开始条件,避免变量过早停止。

局部变量和全部变量的内存分配

局部变量

        局部变量复制数据缓冲区的数据。从一个局部变量读取数据时,便为相关控件的数据创建了一个新的缓冲区。

        如使用局部变量将大量数据从程序框图上的某个地方传递到另一个地方,通常会使用更多的内存,最终导致执行速度比使用连线来传递数据更慢。如在执行期间需要存储数据,可考虑使用移位寄存器。

全局变量

        从一个全局变量读取数据时,LabVIEW将创建一个数据的副本,保存于该全局变量中。

        操作大型数组和字符串时,将占用相当多的时间和内存来操作全局变量。操作数组时使用全局变量尤为低效,原因在于即使只修改数组中的某个元素,LabVIEW仍对整个数组进行保存和修改。如一个应用程序中的不同位置同时读取某个全局变量,则将为该变量创建多个内存缓冲区,从而导致执行效率和性能降低。

FPGA上的局部变量使用

 

在不同时钟源的定时循环中使用局部变量

        下面的屏幕截图演示了跨多个时钟域传输数据时的常见错误。在以 Windows 为目标的 VI 中,每次迭代期间在下部循环中读取的局部变量始终彼此同步,因为软件数据流约束确保下部 while 循环中读取的数据始终是写入到下部循环中的最后一个值。局部变数。然而,在LabVIEW FPGA中,数据流以握手逻辑的形式硬件实现。握手会向您的代码添加额外的逻辑,以确保存在数据来执行您的操作。例如,在乘法运算中,在执行乘法例程之前必须存在两个数字输入。硬件握手确保两个输入都必须存在才能执行乘法。


        本例中硬件握手的后果之一是由于附加逻辑的速度而导致的延迟。在上面所示的VI中,出现了一个问题,因为连接到每个变量的握手逻辑需要多个时钟周期才能执行,但SCTL强制内部代码在一个时钟周期内执行。由于握手逻辑在写入操作中引入了延迟,这可能导致在较低的循环中读取“旧”值。为了缓解此问题,请使用 FIFO 而不是局部变量在循环之间传递数据。 

        上例中出现的另一个问题是数字和布尔值可能不相互同步。这是因为没有逻辑来确保布尔和数值局部变量同步。为了解决这个问题,请将数字和布尔值捆绑在一起,并通过局部变量传递集群。 

 


        当在同一时钟域内工作时,上述同步问题不适用。因此,如果上面显示的两个环路都使用 10 MHz 定时源,则不会出现同步问题。

全局变量示例

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/280758.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【微服务-Nacos】Nacos集群的工作原理及集群间数据同步过程

上篇文章我们介绍了Nacos集群的搭建方法及步骤,下面我们来看一下Nacos集群的工作原理,一共有两部分:Leader节点选举及各节点数据同步。 1、Nacos集群中Leader节点是如何产生的 Nacos集群采用了Raft算法实现。它是一种比较简单的选举算法&am…

leetcode 18.四数之和 java

题目 思路 整体在三数之和的基础上进行修改。(所有需要修改的地方,我在代码里加了//改 的注释) 大的一个思路就是,在三数之和的外面再套一层循环。相当于固定前两个数。然后这道题目标值变成一个参数了,不是三数之和…

uniapp,导航栏(切换项)有多项,溢出采取左滑右滑的形式展示

一、实现效果 当有多项的导航&#xff0c;或者说切换项&#xff0c;超出页面的宽度&#xff0c;我们采取可滑动的方式比较好一些&#xff01;并且在页面右边加个遮罩&#xff0c;模拟最右边有渐变效果&#xff01; 二、实现代码 html代码&#xff1a; <!-- 头部导航栏 --…

[数据集][目标检测]焊接件表面缺陷检测数据集VOC+YOLO格式2292张10类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;2292 标注数量(xml文件个数)&#xff1a;2292 标注数量(txt文件个数)&#xff1a;2292 标注…

使用jscpd对比重复代码

背景 检查项目中重复的代码&#xff0c;或者代码片段 jscpd 两个文件对比 Jscpd 是一个用于检测代码复制和粘贴的工具&#xff0c;它可以比较两个文件并报告相似性的百分比。 以下是如何使用 Jscpd 来比较两个文件的示例&#xff1a; 首先&#xff0c;确保你已经安装了 Nod…

OpenCV4.9.0在Android 开发简介

查看&#xff1a;OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇&#xff1a;使用 Clojure 进行 OpenCV 开发简介 下一篇&#xff1a;暂无 引言&#xff1a; OpenCV是一个跨平台计算机视觉库&#xff0c;广泛用于图像处理、计算机视觉和机器学习等领域…

雀巢中国劳动力生态系统上线仪式圆满落幕

3月19日&#xff0c;雀巢中国劳动力生态系统上线仪式在雀巢北京总部举办。双方代表对项目进行了回顾&#xff0c;并就2024年的重点任务展开了深入讨论&#xff0c;共同探讨未来合作的方向和策略。 当天下午&#xff0c;劳动力效能典范游学之走进雀巢活动圆满落幕。活动展示了雀…

数字人解决方案— SadTalker语音驱动图像生成视频原理与源码部署

简介 随着数字人物概念的兴起和生成技术的不断发展&#xff0c;将照片中的人物与音频输入进行同步变得越来越容易。然而&#xff0c;目前仍存在一些问题&#xff0c;比如头部运动不自然、面部表情扭曲以及图片和视频中人物面部的差异等。为了解决这些问题&#xff0c;来自西安…

C# winform修改背景图 控件双向绑定 拖拽打开图片

修改背景图 说明 这里我准备基于百度飞桨PaddleSeg项目的人像分割模块做一个人像抠图&#xff0c;这里顺便用上了双向绑定和图片拖拽打开。 下面就是示例&#xff1a; 用颜色替换 用背景图替换 保存成功后的图片 一、使用百度飞桨PaddleSeg //初始化 引擎engine new Padd…

使用ansible批量修改操作系统管理员账号密码

一、ansible server端配置 1、对于Linux主机配置免密登录ssh-copy-id -i ~/.ssh/id_rsa.pub rootremote_ip 2、在/etc/ansible/hosts文件中添加相应主机IP 3、对于Windows主机需要在/etc/ansible/hosts文件中进行以下配置 192.168.83.132 ansible_ssh_useradministrator an…

【AI】Ubuntu系统深度学习框架的神经网络图绘制

一、Graphviz 在Ubuntu上安装Graphviz&#xff0c;可以使用命令行工具apt进行安装。 安装Graphviz的步骤相对简单。打开终端&#xff0c;输入以下命令更新软件包列表&#xff1a;sudo apt update。之后&#xff0c;使用命令sudo apt install graphviz来安装Graphviz软件包。为…

mysql笔记:24. 主从同步环境搭建

文章目录 主从同步的基本原理主从同步的搭建步骤1. 环境准备2. 配置主服务器&#xff08;Master&#xff09;3. 配置从服务器&#xff08;Slave&#xff09;4. 测试配置5. 常见故障5.1. 主从服务器上的MySQL版本不一致导致失败&#xff1f;5.2. Slave_IO_Running状态异常&#…

Mybatis之自定义映射resultMap

学习的最大理由是想摆脱平庸&#xff0c;早一天就多一份人生的精彩&#xff1b;迟一天就多一天平庸的困扰。各位小伙伴&#xff0c;如果您&#xff1a; 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持&#xff0c;想组团高效学习… 想写博客但无从下手&#xff0c;急需…

深度学习之本地部署大模型ChatGLM3-6B【大模型】【报错】

文章目录 0.前言1.模型下载2.配置环境2.1 下载项目文件2.2 配置环境 3.开始推理4.总结 0.前言 本博客将介绍ChatGLM3-6B大模型在Ubuntu上的本地部署教程 1.模型下载 由于毛毛张的服务器服务无法科学上网&#xff0c;所以模型的相关文件必须现在本地下载好&#xff0c;再上传到…

抖店怎么入驻?2024最新入驻流程,新手必看!

我是电商珠珠 最近&#xff0c;很多新手都来问我&#xff0c;入驻抖店的话有没有什么学习资料啊&#xff0c;入驻都需要什么资质啊等等&#xff0c;我也整理了一份&#xff0c;新手入门必备资料&#xff0c;需要的可以来找我拿。 下面我来说说抖店的入驻资质&#xff0c;以及…

C++ —— 内存管理

目录 1. C内存分布 2. C 内存管理方式 2.1 new 和 delete 操作内置类型 2.2 new 和 delete 操作自定义类型 3. operator new与operator delete函数 4. new和delete的实现原理 5. malloc/free 和 new/delete 的区别 1. C内存分布 首先看一段代码&#xff1a; int globalV…

Vue 3响应式系统详解:ref、toRefs、reactive及更多

&#x1f31f; 前言 欢迎来到我的技术小宇宙&#xff01;&#x1f30c; 这里不仅是我记录技术点滴的后花园&#xff0c;也是我分享学习心得和项目经验的乐园。&#x1f4da; 无论你是技术小白还是资深大牛&#xff0c;这里总有一些内容能触动你的好奇心。&#x1f50d; &#x…

停车管理系统asp.net+sqlserver

停车管理系统asp.netsqlserver 说明文档 运行前附加数据库.mdf&#xff08;或sql生成数据库&#xff09; 主要技术&#xff1a; 基于asp.net架构和sql server数据库&#xff0c; 功能模块&#xff1a; 停车管理系统asp.net sqlserver 用户功能有菜单列表 我的停车记录 专…

赋能数据收集:从机票网站提取特价优惠的JavaScript技巧

背景介绍 在这个信息时代&#xff0c;数据的收集和分析对于旅游行业至关重要。在竞争激烈的市场中&#xff0c;实时获取最新的机票特价信息能够为旅行者和旅游企业带来巨大的优势。 随着机票价格的频繁波动&#xff0c;以及航空公司和旅行网站不断推出的限时特价优惠&#xff…

汽车KL15、KL30、ACC的区别

文章目录 前言一、KL30是什么&#xff1f;二、KL15是什么&#xff1f;KL15信号的演变 三、为啥用KL15、KL30呢&#xff1f; 前言 相信刚接触汽车电子的伙伴都会有一个疑惑&#xff0c;什么是KL15?什么是KL30? 内心一脸懵逼…… KL是德语Klemme的缩写&#xff0c;指的是ECU的…