网上书城网站开发的结论和不足,python线上培训班学费一般多少,图片编辑器免费,网站建设与管理题文章目录
前言
背景介绍
问题描述
分析排查
解决方案
总结归纳 前言 见《研发日记#xff0c;Matlab/Simulink避坑指南(四)——transpose()转置函数Bug》 见《研发日记#xff0c;Matlab/Simulink避坑指南(五)——CAN解包 DLC Bug》 见《研发日记#xff0c;Matlab/Si…文章目录
前言
背景介绍
问题描述
分析排查
解决方案
总结归纳 前言 见《研发日记Matlab/Simulink避坑指南(四)——transpose()转置函数Bug》 见《研发日记Matlab/Simulink避坑指南(五)——CAN解包 DLC Bug》 见《研发日记Matlab/Simulink避坑指南(六)——字节分割Bug》 见《研发日记Matlab/Simulink避坑指南(七)——数据溢出钳位Bug》 见《研发日记Matlab/Simulink避坑指南(八)——else if分支结构Bug》 背景介绍 最近在一个项目中使用Simulink写一段嵌入式代码功能是求几个电压信号的方差。乍一看感觉挺简单想着直接用一个MATALAB Function 函数varx,1就能搞定了但是就这么一个小应用让我倒腾了几个小时。下面就来分享一下这一小段个人经历。 一开始代码调试的时候很顺利我定义了一个固定Size的数组x外部赋了几个固定电压值用生成的代码求出来的方差也是对的。代码大概是下面这个样子
function Variance fcn(Voltage)
x zeros(1,100);
for i1:1:100x(i) Voltage(i);
end
Variance var(x,1);问题描述 但是问题就在于varx,1这个函数求方差的算法是基于数组Size的数组的Size在初始化的时候就定死了是100但是我的应用中电压值的个数是动态变化的。于是我就把代码改成了下面这样
function Variance fcn(Voltage,N)
x zeros(1,N);
for i1: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(N100);
x zeros(1,N);
for i1:1:Nx(i) Voltage(i);
end
Variance var(x,1);到此为止这个求方差的应用就算是能用起来了。 总结归纳 那么这个代码调试过程以及后来几天调用这段代码发现的问题可以积累下来这么几条小经验以供自己将来使用也给广大网友参考 1、函数varx,1求方差的算法直接依赖于数组x的Size 2、嵌入式代码中Memory有限一般不使用动态数组如果使用了也不能承载太大的动态内存 3、可变数组在使用时除了限定最大范围而且N初始化时不能使用0或1这样比较小的数否则后面的数组还是无法使用还是会编译报错 版权声明原创文章转载请注明出处与链接违者必究 上述例程使用的Demo工程可以到笔者的主页查找和下载。