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

文章目录

前言

背景介绍

问题描述

分析排查

解决方案

总结归纳


前言

见《研发日记,Matlab/Simulink避坑指南(一)------Data Store Memory模块执行时序Bug》

见《研发日记,Matlab/Simulink避坑指南(二)------非对称数据溢出Bug》

见《研发日记,Matlab/Simulink避坑指南(三)------向上取整Bug》

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

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

背景介绍

在一个嵌入式软件项目中,需要将一组16位的数据,按照高低字节拆分成8位的。思路是使用Simulink中的Extract Bits模块构建一个字节分割子系统,把每个数据分割开,示例如下;

问题描述

按照上述示例,拿一个16位数据验证时,没有什么问题。但是拿一组16位数据进行字节分割时,全部的高字节被放在一起,全部的低字节被放在了一起,示例如下:

分析排查

把全部信号的Dimensions打出来,看到数据处理的过程不是逐个数据求高低字节。而是先把数组的高字节求出来,然后再把全部的低字节求出来,最后把两部分合并的一起,示例如下:

解决方案

一、先用Selector模块把要处理的数据分成单个元素,然后再逐个调用上述字节分割的子系统,分割之后再把所有字节合并起来,示例如下:

重新运行程序,问题不再出现,Bug修复完工,示例如下:

二、上述方案在处理少量数据时没有任何问题,但是当数据量增加需要手动编辑大量模块,应用起来非常吃力。

于是考虑引入一个for循环,改用字节掩码和数移位的方式来处理上述数据,示例如下:

R 复制代码
function y = fcn(u)

temp = uint8(zeros(200,1));

k = 1;
for i=1:1:length(u)
    temp(k) = bitshift(bitand(u(i), hex2dec('FF00')),-8);
    k = k+1;
    temp(k) = bitand(u(i), hex2dec('00FF'));
    k = k+1;
end

y = temp(1:length(u)*2);

重新运行程序,功能符合要求,也没有新的问题出现,Bug优化完工,示例如下:

总结归纳

Simulink中单个的模块本身是可以处理数组或者矩阵这样的数据的,但是组合起来的模块在处理数组和矩阵时会出现一定的逻辑问题,类似上述示例展示,需要开发者自己加以甄别。


版权声明:原创文章,转载和引用请注明出处和链接,侵权必究!

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

相关推荐
茗创科技12 小时前
种子点分析vs全脑分析:共激活模式(CAP)到底怎么选?
神经网络·脑网络·数据处理
星夜离尘5612 小时前
MATLAB 清洗 CSV 采样日志:重复时间戳、无效行、分组统计与自动出图
开发语言·matlab·数据分析·数据清洗·csv
星夜离尘5613 小时前
MATLAB FFT 单边幅度谱:归一化、奇偶长度与频谱泄漏的完整实验
开发语言·matlab·信号处理·频谱分析·fft
星夜离尘5613 小时前
MATLAB 5 点滑动平均:filter 与 conv 的输出对齐,以及 2 样本延时的含义
开发语言·算法·matlab·滤波·fir
道道_Love1 天前
AI 调 MATLAB 用 MCP 太难用?单元设计规范和测试用例,用原生 AI 一次生成
人工智能·matlab·设计规范
菜鸟~noob2331 天前
【电子战】第31篇:3D AOA 定位——方位+俯仰联合
开发语言·matlab·3d
iCxhust2 天前
Matlab求解发电机的极限切除角
开发语言·算法·matlab·电力系统
LMT_Lanmantech3 天前
MATLAB合规管理:如何避免侵权赔偿和审计风险
开发语言·matlab·信息可视化
xixixi777773 天前
大语言模型(LLM)核心能力及在政务领域的全域落地应用解析
人工智能·安全·ai·语言模型·大模型·数据处理·政务
Evand J3 天前
【PMSM例程6】永磁同步电机(PMSM)基于增广EKF的d-q轴电感分阶段辨识算法|电机参数估计与误差分析
算法·matlab·电机·ekf