【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.mzph.cn/news/759644.shtml

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

相关文章

汇编语言中的start有什么用

一 START END 开头有个START 结尾有个END 1.汇编语言中的start有什么用? start就是一个标号,标志程序的入口而已,程序加载到内存之后CS:IP会指向这个标号,从START指向的指令开始运行 这个标号不一定是START,你也可以用MAIN,但在程序的最后要用END MAIN来提示程序…

流畅的 Python 第二版(GPT 重译)(十三)

第二十四章:类元编程 每个人都知道调试比一开始编写程序要困难两倍。所以如果你在编写时尽可能聪明,那么你将如何调试呢? Brian W. Kernighan 和 P. J. Plauger,《编程风格的要素》 类元编程是在运行时创建或自定义类的艺术。在 P…

Spring Data访问Elasticsearch----查询方法

Spring Data访问Elasticsearch----查询方法 一、查询lookup策略1.1 声明的查询 二、创建查询三、方法返回类型四、使用Query注解 一、查询lookup策略 Elasticsearch模块支持所有基本的查询构建功能,如字符串查询、native搜索查询、基于条件的查询和从方法名派生的查…

vue3+vite+Electron构建跨平台应用

1.搭建第一个 electron-vite 项目 electron-vite 是一个新型构建工具,旨在为 Electron 提供更快、更精简的开发体验。它主要由五部分组成: 一套构建指令,它使用 Vite 打包你的代码,并且它能够处理 Electron 的独特环境,包括 Node.js 和浏览器环境。 集中配置主进程、渲染…

局域网内怎么控制另一台电脑

局域网内怎么控制另一台电脑 在局域网内控制另一台电脑是一个相对高级的操作,通常用于远程管理、技术支持或资源共享等场景。要实现这一功能,需要确保两台电脑都连接到同一个局域网,并且已进行适当的配置。以下是几种常见的方法:…

【蓝桥杯选拔赛真题42】C++切蛋糕 第十四届蓝桥杯青少年创意编程大赛 算法思维 C++编程选拔赛真题解析

目录 C切蛋糕 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 七、推荐资料 C切蛋糕 第十四届蓝桥杯青少年创意编程大赛C选拔赛真题 一、题目要求 1、编程实现 有一块矩形蛋糕,小明从蛋糕…

汽车信息安全--密钥管理系统初探(2)

目录 1.HSM中的密钥管理 1.1 密钥生成 1.2 密钥分发 1.3 密钥使用 1.4 密钥存储 <

GCN-Align论文翻译

GCN-Align翻译 Cross-lingual Knowledge Graph Alignment via Graph Convolutional Networks 基于图卷积网络的跨语言知识图谱对齐 Abstract 多语言知识图&#xff08;KGs&#xff09;&#xff0c;如DBpedia和YAGO&#xff0c;包含几种不同语言的实体结构化知识&#xff0c…

linux arm64 opencv 使用MJPG获取摄像头图片

先上代码 #include <opencv2/opencv.hpp>cv::VideoCapture capture(9, cv::CAP_V4L2);if (!capture.isOpened()){qDebug() << "打开摄像头失败";return -1;}if(1){// 设置为 MJPG (Motion-JPEG, compressed)qDebug() << "MJPEG:" <…

墨菲安全在软件供应链安全领域阶段性总结及思考

向外看&#xff1a;墨菲安全在软件供应链安全领域的一些洞察、思考、行动 洞察 现状&挑战&#xff1a; 过去开发安全体系是无法解决软件供应链安全问题的&#xff1b;一些过去专注开发安全领域的厂商正在错误的引导行业用开发安全思维解决软件供应链安全问题&#xff0c;治…

树形递归模板

详情参考CSDN链接: https://www.cnblogs.com/lidar/p/12972792.html public class Menu {// 菜单idprivate String id;// 菜单名称private String name;// 父菜单idprivate String parentId;// 菜单urlprivate String url;// 菜单图标private String icon;// 菜单顺序private …

laravel10使用firebase/php-jwt 6.0

话不多说&#xff0c;直接上示例 <?php /*** Created by PhpStorm* User: xxx 根据自己情况设置* Date: 2024/3/20* Time: 15:53* Brief:* docs:*/namespace App\lib\jwt;use App\Exceptions\BaseException; use Exception; use Firebase\JWT\JWT; use Firebase\JWT\Key;c…

[linux] Key is stored in legacy trusted.gpg keyring

修复 Ubuntu 中的 “Key is stored in legacy trusted.gpg keyring” 问题_key is stored in legacy trusted.gpg keyring (/etc/-CSDN博客 复制到trusted.gpd.d 目录中(快速但不优雅的方法) 如果你觉得手动做上面的事情不舒服&#xff0c;那么&#xff0c;你可以忽略这个警告…

SpringCloud中的@EnableDiscoceryClient和@EnableFeignClients注解的作用解析、RPC远程过程调用

目录 EnableDiscoveryClient 服务发现的核心概念 服务注册中心 EnableDiscoveryClient注解的作用 服务心跳健康检查 使用示例 EnableFeignClients Feign简介 EnableFeignClients注解的作用 RPC&#xff08;Remote Procedure Call&#xff09; 参考链接 Spring Cloud…

vue3 + Element + nodejs 大文件上传、断点续传

前言 大文件上传&#xff0c;一般时间都比较长&#xff0c;这么长的时间内&#xff0c;可能会出现各种各样的问题&#xff0c;比如断网&#xff0c;一旦出错&#xff0c;我们的文件就需要重新上传&#xff0c;这样造成资源浪费&#xff0c;如果我们使用了断点续传继续就不会造成…

ES6 Fetch API的基础使用

XMLHttpRequest 的问题 所有的功能全部几乎在同一个对象上&#xff0c;容易书写出混乱不易维护的代码 采用传统的事件驱动模式&#xff0c;无法适配的 Promise Api Fetch Api 的特点 并非取代 AJAX,而是对 AJAX 传统 API 的改进 精细的功能分割:头部信息、请求信息、响应信…

javaScript——BFS结合队列求迷宫最短路径

这里推荐先去看下B站这个老师讲的BFS迷宫问题&#xff0c;只用看前五分钟就能懂用BFS队列实现的原理。[POJ] 3984 迷宫问题 BFS_哔哩哔哩_bilibili 问题描述&#xff1a;由m*n的矩阵构成了一个迷宫&#xff0c; 矩阵中为1的元素表示障碍物&#xff0c;不能走&#xff0c;为0表示…

如何在职场中提升自己的竞争力

随着社会的发展&#xff0c;职场竞争日益激烈。如何在职场中提升自己的竞争力&#xff0c;成为许多职场人士关注的焦点。本文将从以下几个方面为大家提供一些建议。 一、不断学习&#xff0c;提升专业技能 在职场中&#xff0c;专业技能是衡量一个人竞争力的重要标准。要想在职…

软考高级:项目管理-软件质量控制和质量保证概念和例题

作者&#xff1a;明明如月学长&#xff0c; CSDN 博客专家&#xff0c;大厂高级 Java 工程师&#xff0c;《性能优化方法论》作者、《解锁大厂思维&#xff1a;剖析《阿里巴巴Java开发手册》》、《再学经典&#xff1a;《Effective Java》独家解析》专栏作者。 热门文章推荐&am…

让数据在两个buckets之间传输 - Google Storage Transfer Service

在业务场景中&#xff0c; 有时我们不想直接暴露数据存储空间给上游系统&#xff0c; 而需要设置1个landing Path 让上游系统发送数据 如图&#xff1a; 我们只需grant landing bucket 的权限给上游系统&#xff0c; 而上游系统是访问不了storage bucket的保证了数据隔离 但是…