MBD之代码生成——自定义存储类

时间:2024-05-19 13:57:30

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

A = Simulink.Signal

B = Simulink.Parameter

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

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

MBD之代码生成——自定义存储类

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

          

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

MBD之代码生成——自定义存储类

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

MBD之代码生成——自定义存储类部分生成的代码如下

 

MBD之代码生成——自定义存储类

 

MBD之代码生成——自定义存储类

 

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

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

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

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

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

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

                                       

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

 

 

    首先我们先来看下Simulink默认的Simulink Package是怎样的

    命令行输入:cscdesigner,打开Custome Storage Class Designer

MBD之代码生成——自定义存储类

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

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

MBD之代码生成——自定义存储类

 

自定义存储类

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

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

MBD之代码生成——自定义存储类

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

MBD之代码生成——自定义存储类

 

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

 

MBD之代码生成——自定义存储类

 

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

MBD之代码生成——自定义存储类

 

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

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

MBD之代码生成——自定义存储类

 

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

 

 

 

 

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

MBD之代码生成——自定义存储类

 

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

MBD之代码生成——自定义存储类

    在Comment中可添加注释

MBD之代码生成——自定义存储类

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

 

自定义存储类的应用

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

MBD之代码生成——自定义存储类

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

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

MBD之代码生成——自定义存储类

   

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

 

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

 

MBD之代码生成——自定义存储类

 

MBD之代码生成——自定义存储类

 

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

1、自动添加了#pragma语句

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

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

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

 

 

    好了,以上只是举了一个比较简单的应用,cscdesigner还有不少选项可以进行自定义设置,有兴趣的小伙伴可以通过help文档再慢慢深入研究一下。

如果你觉得本文能够帮助到你,请长按识别下方二维码关注公众号,另有知乎同名专栏同步更新,欢迎分享转载

文章中的示例模型或代码均可联系小编免费获取,若对文章有任何意见或建议,欢迎在文章下方留言,也可进入公众号选择‘联系方式’,加小编微信进行交流

                                                             MBD之代码生成——自定义存储类