存储过程定义时间变量_MBD之代码生成——自定义存储类

以下平台同步更新,喜欢的朋友欢迎收藏

知乎专栏:汽车电控杂谈微信公众号:AutoGeeker


使用过Simulink代码生成的童鞋都知道,在进行代码生成的时候,需要在模型数据字典或WorkSpace中对模型中的信号、参数进行定义,如:

A = Simulink.Signal

B = Simulink.Parameter

A是信号,一般用于信号线命名并进行关联,B是参数一般用于Constant、Gain、Saturation等模块中的参数设置。

对上面的SignalParameter类型我们可选择不同的存储类,实现全局变量、局部变量、外部引用变量等不同类型变量的定义

02cfe5a82af1fb29528da451036d2fc4.png

下面以'ExportToFile'这个存储类为例,来展开今天的内容。

我们先来看一下,如果把A设置为一个uint16的变量,且希望将此变量定义在单独生成的一个.c文件中,对应的头文件中变量声明有extern前缀,可供其他c文件包含调用。

f3a9dde7bb7380b234cbd386ae2a541b.png

用一个最简单的模型,A和C为全局变量,都在Global.c中进行定义(上面对话框中指定头文件和源文件名称,或用脚本方式实现)

cee49f58d99dceb1f7725f3b3c47f04e.png

部分生成的代码如下

c6777cc47f0d93f216522e5bce39e4ee.png

d56d9f91958ddf153e17ba07746758b2.png

好了,上面代码和文件结构,似乎已大功告成,基本能满足很多小伙伴的需求了。


然而在实际开发过程中,还会有各种‘花式’需求,例如:

1、希望生成的代码中,某些全局变量定义前有#pragma DATA_SEG ...的语句来指定变量在内存中存放的位置/片段(section)

2、某部分变量能统一存放在独立的.c /.h中

3、某部分变量定义/声明之前添加必要的注释语句

。。。我相信,实际使用Embedded Coder进行代码生成过程中,不管是出于软件集成要求,还是项目规范要求,对生成的代码我们希望能有一定的‘修饰’。上面各种需求,如果光使用Simulink Package的话是不能满足所有需求的,这时候就需要我们使用自定义Package并自定义存储类来实现。

上面写了那么多都是铺垫,下面才开始今天的主题


首先我们先来看下Simulink默认的Simulink Package是怎样的命令行输入:cscdesigner,打开Custome Storage Class Designer

b10cdb217015ad0f0b5dbba7f01064b4.png

package选择Simulink,我们看到是只读模式,下面的存储类并不能修改,也就是说只要用Simulink默认的Simulink.Signal和Simulink.Parameter对数据进行定义时,模板已经固定,并不能在生成过程中随意定制。

下图CSC对话框右侧的Pseudocode preview中可预览代码生成的格式

e9b465ed4947c29d6385d8c4818c9542.png
  • 自定义Package

首先从下面MATLAB安装路径中拷贝文件+SimulinkDemos,重新命名,例如重命名为+MyPackage,+号不能省。

如果把这个拷贝的+MyPackage 文件放在其他路径下,就需要将此路径添加到MATLAB的搜索路径中,为了方便我们可以直接放在dataclasses当前这个文件夹下,就不需要在做处理了。

da0dd1a28fbedfc5e45c145cc8b782a5.png

打开+MyPackage文件,有ParameterSignal相关的两个文件,文件中又有各自的Parameter.mSignal.m文件,我们需要修改这两个.m文件。

3332bc677d8c2000a9b07684f8215aa8.png

Signal.m为例,找到下图所示默认被注释掉的代码

881abcbf98b17fccd052e86566017b04.png

packageName替换成你自定义的Package名称,例如我们使用的是MyPackage,并将次method ...end代码取消注释,如下图:

f0681528cd0f0b59348bc9992abecebb.png

同理把Parameter.m中注释掉的代码也改成这样,完成更改后命令行输入: cscdesigner('MyPackage')

重新打开cscdesigner时,我们可以看到已经多了一个我们自定的Package了

3c80b09a8c656e56c61719ab0946568f.png

下面就是在我们自定义的Package中进行存储类的自定义

  • 自定义存储类

首先我们先新建一个Memory section,如下图:

aafce232003b652fa2f09ba60b84cc79.png

回到Custom Storage Class,新建一个名叫‘ExportGlobalFile_SEG1’的存储类,我们可以将次存储类设置成如下(这里只演示一个只对Signal的自定义存储类,Parameter类型的还是使用Simulink Package和默认的存储类)

b48044849c50e257e777156f66416abd.png

在Comment中可添加注释

f26f3daa6942a8fefa8385ba435f0788.png

保存设置,退出cscdesigner,至此已完成了一个自定义Package,自定义存储类的操作,接下来就可以在模型中使用了

  • 自定义存储类的应用

回到文章开头我们使用的模型,我们需要对A和C两个Signal重新进行定义,这里我们直接用命令行实现对Signal的定义,需要使用A= MyPackage.Signal 这样的形式:

a95da2885b67fc154ed781e08b0ec952.png

再对A和C两个Signal进行其他项的设置,Storage Class这里就可以选择上面自定义的存储类ExportGlobalFile_SEG1

因为上面自定义存储类的时候我们已经默认指定了头文件和源文件,所以这里就不需要再进行手动设置了

a33a89a88c9490a15578d29628695e20.png

自定义存储类的使用和Simulink默认自带的存储类使用基本一致,这里就不在赘述。


我们来看下最终生成的代码如何呢

506d960ba431cac0dd554f41bb010522.png

18f5660543ba98a0551a643b9ff99356.png

与使用Simulink.Signal相比,我们使用自定义Package并自定义存储类,最终实现了:

1、自动添加了#pragma语句

2、变量定义时即进行初始赋值

3、添加统一注释:/* Gloabl Signal Declaration data section SEG1*/

3、不需要手动填写头文件和源文件名称,即可将指定变量自动生成到Global.c/.h

好了,以上只是举了一个比较简单的应用,cscdesigner还有不少选项可以进行自定义设置,有兴趣的小伙伴可以通过help文档再慢慢深入研究一下,也可后台联系小编,一起交流讨论!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值