概述
前言
Simulink中模型设置是关乎着整个模型的运行模式以及代码生成样式,不同的设置关乎着不同的结果,今天就给大家讲解下作者对整个模型设置的理解,有疑问的地方还需要大家多多指出,谢谢
使用版本:MATLAB 2022a
相关文章:
【Simulink专题】Simulink模型设置(一):求解器、数据导入/导出、数学和数据类型的设置
【Simulink专题】Simulink模型设置(二):诊断、硬件实现、模型引用、仿真目标
代码生成
目标选择
整个界面中关键的设置选项是控制整个代码生成过程的系统文件目标System Target File, ert.tlc文件是Embedded Coedr提供的能生成专门用于嵌入式系统C代码的系统目标文件。在Code Generation页面中,点击浏览即可进入先择系统目标文件的设置其中包含众多架构类型的选项
编译过程
此部分主要是针对于代码的设置与工具链设置,分别针对于仅生成代码和打包代码与工件,工具链的设置主要分构建配置与工具链详细信息
这里建议只生成代码,因为与底层软件集成在一块,然而只需要底层调用app就可以了,编译的话的话会额外花费时间去集成代码
代码生成目标
此部分主要是针对于代码生成目标设置,选择模型代码生成的最优先目标,右边按键设置目标中选择其中选项作为代码生成的最优项
生成代码检查模型:在代码生成前,查看模型是否运行且无异常
优化
1、默认参数行为:生成代码时常量参数的形式。
该配置中包含两个选项:可调和内联。如果选可调,意为可调式,生成的代码就会以StorageClass中
的Auto类来表现常数参数。如果选内联,意为内联式,会把参数“内联”到代码中,表现为直接的数值。
举例
下图是默认参数行为是可调式:
大家可以看到参数1000这个数值不是直接出现在.c文件中的,值通过其他文件调用的,这个参数会存放在data.c中
下图是默认参数行为是内联式:
这里能清除的看到参数1000值是直接存在到.c文件中的,不是通过调用其他文件来实现计算的
注意:
两种情况对代码运行都不会出现影响,但是可调式会占用RAM资源,最终可能会导致资源溢出;
2、可重用子系统输出的传递方式:指定可重用子系统如何传递输出。
默认的是 单个参数,指的是输出为局部变量。还有一个选项是结构体引用,他会生成一个全局结构体变量,然后可复用子系统对应的函数会调用这个结构体的指针,当使用结构体引用时,会生成一个结构体的全局变量、同上文一样,会出现RAM资源紧张问题,个人推荐使用单个参数
3、删除根级I/O零初始化:这个设置就是设置在初始化子系统后所有的输入输出会不会默认为0
举例
在勾选删除根级I/O零初始化时,代码生成如下
在不勾选删除根级I/O零初始化时,代码生成如下
两个结果清除的能看到代码生成后的区别,设值不勾选删除根级I/O零初始化时,会生成接口默认值为0的代码,同理,这部分代码也会占用RAM资源,作者建议直接勾选此设置,除了一种特殊的情况,如果控制器因为某种原因,复位后没有将RAM中的数值清零。这时候就需要这部分的初始化函数。
4、删除内部数据零初始化
好多模块可能存在内部变量存储,以及默认存储值。Unit Delay为例子
在不勾选删除内部数据零初始化,这里会对Unit Delay模块内部的全局变量初始化为0
在勾选了删除内部数据零初始化的时候,初始化函数中就不会把Unit Delay模块内部的全局变量初始化为0。
5、优化级别:选择要应用于生成代码的优化级别。
这部分时选择优化程度,可以选择强化级别和优先级,也可以先择指定自定义优化
报告
此页面主要是打开设置关于生成代码报告的页面,也可以选择是否创建HTML格式的代码生成报告,通过勾选设置是否在模型编译结束后打开,指标中的S生成静态代码指标勾选时会在代码生成报告中包含静态代码的参数指标,推荐只勾线创建代码生成报告和自动打开报告两个选项模型生成完代码后会走动弹出报告
注释
注释子标签中对代码生成中注释内容的配置,其对话框如上图所示,包括选项的勾选决定是否在代码生成中添加Siumlink自带的注释,启动此选项后,自动生成的注释组以及自定义注释组的选项便会被激活,我们可以根据选择希望生成的注释内容
标识符
标识符子标签页用于设置ert.tlc系统目标文件控制下的diamante生成不规定规则,如上图所示。这些符号包括数据变量和数据类型的定义、常用宏、子系统方法、模块的输出变量、局部临时变量及命名的最长字符数等。
这些标示符的具体意义如下表所示:
标识符 | 作用说明 |
---|---|
$R | 表示根模型的名字,将C语言不支持的字符替换为下划线 |
$N | 表示Siumlink对象;模块、信号或信号对象、参数、状态等的名字 |
$M | 为了避免命名冲突,必要时追加在后缀以示区分 |
$A | 表示数据类型 |
$H | 表示系统层级标示符。对于根层次模块,root_,;对于子系统模块:sN_,N是Siumlink分配的系统编号 |
$F | 表示函数名,如表示更新函数时使用_Update |
$C | 校验和标示符,用于防止命名冲突 |
$ I | 表示输入/输出标示符,输入端口使用u表示,输出端口则使用y表示 |
通过上表各种标示符的不同组合,即可规定生成代码中各个部分(变量、常量、函数名、结构体及对象)的名称的生成规则。
Simulink提供的这些标示符生成的变量名虽然可读性不强,但是不会引起代码编译错误。推荐使用默认方式,以免造成不必要的错误。
自定义代码
自定义代码子标签页主要用于添加用户自定义的或者编程模型时必须的源文件、头文件、文件夹或者文件库等,页面如上图所示
1、include headers:
如果需要simulink调用自定义的.h文件的话。需要在这里填写相应的头文件,例如:#include "Dsp_Interface.h"格式,这个时候生成代码后,你的头文件会在.h文件中显示
这里作者是做了个枚举的.h文件,读者们可以根据其他需求定义其他文件,这里不详细说明
2、源文件:
源文件中都是.C文件,在使用simulink调用外部函数时可能或使用外部的c文件,这是就需要在其中声明c文件使用,例如:Dtc_MonitorHdl.c格式,这个时候生成代码,你的c文件会在代码生成文件中的Other files中显示
接口
软件环境的参数中提供CPL(代码替换库)的选择,CPL中定义一个表,根据表格将Simulink模块与所对应目标语言的数学函数以及操作函数库挂接,以便从模型生成代码。Embedded Coder提供默认的CPL。
支持参数由6个选择构成,如下:
每个选择框代表一种嵌入式编码器对代码生成的支持功能,其中一些功能是需要Simulink提供的头文件来支持才能编译为木匾文件的,这些头文件一部分储存在路径为MATAB/Broot/simulink/include的文件夹中,一部分是在模型生成diamante过程中自动发生成的(rt开头的头文件)
选择框 | 所需头文件 |
---|---|
浮点数 | rtw_solver.h |
非有限数 | Rt_nonfinite.h |
复数 | – |
绝对时间 | – |
连续时间 | Rt_continuous.h |
可变大小信号 | Fixedpoint.h |
代码与数据交换接口参数组用来配置生成代码的接口及数据记录的方式,如无特殊要求建议使用默认配置
代码样式
代码样式子标签页面提供了一些关于生成代码风格的选择框选项,如if else分支的完整性确保,if else与swith case语句的选用,生成括号的频度,是否保留函数声明中的extern关键字等,
验证
此处建议默认设置
模板
模板子标签页面内嵌入式编码器提供了一组默认的代码生成模板,如上图所示:
ert_code_template.cgt中主要规定了代码段的顺序,section包含了源文件从注释到变量再到函数体各种分段。依次为:文件说明的注释(File Banner)、头文件包含(Includes)、宏定义(Defines)、数据结构类型的定义(Types)和枚举类型的定义(Enum)、各种变量的定义(Definitions),以及函数体的声明(Declarations)和闲数图体定义(Functions)。我们可以在相邻的段中插入自定义内容,但是不要打乱寄存段的相对顺序
生成代码主程序
这里如果选中的话,会在生成代码时生成发一个main函数,这里不建议勾选,因为其他代码的原因
代码布局
代码布局子标签提供的选项将影响代码生成的文件组织方式和数据存储方式及头文件包含的分隔符选择等,常用的选项是文件打包格式,便是生成文件的组织方式,对应生成文件的个数不同,内容紧凑度也不同,具体如下:
文件打包格式 | 生成的文件列表 | 省去的文件列表 |
---|---|---|
模块化 | model.c 、 subsystem files(optional)、 model.h、model_types.h、 model_private.h、 model_data.c(conditional) | |
紧凑 | model.c、model.h | model_data.c 、 model_private.h 、 model_types.h |
紧凑(具有单独的数据文件) | model.c、model.h、model_data.c(conditional) | model_types.h、model_private.h |
省去的只是文件的个数,但是内容被合并到其他文件中,具体内容如下:
文件 | 合并后的文件 |
---|---|
model_data.c | model.c |
model_private.h | model.c、model.h |
model_types.h | model.h |
在这里推荐使用默认设置,如果希望生成代码文件列表中的文件减少,可以考虑其他设置
模块化:
模块化会在model中多出两个文件,这两个文件主要时存放
紧凑(具有单独的数据文件):
紧凑:
数据类型替换
数据类型替换子标签默认情况下仅提供一个选择选项,勾选之后则弹出3列数据类型列表,分别是simulink name,code generation name和replacement。前两列按照数据类型的对应关系给出了每种数据类型在Simulink和嵌入式编码器生成代码中的类型名,第3列则供给用户设置,填入自定义的类型名之后,生成代码时将使用自定义的类型名替换为Code generation name
用户填人的自定义类型名称不仅是一个别名字符串,还必须在Base Workspace中定义作为siumlink.Alias Type类型对象才可以。如定义U16数据类型别名对象俩替换uint16_T这个内部类型。第3列的edit框不必全部填入自定义类型名,可以根据应用场合选择部分或全部来使用。丙炔可以使用同一个数据类型名替代多个内建数据类型,如使用U8同时替换uint8_T和Boolean_T类型。
覆盖率
覆盖分析使能和覆盖范围选择:
1、Entire System:整个系统
2、Referenced Models:参考模型,可选择
3、SubSystem:子系统,可选择
包含的分析项:
默认勾选MATLAB files C/C++ S-Functions
模型覆盖的类型:
1、序复杂性
序复杂性是指模型结构复杂性的度量,为了计算对象的序复杂性,模型覆盖用下面的公式:
N是对象表示的决策点数,On是第N个决策点的输出数。
2、决策覆盖(DC)
决策覆盖分析模型中表示决策点的要素,比如开关模块或者状态流状态,对于这些项,,模型覆盖确定模拟测试时实际通过这些路径的百分率。
3、条件覆盖(CC)
条件覆盖分析组合逻辑(比如逻辑操作)和状态转移,条件覆盖分析报告是否模型中的每个模块被完全覆盖了。
当收集模型覆盖,可能达不到100%的条件覆盖,比如如果确定短路逻辑模块(一种处理方式),就达不到100%的覆盖率。
4、改进条件/决策覆盖(MCDC)
改进的条件/决策覆盖分析扩展了决策和条件的覆盖能力,它确定测试实验测试逻辑模块输入和转移条件独立性的程度。
一个测试实验达到模型的完全覆盖,当改变模块的一个独立于其他输入,引起了模块输出的改变。
一个测试实验达到状态转移的完全覆盖,也就是每个转移条件在一个条件触发时,状态至少转移一次。
MCDC也不保证100%的决策覆盖和条件覆盖。
5、查表条件覆盖
查表覆盖用表实体的输入、输出、内插、外推信息来分析模块,它记录每个内插间隙被使用的频率,要达到完全覆盖,每个内插和外插间隙至少被执行一次。
6、信号范围覆盖
信号范围覆盖是在模拟期间记录模型中每个模块的最大值、最小值。
7、信号宽度覆盖
信号宽度覆盖记录可变信号宽度信号的最大值、最小值。
8、目标和约束
通过Simulnk的 Design Verifier blocks,可以在模型中指定目标和约束。为了检查这些目标是否得到满足,首先只用这些模块生成测试用例。也可以在原始模型上执行这些测试用例,并记录指定目标是否至少满足一次。要记录此覆盖率,请启用此参数。
9、在整数溢出覆盖率上启用饱和
对于某些模块,例如Abs模块,可以指定其在整数溢出时饱和,如果启用此参数,将记仿真期间这些模块饱和的次数。
10、关系边界覆盖
某些模块(如关系运算模块或if模块)使用关系操作。如果启用此参数,覆盖率分析将检查这些操作是使用相等(整数)值还是几乎相等(浮点)值执行的
Advanced parameters
1、 限制覆盖记录间隔:
仅在指定的时间间隔内记录覆盖率。
例如,如果模型在仿真初期时有瞬态效果,或者仅为特定模型操作报告模型覆盖率,则
可能需要限制模型覆盖率记录。
仅在指定时间间隔内记录覆盖率。要指定时间间隔,请使用以下参数:
Coverage interval recording start time
Coverage interval recording stop time
2、强制‘折叠模块’关闭
报告覆盖率支持的模型中每个模块的覆盖率。
记录模型中每个受支持的模块的覆盖率。配置参数模块缩减的值将被忽略。
3、 将Simulink逻辑块视为短路
指定覆盖率必须考虑执行逻辑运算模块(例如逻辑运算符模块)中操作数的顺序。
例如,如果考虑到逻辑AND模块的两个输入的顺序,当第一个输入为false时,第二个输入时冗余的。因此,对于第一个输入为假的情况,不考虑通向第二个输入的路径覆盖范围。
4、 MCDC mode:
指定覆盖率分析期间使用的修改条件/决策覆盖率(MCDC)的定义。
Masking:使用封装MCDC分析。为了确定输入的独立性,封装MCDC分析不要求在一个输入变化时所有其他输入严格保持不变。因此,封装MCDC分析允许在给定仿真中满足更多的目标。
Unique-Cause:独特原因的MCDC分析。
5、 模型中存在不支持模块时发出警告
6、 指定过滤器文件,以便在模拟期间从覆盖率分析中排除某些模型对象。
可以使用命令行API为模块创建过滤规则。筛选的选择标准包括按单个ID筛选、筛选相同类型的所有模块、筛选模块的某些决策、条件和结果等。还可以通过代码覆盖结果过滤S函数C++代码。
最后
以上就是故意白羊为你收集整理的【Simulink专题】Simulink模型设置(三):代码生成前言相关文章:代码生成覆盖率的全部内容,希望文章能够帮你解决【Simulink专题】Simulink模型设置(三):代码生成前言相关文章:代码生成覆盖率所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复