Design Verifier检查:整型数溢出检查与修复

汇聚博主多年工程经验的新书《Simulink嵌入式开发实战》现已上市,针对Simulink与MBD开发技术,形成了一套完整的知识体系和方法论。详细介绍和优惠链接可以参考博客《Simulink嵌入式开发实战》新书上市,感谢粉丝长期以来的支持!

文章目录

  • [1 整型数溢出](#1 整型数溢出)
  • [2 建模与检查示例](#2 建模与检查示例)
    • [2.1 搭建整型数溢出模型](#2.1 搭建整型数溢出模型)
    • [2.2 配置Design Verifier检查](#2.2 配置Design Verifier检查)
    • [2.3 查看分析结果](#2.3 查看分析结果)
  • [3 修复方案](#3 修复方案)
    • [3.1 修改输出数据类型](#3.1 修改输出数据类型)
    • [3.2 限制输入范围](#3.2 限制输入范围)
  • [4 总结](#4 总结)

本文介绍Simulink Design Verifier中的整型数溢出检查方法,包括整型数溢出的概念和风险、示例模型的搭建与检查,以及常见的修复方案。Matlab版本为2026a。

1 整型数溢出

整型数据类型能够表示某个整数范围的取值。例如,int8类型的取值范围为-128~127。

假设一个int8类型的输入信号取值为64,经过Gain为2的增益运算后,理论结果为128。如果输出的数据类型也是int8,那就超出了127的上限,造成了整型数溢出。

实际工况中,整型数溢出可能一直不会出现,而是在某些特定的工况下。人工设计测试用例很可能测不出这类问题,使用Design Verifier检查可以有效地识别出该类风险。

2 建模与检查示例

2.1 搭建整型数溢出模型

新建模型一个slx模型,在模型中依次放置Inport、Gain和Outport模块,如下图。

将根层Inport的输出数据类型设置为int8,如下图。

Gain模块的参数设置如下:

  1. Gain取值设置为2;
  2. Output data type设置为int8;
  3. 取消勾选Saturate on integer overflow;

    此时Gain模块的输入和输出都是int8。当输入大于63或者小于-64时,乘以2后的结果就会超出int8范围。

另外,Design Verifier要求模型使用固定步长求解器。可以在Model Settings → Solver中将Type设置为Fixed-step。

2.2 配置Design Verifier检查

在Simulink上方的Apps中打开Design Verifier,将分析模式选择为【Design Error Detection】。

在Settings → Design Verifier → Design Error Detection中关闭【Defect Checker】,再启用【Integer overflow】,通过这种方式只检查溢出这一种问题。

配置完成后,点击【Detect Design Errors】执行分析过程。

2.3 查看分析结果

执行完成后,在弹出地报告窗口中会显示有一条未通过,如下图。

点击下方的【Highlight analysis results on model】,就会将Gain模块高亮显示,表示该处产生了溢出。

鼠标左键点击Gain模块,会在另一个窗口显示问题描述,此处显示为溢出错误,如下图。

3 修复方案

3.1 修改输出数据类型

如果Gain模块地上游信号真实取值能到到【-128,127】的边界,那没Gain输出信号的取值范围必须覆盖【-256,254】,将Gain模块的Output data type从int8修改为int16,即可完整表示该范围。

这种方案使用了合理的类型表示大范围数据,一定不会出错。

3.2 限制输入范围

假如上游信号的真实取值不可能达到【-64,63】范围之外,只是使用了int8这个类型,那么即使输出类型使用int8也不会溢出。

在这种情况下,可以在inport的参数配置界面将MinMax取值配置成真实物理取值范围,如【-10,10】。

这样在Design Verifier检查时就能检索到输入信号的范围,从而推算出输出范围是【-20,20】,在int8类型下不会出现溢出,从而不会再报错。

4 总结

整型数溢出的本质是运算结果超出了数据类型能够表示的范围。溢出后产生非预期的数值大小对嵌入式控制算法具有较大风险。Design Verifier可以在软件设计早期提前识别该风险并修复。

>>返回个人博客总目录

相关推荐
吃好睡好便好5 小时前
判断函数的使用
学习·算法·matlab·生活·判断函数
hu9245195595 小时前
Matlab保护源代码—P文件和exe文件详细解析
开发语言·matlab
史上最甜的躯6 小时前
控制系统——基础、导论;以直流电机控制系统为例详解微分方程模型、拉普拉斯变换、传递函数模型的理论、推导及仿真
matlab·simulink·传递函数·控制系统·拉普拉斯·电机模型
lingchen19061 天前
用MATLAB r2010b和r2016b求解微分方程组
开发语言·算法·matlab
可编程芯片开发1 天前
基于李雅普诺夫算法的四旋翼无人机姿态跟踪控制系统simulink建模与仿真
matlab·无人机·制造·四旋翼无人机·李雅普诺夫·姿态跟踪控制
matlab代码3 天前
基于matlab的玉米种子计数设计(GUI界面)【源码58期】
开发语言·matlab
吃好睡好便好3 天前
转换函数的使用
学习·matlab·生活·转换函数
吃好睡好便好4 天前
取整函数的使用
学习·matlab·生活·取整函数
Funing75 天前
STM32 电机动态 PI 控制:从编码器反馈、增量式 PI 到 Matlab 参数拟合与 PWM 输出
stm32·嵌入式硬件·matlab·pi控制算法