分享

[转载]基于模型开发之代码集成(三)

 stevin_lib 2018-07-19

 经过前一篇文章的介绍,基本上Matlab的LegacyCodeTool能干什么有个大概的了解。下面对LegacyCodeTool的命令和参数集做一些介绍。

 

LegacyCodeTool的命令集如下:

legacy_code('help')
specs = legacy_code('initialize')
legacy_code('sfcn_cmex_generate',
specs)
legacy_code('compile',
specs, compilerOptions)
legacy_code('slblock_generate', specs, modelname)
legacy_code('sfcn_tlc_generate',
specs)

legacy_code('generate_for_sim', specs, modelname)
legacy_code('rtwmakecfg_generate',
specs)
legacy_code('backward_compatibility')

含义分别如下:

1、legacy_code('help')顾名思义打开legacy的Help文档。

 

2、specs = legacy_code('initialize'),生成并初始化一个specs参数集变量,后面会详细介绍该参数集。

 

3、legacy_code('sfcn_cmex_generate', specs)根据specs配置参数生成相应的s-fuction源文件。

 

4、legacy_code('compile', specs, compilerOptions),根据specs配置参数对s-fuction源文件进行编译和关联,形成可执行文件,compilerOptions指的是编译器的选项,如果编译器没有提供附加选项可以为空,也可以根据不同的编译器进行相应的参数指定格式为'-DCOMPILE_VALUE1=1',或者有多个参数时格式为{'-DCOMPILE_VALUE1=1', '-DCOMPILE_VALUE2=2', '-DCOMPILE_VALUE3=3',...}

 

5、legacy_code('slblock_generate', specs, modelname),根据specs配置参数将编译后的s-fuction执行文件封装成simulink模块,并添加到当前名称为modelname指定的模型中,如果没有将名称为modelname的模型将生成一个名称为modelname的模型文件,里面包含相应封装好的s-fuction模块。当然如果这里不指定modelname,也将会新建一个默认的模型文件。

 

6、legacy_code('sfcn_tlc_generate', specs)可以根据specs配置参数生成相应的tlc文件,通过对生成的tlc文件应用,可以订制代码集成到s-fuction中的模式进而模型的加速仿真或者自动代码生成时控制生成的代码形式、分布等。

 

7、legacy_code('generate_for_sim', specs, modelname),根据specs配置参数,一步完成s-fuction的代码生成、编译、模块封装,基本上等同于3、4、5条命令一起执行,当specs配置参数中的Options.useTlcWithAccel配置为1(真)时,也一并执行了第6条命令,生成了用于加速仿真的tlc文件。

命令中的第三个参数modelname的用法和第5条命令相同。

 

8、legacy_code('rtwmakecfg_generate', specs)本命令仅和自动代码生成simulink coder相关,会生成一个 rtwmakecfg.m文件,可以根据其中的一些接口函数对代码生成的过程进行控制(这里就涉及到另外的话题了)。

 

9、legacy_code('backward_compatibility')该命令自动更新legacy_code的相关语法使得LegacyCodeTool可以向后兼容。

 

在这些命令中,如果仅是将代码集成到模型中,那么常用的命令也就是2、3、4、5、7。使用的顺序为2-(配置参数集)-3-4-5或者2-(配置参数集)-7;

 

下面说一下参数应该怎么配置,根据前面讲的使用第2条命令可以生成一个参数集变量,名称是可以自己定义的,只要在matlab输入相应格式的命令,既可以获得如下结构的参数集变量。

              SFunctionName: ''
InitializeConditionsFcnSpec: ''
              OutputFcnSpec: ''
               StartFcnSpec: ''
           TerminateFcnSpec: ''
                HeaderFiles: {}
                SourceFiles: {}
               HostLibFiles: {}
             TargetLibFiles: {}
                   IncPaths: {}
                   SrcPaths: {}
                   LibPaths: {}
                 SampleTime: 'inherited'
                    Options: [1x1 struct]

其中,源文件和头文件是必须要定义的——HeaderFiles: {}; SourceFiles: {};在指定文件的时候可以使用绝对地址也可以使用相对地址;

 

此外SFuction的名称也一定要定义 SFunctionName: '';

 

初始条件函数、输出函数、启动函数、停止函数四个中至少定义其中的一个:InitializeConditionsFcnSpec: ''; OutputFcnSpec: ''; StartFcnSpec: ''; TerminateFcnSpec: '';

稍后详细解释函数具体的定义格式。

再看剩下几个可以选择进行配置的参数项,IncPaths: {};SrcPaths: {};LibPaths: {};分别可以指定和程序相关联的头文件地址,源文件地址,库文件地址; Legacy Code Tool 在处理相应的代码时除了会在当前工作文件夹,以及Matlab已定义的搜索文件夹内进行相关文件的搜索,也会在IncPaths: {};SrcPaths: {};LibPaths: {};定义的文件夹内进行搜索。(地址都可以使用相对地址或者绝对地址,同样采用命令行直接赋值的方式进行设置。)

 

( HostLibFiles: {};和 TargetLibFiles: {}应该也是类似的功能,但目前我还没用过,根据Help文件说的是一个是主编译器的相关库文件,一个是目标编译器的相关库文件,等后续有时间我再弄明白,会再写出来)。

 

接下来是 SampleTime:,其默认值为'inherited',即后续生成的s-fuction及其模块都将继承调用它的模型或函数的仿真采样时间,当然也还有其他两个选项,一个是'parameterized',可以将采样时间参数化,通过C-MEX的API函数进行设定;另外一个是指定固定的采样时间,采样时间的表述格式需要参看Help中Specify Sample Time一章。

这里需要注意的是,SampleTime这个参数的设置,必须其他的参数项赋值完之后,最后进行,否则可能会出现异常。

 

另外,还有一个参数设置项,Options,如果已经通过第2条命令定义了参数集变量,例如lctspc,则可以直接在命令行中输入:

 lctspc.Options

按下回车键后,可以看到

 ans =

                          isMacro: 0
                       isVolatile: 1
         canBeCalledConditionally: 1
                  useTlcWithAccel: 1
                         language: 'C'
                 singleCPPMexFile: 0
    supportsMultipleExecInstances: 0

 

以上分别为选项参数的默认值,如果集成的代码时C++,则需要将language定义为'C++';

如果需要集成的函数为C语言的宏定义函数则 isMacro需要定义为真(1),默认时为(0);

 

其他几个选项和s-fuction处理函数的方式有关,一般情况下保持默认即可,此处不展开解释(需要了解可以看考Help文件),下一次将详细介绍初始条件函数、输出函数、启动函数、停止函数具体的定义格式。

 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多