wdatepicker设置初始时间_Simulink模型自动代码生成详解(41)——模型设置的影响...

本文摘要:

这篇文章主要介绍Simulink模型参数设置的不同,对生成代码的影响。

选择菜单MODELING,然后点击Model Settings,就可以打开模型参数设置的界面。

3f400a23b9f1f9ed834a1443c21c141f.png

在模型参数设置界面有两个值得注意的地方,一个是搜索条,如果你知道参数的名称或关键词,可以直接在搜索栏中输入,来直接搜索想要设置的参数。另一个是每一个界面下面都会有三个点,这个里面隐藏了一些高级设置的参数,点开的话,可以看到更多的设置。

b863c1d467258c0cfc6beb516a92d5ec.png

一. 关于模型参数设置的一些小技巧

  1. 保存和读取一个模型的参数设置

    如果我们把一个模型的参数按照我们想要的情况都设置好了,那之后我们又需要新建一个模型,我们自然不想要再手动的去设置一遍参数。matlab提供了一对函数,Simulink.BlockDiagram.saveActiveConfigSet 和Simulink.BlockDiagram.loadActiveConfigSet,分别是保存一个模型的当前设置为一个m文件,以及把模型参数按照之前保存的配置文件进行设置。这样我们就可以方便的保存和读取模型的参数设置。这两个函数的参数都是2个,第一个是模型名,第二个是参数配置的m文件名。比如

    Simulink.BlockDiagram.loadActiveConfigSet('model_name',

    'sl_config_ert.m');

  2. 获取一个参数设置的帮助说明

    如果我们不知道一个参数的具体含义是什么,可以在这个参数上边点击鼠标右键,这时候出来一个 What's This,点击的话,就可以出现该参数作用的简单说明。如果想要了解更多信息的话,可以点击 Show more information。

    b8a4ea8086931efe87bc72041b2efccc.png  7987f6e1cfcdddfc8b6b72a5246fefd1.png

    在Show more information里面,有两个比较有用的内容,一个是这个参数的名称,另一个是这个参数可以设置的值。知道这两个信息之后,我们就可以不用打开模型参数设置界面,直接在命令行输入命令来修改模型参数的设置,比如这边我们想要把Generate code only这个参数设为on,则只要在命令窗口输入:

    set_param('model_name', 'GenCodeOnly', 'on')

    6a004dda1ccd2876240838201e7a09dd.png

二. 模型的通用设置

与代码生成相关的设置都在Code Generation里面,下面就介绍常用的一些对代码生成有影响的设置。

cc053b096d22e3711467b9bfed46de97.png

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的经济性以及执行效率。这个可以根据实际需求来选择。这个不会影响实际功能,所以如果没有这方面讲究的话,不选也无所谓

5986e3c76888abbb5d4d1bf675089db1.png

2.5 Check model before generating code

这个如果选"on"的话,会在生成代码前做一遍模型检查。这个一般都会选off,否则每次生成代码前都做一遍模型检查很浪费时间。

三. 模型优化设置

21945977ce17cbabd15c41f0181a7176.png

3.1 Default parameter behavior

这个选项表示默认的参数行为类型,可以选"Inline"和"Tunable"。"Inline"表示生成代码时直接用这个参数的值,"Tunable"表示会有这个参数的变量定义,以保证代码实际运行时,可以修改这个参数的可能。我们来看一下区别。

对于这个Unit Delay模块的初始值,我们设置了一个参数init_value,并且把值设为1。

cf4bec94eeacd3c0adb896ed15a79005.png

e78d71f2aa4cbfe366b18bbc12d9d18e.png

下面是"Inline"设置生成的代码,初始化的时候,直接用的是1这个值,而没有体现出任何实际的参数。也就是说这个初始值就固定为1了。

a6be330c9d894d6014082a2b408671b5.png

下面是"Tunable"生成的代码,初始化的时候是给了一个全局变量,这个全局变量的值是1,但是因为有了全局变量,在代码运行的时候是可以把这个值标定为其他值的,这也就是Tunable的含义。

386b317f23c9c2bdbf24c60f15ee7a3f.png

值得注意的是,这个设置仅对没有明确参数类型的变量生效。如果你对一个参数定义为了之前说的参数对象,并且属性是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

9fdbaeed3ccb78773005988d54bef95b.png

不勾选的情况下,即使内部变量的初始值是0,也会有赋值语句生成了。

67075c8ccfce7de7479da9980b60c169.png

3.3 Optimization levels

这里面的设置是生成代码时的优化设置。其中{Level}可以有3个选择,"Minimum"表示不进行任何优化,这个可以最大限度的保证代码和模型的可追溯性。"Maximum"表示进行最大程度的优化,这时生成的代码会优化一些模型的细节。另外一个选项是折中的选择。

d9b59646a609fed6d1060723167f63f9.png

Priority也可以有3个选择,看要哪个项目的优先级最高,分别是平衡RAM的用量和执行速度,最大的执行速度和最小的RAM用量

5b3afb4f0ffae36b3c81c75a93777e46.png

另外也可以通过勾选{Specify custom optimizations}指定里面具体的一些细节,这些细节的内容和上面选项对应关系如下图,这边就先不详细解释每一个选项的作用了,关心的同学可以查看matlab的帮助,或者后面专门写一遍介绍这个的文章。

6d99e02ef4f69df39c6b8313c99fb0c7.png

模型优化设置里面还有一些高级的设置,点击三个点就能看到

968de4c488f9fd6c9f60312911eda875.png

3.4 Loop unrolling threshold

表示要用到for循环的维度阈值,这里设为5,表示维度超过5的话,就会用到for循环。

比如我们把这个模型的输入输出维度设为3

0233e43daefd658b738e87834b5f61d1.png

把{Loop unrolling threshold}设为4,那么生成的代码如下,都是一个维度一个维度计算的。

4ac4aad737f75e9563cb7d51c55e4e1c.png

把{Loop unrolling threshold}设为2,因为维度3大于2,这时就会生成for循环了。

4e729985030fab5adbf3e71cd34638fa.png

3.5 Optimize using the specified minimum and maximum values

表示生成的代码是否会根据变量指定的范围做优化。

比如有一个除法,我们设置alpha1的范围是[1,1.25],我们设置了会生成零除保护的代码

707a33c2eeafe8218414f96b902e2556.png

如果不勾选这个选项,那么生成的代码如下,如果除数为0,则结果等于uint32的最大值

4fb5d1b0db8ba7edeebe196c4fb83a91.png

如果勾选了这个选项,那么由于除数的范围不包括0,那么就不会生成零除保护的代码

370a3ae2571ae84366b136cd01a0b89d.png

3.6 Inline invariant signals

勾选这个选项后,对于不变的变量,会直接用其实际的值

比如对于如下模型

92ec2c30f2bd6c65a3699ef1a960406a.png

勾选{Inline invariant signals}后,生成的代码如下,变量offset_const没有生成,而是直接使用了其不变的值9

a53f02bb7787e680fd372350a5722bdd.png

不勾选勾选{Inline invariant signals}生成的代码如下,仍然会生成变量的名称,其值在初始化的时候被赋值为9

2e63bf0622dc7c297346263eece1b3ec.png

c0ce3ddbbb9988c108ab3070a9a22e5e.png

3.7 Remove code from floating-point to integer conversions that wraps out-of-range values

勾选这个选项后,当浮点数转定点数时,就是直接转换,不会生成多余的保护代码,比如对于如下模型,由浮点数转为uint8类型

85bcd44fac9f44a12d2a15445997c40e.png

当不勾选这个选项时,会生成当浮点数小于0时,取反的代码

e6b85b8fa3de97f577ab4b38055505a7.png

当勾选这个选项时,就直接把浮点数转为定点数

3c9e9fb19e212c12638a6af13eede7fa.png

其实对于浮点数转定点数比较好的做法是,先把浮点数限制到定点数的范围之类,然后再转定点数,这样勾选这个选项也不会有问题,生成的代码也比较简洁。

3.8 Remove code that protects against division arithmetic exceptions

勾选这个选项后,就不会再生成零除保护的代码了。

对于零除的可能,推荐直接在模型中体现如果除数是0的时候的处理,而不是靠这个选项来保证不会发生零除。

四. 模型代码报告设置

6e87135416bf08f88f30050362af2448.png

勾选{Create code generation report}的话,在代码生成完成后会生成一份报告。

4.1 Open report automatically

生成完报告后会自动打开报告 

4.2 Generate model Web view

同时会生成一份网页版的模型,如果要把模型分享给没有matlab的人,可以使用这个选项

4.3 Static code metrics

会生成一份代码静态统计的报告

30a3cdbd527d2aeabddd4447b571ba6a.png

4.4 Code-to-model

可以通过代码直接连接到模型,比如点击这个链接就可以直接跳到生成这段代码的模型处

d1a025a49b4e6640c3385204130ee6a7.png

4.5 Model-to-code

可以通过模型跳转到其生成得到代码处。选中一个模型,点击鼠标右键,选择C/C++ Code/Navigate To C/C++ Code 就可以跳转到其生成得到代码处。

67916b49e0f40bdb870503d1d4c9dda6.png

4.6 Traceable Simulink blocks, Traceable Stateflow objects, Traceable MATLAB functions

支持Simulink模块,Stateflow和Matalb function的代码和模型之间的追溯

对于模型生成的报告,这些选项都是推荐勾选的。

发现模型设置的内容好多啊,下一篇文章再继续介绍剩下的模型设置的作用。

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值