本文摘要:
这篇文章主要介绍Simulink模型参数设置的不同,对生成代码的影响。
选择菜单MODELING,然后点击Model Settings,就可以打开模型参数设置的界面。
在模型参数设置界面有两个值得注意的地方,一个是搜索条,如果你知道参数的名称或关键词,可以直接在搜索栏中输入,来直接搜索想要设置的参数。另一个是每一个界面下面都会有三个点,这个里面隐藏了一些高级设置的参数,点开的话,可以看到更多的设置。
一. 关于模型参数设置的一些小技巧
保存和读取一个模型的参数设置
如果我们把一个模型的参数按照我们想要的情况都设置好了,那之后我们又需要新建一个模型,我们自然不想要再手动的去设置一遍参数。matlab提供了一对函数,Simulink.BlockDiagram.saveActiveConfigSet 和Simulink.BlockDiagram.loadActiveConfigSet,分别是保存一个模型的当前设置为一个m文件,以及把模型参数按照之前保存的配置文件进行设置。这样我们就可以方便的保存和读取模型的参数设置。这两个函数的参数都是2个,第一个是模型名,第二个是参数配置的m文件名。比如
Simulink.BlockDiagram.loadActiveConfigSet('model_name',
'sl_config_ert.m');
获取一个参数设置的帮助说明
如果我们不知道一个参数的具体含义是什么,可以在这个参数上边点击鼠标右键,这时候出来一个 What's This,点击的话,就可以出现该参数作用的简单说明。如果想要了解更多信息的话,可以点击 Show more information。
在Show more information里面,有两个比较有用的内容,一个是这个参数的名称,另一个是这个参数可以设置的值。知道这两个信息之后,我们就可以不用打开模型参数设置界面,直接在命令行输入命令来修改模型参数的设置,比如这边我们想要把Generate code only这个参数设为on,则只要在命令窗口输入:
set_param('model_name', 'GenCodeOnly', 'on')
二. 模型的通用设置
与代码生成相关的设置都在Code Generation里面,下面就介绍常用的一些对代码生成有影响的设置。
2.1. System target file
这个是选择系统目标文件,一般生成生成嵌入式系统代码的话,都是选ert.tlc。如果是生成autosar架构的应用层代码就选autosar.tlc。如果是生成window系统桌面能运行的代码的话,选择grt.tlc。实际应用中基本不是选ert.tlc就是autosar.tlc
2.2 Language
如果是要生成C代码就选C,要生成C++代码就选C++。现在基本都是生成C代码,但感觉以后如果要应用Adapt AUTOSAR的话,就会生成C++代码了
2.3 Build process
如果我们仅仅是要生成代码,不需要后续编译的话,就勾选{Generate code only}。如果不勾选这个的话,生成玩代码就会自动运行makefile进行编译,如果生成的代码是要配合别的代码文件一起使用的话,编译基本都是报错的,所以这边推荐都是勾选上{Generate code only}
{Package code and artifacts}这个选项如果勾上的话,会把生成的代码打包成一个压缩文件。
{Toolchain}是选择编译代码时需要用到的编译器,如果只是仅仅生成这个模块的代码,编译是后面有专门的编译环境的话,这边选"Automatically locate an installed toolchain"就可以了,最近版本的matlab已经默认了LCC的编译环境,可以保证Stateflow的代码生成,比较老的matlab版本是需要自己装一个编译器,比如MinGW或VS之类的才能保证Stateflow能正常生成代码。
2.4 Prioritized objectives
这个可以选择代码生成时,如果一些规则有冲突的话,按照哪种优先级来生成代码。比如如果按照下图来选择的话,就是MISRA C规范优先级最高,为了保证生成的代码能满足MISRA C规范,会牺牲掉ROM以及RAM的经济性以及执行效率。这个可以根据实际需求来选择。这个不会影响实际功能,所以如果没有这方面讲究的话,不选也无所谓
2.5 Check model before generating code
这个如果选"on"的话,会在生成代码前做一遍模型检查。这个一般都会选off,否则每次生成代码前都做一遍模型检查很浪费时间。
三. 模型优化设置
3.1 Default parameter behavior
这个选项表示默认的参数行为类型,可以选"Inline"和"Tunable"。"Inline"表示生成代码时直接用这个参数的值,"Tunable"表示会有这个参数的变量定义,以保证代码实际运行时,可以修改这个参数的可能。我们来看一下区别。
对于这个Unit Delay模块的初始值,我们设置了一个参数init_value,并且把值设为1。
下面是"Inline"设置生成的代码,初始化的时候,直接用的是1这个值,而没有体现出任何实际的参数。也就是说这个初始值就固定为1了。
下面是"Tunable"生成的代码,初始化的时候是给了一个全局变量,这个全局变量的值是1,但是因为有了全局变量,在代码运行的时候是可以把这个值标定为其他值的,这也就是Tunable的含义。
值得注意的是,这个设置仅对没有明确参数类型的变量生效。如果你对一个参数定义为了之前说的参数对象,并且属性是ExportGlobal,那这个参数一定是Tunable的,不会受这个选项的影响。
3.2 Remove root level I/O zero initialization和Remove internal data zero initialization
这两个选项都是表示是否要生成初始值为0的变量初始化赋值,因为一般编译器对于一个变量默认的初始值就是0,所以可以对初始值是0的变量不进行初值赋值。勾选{Remove root level I/O zero initialization}表示模型的输入和输出的初始值如果是0的话,就不生成初始化赋值。勾选{Remove internal data zero initialization}的话,就表示模型内部变量的初始值如果是0的话,就不生成初始化赋值。
下面看一下{Remove internal data zero initialization}勾选与否的具体例子。
勾选的情况下,初始化函数里没有任何内容,因为内部变量的初始值都是0
不勾选的情况下,即使内部变量的初始值是0,也会有赋值语句生成了。
3.3 Optimization levels
这里面的设置是生成代码时的优化设置。其中{Level}可以有3个选择,"Minimum"表示不进行任何优化,这个可以最大限度的保证代码和模型的可追溯性。"Maximum"表示进行最大程度的优化,这时生成的代码会优化一些模型的细节。另外一个选项是折中的选择。
Priority也可以有3个选择,看要哪个项目的优先级最高,分别是平衡RAM的用量和执行速度,最大的执行速度和最小的RAM用量
另外也可以通过勾选{Specify custom optimizations}指定里面具体的一些细节,这些细节的内容和上面选项对应关系如下图,这边就先不详细解释每一个选项的作用了,关心的同学可以查看matlab的帮助,或者后面专门写一遍介绍这个的文章。
模型优化设置里面还有一些高级的设置,点击三个点就能看到
3.4 Loop unrolling threshold
表示要用到for循环的维度阈值,这里设为5,表示维度超过5的话,就会用到for循环。
比如我们把这个模型的输入输出维度设为3
把{Loop unrolling threshold}设为4,那么生成的代码如下,都是一个维度一个维度计算的。
把{Loop unrolling threshold}设为2,因为维度3大于2,这时就会生成for循环了。
3.5 Optimize using the specified minimum and maximum values
表示生成的代码是否会根据变量指定的范围做优化。
比如有一个除法,我们设置alpha1的范围是[1,1.25],我们设置了会生成零除保护的代码
如果不勾选这个选项,那么生成的代码如下,如果除数为0,则结果等于uint32的最大值
如果勾选了这个选项,那么由于除数的范围不包括0,那么就不会生成零除保护的代码
3.6 Inline invariant signals
勾选这个选项后,对于不变的变量,会直接用其实际的值
比如对于如下模型
勾选{Inline invariant signals}后,生成的代码如下,变量offset_const没有生成,而是直接使用了其不变的值9
不勾选勾选{Inline invariant signals}生成的代码如下,仍然会生成变量的名称,其值在初始化的时候被赋值为9
3.7 Remove code from floating-point to integer conversions that wraps out-of-range values
勾选这个选项后,当浮点数转定点数时,就是直接转换,不会生成多余的保护代码,比如对于如下模型,由浮点数转为uint8类型
当不勾选这个选项时,会生成当浮点数小于0时,取反的代码
当勾选这个选项时,就直接把浮点数转为定点数
其实对于浮点数转定点数比较好的做法是,先把浮点数限制到定点数的范围之类,然后再转定点数,这样勾选这个选项也不会有问题,生成的代码也比较简洁。
3.8 Remove code that protects against division arithmetic exceptions
勾选这个选项后,就不会再生成零除保护的代码了。
对于零除的可能,推荐直接在模型中体现如果除数是0的时候的处理,而不是靠这个选项来保证不会发生零除。
四. 模型代码报告设置
勾选{Create code generation report}的话,在代码生成完成后会生成一份报告。
4.1 Open report automatically
生成完报告后会自动打开报告
4.2 Generate model Web view
同时会生成一份网页版的模型,如果要把模型分享给没有matlab的人,可以使用这个选项
4.3 Static code metrics
会生成一份代码静态统计的报告
4.4 Code-to-model
可以通过代码直接连接到模型,比如点击这个链接就可以直接跳到生成这段代码的模型处
4.5 Model-to-code
可以通过模型跳转到其生成得到代码处。选中一个模型,点击鼠标右键,选择C/C++ Code/Navigate To C/C++ Code 就可以跳转到其生成得到代码处。
4.6 Traceable Simulink blocks, Traceable Stateflow objects, Traceable MATLAB functions
支持Simulink模块,Stateflow和Matalb function的代码和模型之间的追溯
对于模型生成的报告,这些选项都是推荐勾选的。
发现模型设置的内容好多啊,下一篇文章再继续介绍剩下的模型设置的作用。