研发日记,Matlab/Simulink避坑指南(九)——可变数组应用Bug

文章目录

前言

背景介绍

问题描述

分析排查

解决方案

总结归纳


前言

        见《研发日记,Matlab/Simulink避坑指南(四)——transpose()转置函数Bug》

        见《研发日记,Matlab/Simulink避坑指南(五)——CAN解包 DLC Bug》

        见《研发日记,Matlab/Simulink避坑指南(六)——字节分割Bug》

        见《研发日记,Matlab/Simulink避坑指南(七)——数据溢出钳位Bug》

        见《研发日记,Matlab/Simulink避坑指南(八)——else if分支结构Bug》

背景介绍

        最近在一个项目中,使用Simulink写一段嵌入式代码,功能是求几个电压信号的方差。乍一看感觉挺简单,想着直接用一个MATALAB Function 函数var(x,1)就能搞定了,但是就这么一个小应用让我倒腾了几个小时。下面就来分享一下这一小段个人经历。

        一开始代码调试的时候很顺利,我定义了一个固定Size的数组x,外部赋了几个固定电压值,用生成的代码求出来的方差也是对的。代码大概是下面这个样子:

function Variance = fcn(Voltage)
x = zeros(1,100);
for i=1:1:100x(i) = Voltage(i);
end
Variance = var(x,1);

问题描述

        但是问题就在于var(x,1)这个函数求方差的算法是基于数组Size的,数组的Size在初始化的时候就定死了是100,但是我的应用中电压值的个数是动态变化的。于是我就把代码改成了下面这样:

function Variance = fcn(Voltage,N)
x = zeros(1,N);
for i=1:1:Nx(i) = Voltage(i);
end
Variance = var(x,1);

        但是这样生成代码的时候,一直报下面这个错误。

分析排查

        Diagnostic Viewer里边的大概意思是说编译器定义x数组的时候,N的值是可变的,当前的工程配置不支持这样的用法。

解决方案

        我在代码生成的配置里边勾上了下面这个选型,打开了可变数组应用。如下图所示:

        再次编译就不报上面的错误了。但是报一个新的错误,Diagnostic Viewer里边的提示大概意思是说生成的代码Memory太大了。于是我才想到,可变数组也就意味这动态内存,当数组的Size未知的时候,编译器有可能分配了一个很大的Size。记得当时查资料好像是说默认用64KB,这样的数组确实大了。

        于是我就在数组定义前面,给N加了一个限定范围,代码改出来是下面这个样子:

function Variance = fcn(Voltage,N)
assert(N<=100);
x = zeros(1,N);
for i=1:1:Nx(i) = Voltage(i);
end
Variance = var(x,1);

        到此为止,这个求方差的应用就算是能用起来了。

总结归纳

        那么这个代码调试过程,以及后来几天调用这段代码,发现的问题可以积累下来这么几条小经验以供自己将来使用,也给广大网友参考:

        1、函数var(x,1)求方差的算法,直接依赖于数组x的Size;

        2、嵌入式代码中Memory有限,一般不使用动态数组,如果使用了也不能承载太大的动态内存;

        3、可变数组在使用时,除了限定最大范围,而且N初始化时不能使用0或1这样比较小的数,否则后面的数组还是无法使用,还是会编译报错;


        版权声明:原创文章,转载请注明出处与链接,违者必究!

        上述例程使用的Demo工程,可以到笔者的主页查找和下载。

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

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

相关文章

Hive之set参数大全-19

指定用于计算列的唯一值数&#xff08;NDV&#xff0c;即基数&#xff09;的算法 在 Hive 中&#xff0c;hive.stats.ndv.algo 是一个配置参数&#xff0c;用于指定用于计算列的唯一值数&#xff08;NDV&#xff0c;即基数&#xff09;的算法。以下是有关该参数的一些解释&…

计算机网络之ARP协议

ARP&#xff08;地址解析协议&#xff0c;Address Resolution Protocol&#xff09;是一种用于在网络中解析或确定目标主机的物理地址&#xff08;如以太网MAC地址&#xff09;的网络协议。ARP主要用于IPv4网络&#xff0c;它使得设备能夠在知道目标设备的IP地址的情况下找到其…

qemu + vscode图形化调试linux kernel

一、背景 使用命令行连接gdb 在调试时&#xff0c;虽然可以通过tui enable 显示源码&#xff0c;但还是存在设置断点麻烦&#xff08;需要对着源码设置&#xff09;&#xff0c;terminal显示代码不方便&#xff0c;不利于我们学习&#xff1b;另外在gdb 下p命令显示结构体内容…

重构改善既有代码的设计-学习(六):处理继承关系

1、函数上移&#xff08;Pull Up Method&#xff09; 无论何时&#xff0c;只要系统内出现重复&#xff0c;你就会面临“修改其中一个却未能修改另一个”的风险。通常&#xff0c;找出重复也有一定的难度。 所以&#xff0c;某个函数在各个子类中的函数体都相同&#xff08;它们…

Pandas--数据结构 - Series(3)

Pandas Series 类似表格中的一个列&#xff08;column&#xff09;&#xff0c;类似于一维数组&#xff0c;可以保存任何数据类型。 Series 特点&#xff1a; 索引&#xff1a; 每个 Series 都有一个索引&#xff0c;它可以是整数、字符串、日期等类型。如果没有显式指定索引&…

Android Automotive:在路上释放 Android 操作系统的力量

Android Automotive&#xff1a;在路上释放 Android 操作系统的力量 Android 在汽车行业的历程车载信息娱乐系统 (IVI) 的演变汽车中的 Android&#xff1a;演变和进步Android 汽车操作系统的崛起Polestar 2&#xff1a;开创 Android 汽车体验Android 开源项目 (AOSP) 及其他项…

数据结构 练习题1答案版

1. 含有3个结点的二叉树的树形共有&#xff08;&#xff09;种。 A.2 B&#xff0e;5 C.6 D&#xff0e;7 2. 一棵二叉树共有25个结点,其中5个是叶子结点,则度为1的结点数为( ) A&#xff0e;16 B&#xff0e;10 C&#xff0e;6 D&#xff0e;4 3. 某二叉树有5个度为…

华为三层交换机与防火墙对接配置上网示例

三层交换机与防火墙对接上网配置示例 组网图形 图1 三层交换机与防火墙对接上网组网图 三层交换机简介配置注意事项组网需求配置思路操作步骤配置文件 三层交换机简介 三层交换机是具有路由功能的交换机&#xff0c;由于路由属于OSI模型中第三层网络层的功能&#xff0c;所以…

mac安装mysql的8.0设置面板启动不了

1、前言 记得之前安装mysql5.7的时候&#xff0c;是可以直接从设置里面的mysql面板启动的&#xff0c;但是到了mysql8.0之后就启动不了了&#xff0c;这个问题不知道是版本问题还是我换了m系列芯片的mysql导致的&#xff0c;之前很多次都启动不了&#xff0c;这次搞了下&#x…

计算机网络之三次握手,四次挥手

TCP&#xff08;传输控制协议&#xff09;是一种面向连接的、可靠的传输层协议&#xff0c;用于在网络中的两个应用程序之间建立可靠的通信连接。TCP的核心特征之一是它使用“三次握手”过程来建立连接&#xff0c;以及“四次挥手”过程来终止连接。 三次握手&#xff08;建立…

力扣20、有效的括号(简单)

1 题目描述 图1 题目描述 2 题目解读 给定的字符串只包含括号&#xff0c;判断这个字符串中的括号是否按照正确顺序出现&#xff0c;即这个字符串是否有效。 3 解法一&#xff1a;栈 C的STL中的stack&#xff0c;在解题时非常好用。 3.1 解题思路 使用栈stk&#xff0c;并枚举…

Windows 和 Anolis 通过 Docker 安装 Milvus 2.3.4

Windows 10 通过 Docker 安装 Milvus 2.3.4 一.Windows 安装 Docker二.Milvus 下载1.下载2.安装1.Windows 下安装&#xff08;指定好Docker文件目录&#xff09;2.Anolis下安装 三.数据库访问1.ATTU 客户端下载 一.Windows 安装 Docker Docker 下载 双击安装即可&#xff0c;安…

更新最近可以使用的 ip归属地免费api

太平洋IP地址归属地查询接口&#xff1a; 请求接口&#xff1a;http://whois.pconline.com.cn/ipJson.jsp?ip123.123.123.123&jsontrue 返回结果包括国家、省份、城市等信息。此外&#xff0c;如果IP地址为空&#xff0c;接口还可以根据网络定位返回设备位置信息。www.ip.…

【美团】交易系统平台-数据仓库研发工程师

更新时间&#xff1a;2024/01/28&#xff5c;工作地点&#xff1a;北京市&#xff5c;事业群&#xff1a;到家事业群&#xff5c;工作经验&#xff1a;3年 部门介绍 到家研发平台秉承“零售科技”战略&#xff0c;致力于推动餐饮、零售需求侧和供给侧数字化升级&#xff0c;构…

移动Web——平面转换-多重转换

1、平面转换-多重转换 多重转换技巧&#xff1a;先平移再旋转 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta http-equiv"X-UA-Compatible" content"IEedge" /><meta name&qu…

Hive中left join 中的where 和 on的区别

目录 一、知识点 二、测试验证 三、引申 一、知识点 left join中关于where和on条件的知识点&#xff1a; 多表left join 是会生成一张临时表。on后面&#xff1a; 一般是对left join 的右表进行条件过滤&#xff0c;会返回左表中的所有行&#xff0c;而右表中没有匹配上的数…

第3讲 谈谈final、finally、 finalize有什么不同?

参考 三者区别 final final 是 java 关键字可修饰变量&#xff08;类成员变量、类静态变量、局部变量和形参&#xff09;&#xff1a;表示不可修改当前变量的值&#xff08;这里的值可以是地址&#xff0c;也可以是基本类型的值&#xff09;#&#xff08;注意&#xff1a;fi…

C++11(中):智能指针

智能指针 1.内存泄漏1.1内存泄漏的概念以及危害1.2内存泄漏的场景1.3如何避免内存泄漏 2.智能指针的使用及原理2.1RAII2.2智能指针的原理2.3 std::auto_ptr2.4 定制删除器2.5 std::unique_ptr2.6 std::shared_ptr2.7 std::weak_ptr2.7.1 std::shared_ptr的循环引用2.7.2 循环引…

Spring Cloud 之 Gateway详解

大家好&#xff0c;我是升仔 前言 在微服务架构中&#xff0c;网关扮演着至关重要的角色。它不仅是服务与外界交流的门户&#xff0c;还负责路由、过滤和安全等重要功能。Spring Cloud Gateway作为Zuul的继任者&#xff0c;凭借其更高的性能和灵活的配置方式&#xff0c;成为…

26. 删除有序数组中的重复项()-双指针

给你一个 非严格递增排列 的数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使每个元素 只出现一次 &#xff0c;返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。 考虑 nums 的唯一元素的数量为 k &#xff0c;你…